MATLAB中的连通分量递归函数
我是MATLAB新手,我正在尝试实现连接组件算法。以下是代码:MATLAB中的连通分量递归函数,matlab,image-processing,recursion,Matlab,Image Processing,Recursion,我是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
% 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
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
这工作了几个小时,什么也没发生。我无法修复递归部分!可能是因为我编程水平差。一点帮助就好了
谢谢您的问题是MATLAB不通过引用传递函数参数。在
label
函数中修改LI
时,它不会更改创建为标签图像的全局LI
要更新标签图像,必须从函数中获取返回值:
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
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
您的问题是MATLAB不通过引用传递函数参数。在
label
函数中修改LI
时,它不会更改创建为标签图像的全局LI
要更新标签图像,必须从函数中获取返回值:
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
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
为什么不使用一些内置函数,如
bwconcomp
?谢谢,但我正在尝试实现此函数:)为什么不使用一些内置函数,如bwconcomp
?谢谢,但我正在尝试实现此函数:)谢谢,这是我错过的一点。但不幸的是,我的问题还是一样。@Burak有趣。我在我生成的一个示例图像上尝试了这个方法,效果很好,但可能我遗漏了一些东西。您是否有一些输入失败?我刚刚发现我遗漏了BI(I,j)和LI(I,j)都必须等于0!再次感谢您。您正在标记图像,其中BI==0
?这与我的假设相反。我的错误:)如果图像是黑色的,我就给它贴标签。所以,是的,它一定像BI==0。谢谢,这是我错过的一点。但不幸的是,我的问题还是一样。@Burak有趣。我在我生成的一个示例图像上尝试了这个方法,效果很好,但可能我遗漏了一些东西。您是否有一些输入失败?我刚刚发现我遗漏了BI(I,j)和LI(I,j)都必须等于0!再次感谢您。您正在标记图像,其中BI==0
?这与我的假设相反。我的错误:)如果图像是黑色的,我就给它贴标签。所以,是的,它一定像BI==0。