【问题标题】:Matrix in matlab?matlab中的矩阵?
【发布时间】:2012-01-04 05:55:33
【问题描述】:

我正在研究 Connected Components 标签,我的矩阵是:

 1     1     0     2     2     2     0     3
 1     1     0     2     0     2     0     3
 1     1     1     1     0     0     0     3
 0     0     0     0     0     0     0     3
 4     4     4     4     0     5     0     3
 0     0     0     4     0     5     0     3
 6     6     0     4     0     0     0     3
 6     6     0     4     0     7     7     7

现在,我想对其进行第二次扫描,为此我制作了以下代码:

for i=1:1:r
    for j=1:1:c
        if (bw(i,j)>=1) 

            if (i-1>0 & i+1<=r) 
                % if ( bw(i,j)~= bw(i-1,j) | bw(i,j)~= bw(i+1,j))
                if ( (bw(i,j)~= bw(i-1,j) & bw(i-1,j)>0))
                    bw(i,j)= min (bw(i-1,j),bw(i,j))
                elseif ((bw(i,j)~= bw(i+1,j) & bw(i+1,j)>0))
                    bw(i,j) = min(bw(i+1,j),bw(i,j));
                end
            end

            if (j-1>0 & j+1<=c) 
                if ( (bw(i,j)~= bw(i,j-1) & bw(i,j-1)>0))
                    bw(i,j) = min (bw(i,j-1),bw(i,j));
                elseif((bw(i,j)~= bw(i,j+1) & bw(i,j+1)>0))
                    bw(i,j) = min (bw(i,j+1),bw(i,j))  ; 
                end
            end

        end
    end
end
disp(bw);

但问题是,当我运行此代码时,我得到以下输出

 1     1     0     2     2     2     0     3
 1     1     0     1     0     2     0     3
 1     1     1     1     0     0     0     3
 0     0     0     0     0     0     0     3
 4     4     4     4     0     5     0     3
 0     0     0     4     0     5     0     3
 6     6     0     4     0     0     0     3
 6     6     0     4     0     7     7     7

我的结果中只有一个值发生变化(第 2 行,第 4 列),而我想要:

     1     1     0     1     1     1     0     3
     1     1     0     1     0     1     0     3
     1     1     1     1     0     0     0     3
     0     0     0     0     0     0     0     3
     4     4     4     4     0     5     0     3
     0     0     0     4     0     5     0     3
     6     6     0     4     0     0     0     3
     6     6     0     4     0     3     3     3

有人可以帮忙吗?我在哪里做错了?

【问题讨论】:

  • 问题回答完毕后请不要删除代码。

标签: matlab image-processing matrix


【解决方案1】:

乔纳斯的好解决方案。当我看到它添加时,我有点喜欢编码,我想我也会向你展示我的解决方案。希望它与您的原始代码更相似。

您犯的一个错误是假设此连接可以一次性完成。通常它不能,因为某些“蛇元素”的检测取决于您遍历矩阵的方式。因此,我添加了一个外部 while 循环。

 bw =[  1     1     0     2     2     2     0     3;
        1     1     0     2     0     2     0     3;
        1     1     1     1     0     0     0     3;
        0     0     0     0     0     0     0     3;
        4     4     4     4     0     5     0     3;
        0     0     0     4     0     5     0     3;
        6     6     0     4     0     0     0     3;
        6     6     0     4     0     7     7     7 ];


 %Set up matrix   
 [r,c] = size(bw);   

 %Zero pad border
 bwZ = [zeros(1,c+2);[zeros(r,1) bw zeros(r,1)];zeros(1,c+2)];

 %Iterate over all elements within zero padded border
 done=0;%Done flag 
 cc=1;  %Infinite loop protection
 while not(done) && cc<r*c
     done=1;cc=cc+1;
     for i=2:r+1
         for j=2:c+1
            %Point should be evaluated
            p = bwZ(i,j);
            if p >= 1
                %Pick out elements around active elements
                if bwZ(i-1,j)==0;ue=inf;else ue = bwZ(i-1,j); end;%Up element
                if bwZ(i+1,j)==0;de=inf;else de = bwZ(i+1,j); end;%Down element
                if bwZ(i,j-1)==0;le=inf;else le = bwZ(i,j-1); end;%Left element
                if bwZ(i,j+1)==0;re=inf;else re = bwZ(i,j+1); end;%Right element

                bwZ(i,j) = min([ue de le re]);
                %Set flag, if something has changed 
               if bwZ(i,j) ~= p
                    done = 0;
               end
            end
         end
     end
 end

 %Remove zero padding
 bw = bwZ(2:end-1,2:end-1)

输出:

bw =

 1     1     0     1     1     1     0     3
 1     1     0     1     0     1     0     3
 1     1     1     1     0     0     0     3
 0     0     0     0     0     0     0     3
 4     4     4     4     0     5     0     3
 0     0     0     4     0     5     0     3
 6     6     0     4     0     0     0     3
 6     6     0     4     0     3     3     3

【讨论】:

    【解决方案2】:

    如果不需要保留数字,您只需在原始图像上调用bwlabel

    newImage = bwlabel(originalImage>0);
    

    编辑

    这是另一个版本。它检查每个连接的组件以查看是否有另一个连接的组件接触它。如果是,则重新标记该连接的组件。

    %# nCC: number of connected components
    nCC = max(originalImage(:));
    
    for cc = 1:nCC
    %# check whether the component exists
    myCC = originalImage==cc;
    if any(any(myCC))
    
       %# create a mask to check for neighbors
       %# by creating a border of 1 pixel
       %# around the original label
       msk = imdilate(myCC,true(3)) & ~myCC;
    
       %# read all the pixel values under the mask
       neighbours = originalImage(msk);
    
       %# we're not interested in zeros, remove them
       neighbours = neighbours(neighbours > 0);
    
       if ~isempty(neighbours)
       %# set the label of all neighbours to cc
       originalImage( ismember(originalImage,neighbours) ) = cc;
       end
    end
    end
    

    【讨论】:

    • 不,我不想使用 bwlabel,我必须使用相应的算法和代码。另外,在成功实现连接组件标签的第一次扫描后,我不想使用 bwlabel。
    • @AyeshaKhan:我添加了另一个解决方案。
    • 谢谢,它正在工作..但它有点难以理解..你能详细说明一下吗?
    • @AyeshaKhan:我添加了一些解释。我建议您逐步浏览代码并显示例如变量“msk”作为图像,看看发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多