2016-11-09 66 views
0

我是MATLAB新手,我试图实现连接组件算法。这里是代码:MATLAB中的连接组件递归函数

% Binary image (BI)  
% Labelled image (LI) 
LI = zeros(r,c); 

n = 1; 
    for i = 2:r-1 
     for j = 2:c-1 
      if BI(i,j) && LI(i,j) == 0 
       label(i, j, n, BI, LI) 
       n = n + 1; 
      end 
     end 
    end 

和我的标签功能:

function label(x, y, n, BI, LI) 

LI(x,y) = n; 

    for i = x-1:x+1 
     for j = y-1:y+1 
      try 
       if BI(i,j) && LI(i,j) == 0 
        label(i, j, n, BI, LI) 
       end 
      catch 
       continue 
      end 
     end 
    end 

    end 

这工作几个小时,什么也没有发生。我无法修复递归部分!这可能是因为我的编程水平很差。一点帮助会很棒!

谢谢

+1

你为什么不使用一些内置的功能,如'bwconncomp'的https://www.mathworks.com/help/images/ref/bwconncomp .html – Eskapp

+1

谢谢,但我试试为了实现这个功能:) – Burak

回答

3

你的问题是,MATLAB不通过引用传递函数参数。当您在label函数中修改LI时,它不会更改您创建为标签图像的全局LI

要更新标签图像,你必须从你的函数返回值:

function LI = label(x, y, n, BI, LI) 

LI(x,y) = n; 

    for i = x-1:x+1 
     for j = y-1:y+1 
      try 
       if BI(i,j) && (LI(i,j) == 0) 
        LI = label(i, j, n, BI, LI); % update LI 
       end 
      catch 
       continue 
      end 
     end 
    end 

end 

现在label返回更新后的标签图像,你需要在每次调用label,如时间设置LI评论线之上,并在调用脚本:

% Binary image (BI)  
% Labelled image (LI) 
LI = zeros(r,c); 

n = 1; 
    for i = 2:r-1 
     for j = 2:c-1 
      if BI(i,j) && (LI(i,j) == 0) 
       LI = label(i, j, n, BI, LI); % update LI 
       n = n + 1; 
      end 
     end 
    end 
+0

谢谢,这是我错过了一点。但不幸的是我的问题依然如此。 – Burak

+0

@Burak有趣。我在我生成的示例图像上尝试了这一点,它可以工作,但也许有一些我错过了。你有一些输入失败? – beaker

+0

我刚刚发现我错过了BI(i,j)和LI(i,j)都必须等于0!再次感谢你。 – Burak