基于递归泛洪填充的Matlab图像斑点检测

基于递归泛洪填充的Matlab图像斑点检测,matlab,recursion,image-processing,computer-vision,flood-fill,Matlab,Recursion,Image Processing,Computer Vision,Flood Fill,我试图在Matlab中进行水滴检测。如何摆脱flood_fill()中的无限递归 由于无限递归,它被困在这个函数中。我该怎么做才能让它在正确的时间爆发 function flood_fill(I,u,v,label,W,H) if u >= 1 && u < W && v >= 1 && v < H && I(u,v) == 1 I(u,v) = label; flood_fill(I,u+

我试图在Matlab中进行水滴检测。如何摆脱flood_fill()中的无限递归

由于无限递归,它被困在这个函数中。我该怎么做才能让它在正确的时间爆发

function flood_fill(I,u,v,label,W,H)

if u >= 1 && u < W && v >= 1 && v < H && I(u,v) == 1
    I(u,v) = label;
    flood_fill(I,u+1,v,label,W,H);
    flood_fill(I,u,v+1,label,W,H);
    flood_fill(I,u,v-1,label,W,H);
    flood_fill(I,u-1,v,label,W,H);


end
end
功能泛光填充(I、u、v、标签、W、H)
如果u>=1&&u=1&&v
我现在看到了问题:您正在将
I
传递到函数中,但没有返回修改。MATLAB按值传递所有参数(句柄类除外)。这意味着函数可以更改其输入参数,而无需更改调用者工作区中这些矩阵的值。您需要修改
flood\u fill
函数以返回
I

另一个问题是,
blobs
是一个逻辑数组,将任何非零值赋给它会产生一个值1。您需要将其强制转换为其他类型,或者使用
+blob
进行双精度转换,或者如下所示的特定整数类型

这是正确的代码:

blobs = im2bw(imread('Week6Image.jpg'),0.1);
blobs = uint16(blobs); % or uint32 if you have many regions
[W, H] = size(blobs);
out = region_labeling(blobs,W,H);

function I = region_labeling(I,W,H)
label = 2;
for u = 1 : W
   %For loop vertical Axis
   for v = 1 : H
      if I(u,v) == 1
         I = flood_fill(I,u,v,label,W,H);
         label = label + 1;
      end
   end
end
end

function I = flood_fill(I,u,v,label,W,H)
if u >= 1 && u <= W && v >= 1 && v <= H && I(u,v) == 1
   I(u,v) = label;
   I = flood_fill(I,u+1,v,label,W,H);
   I = flood_fill(I,u,v+1,label,W,H);
   I = flood_fill(I,u,v-1,label,W,H);
   I = flood_fill(I,u-1,v,label,W,H);
end
end
blobs=im2bw(imread('Week6Image.jpg'),0.1);
blobs=uint16(blobs);%或者uint32,如果您有许多地区
[W,H]=大小(斑点);
out=区域_标记(斑点,W,H);
函数I=区域_标记(I,W,H)
标签=2;
对于u=1:W
%用于循环垂直轴
对于v=1:H
如果I(u,v)==1
I=洪水填充(I、u、v、标签、W、H);
标签=标签+1;
结束
结束
结束
结束
功能I=洪水填充(I、u、v、标签、W、H)

如果u>=1&&u=1&&v我现在看到了问题:您正在将
I
传递到函数中,但没有返回修改。MATLAB按值传递所有参数(句柄类除外)。这意味着函数可以更改其输入参数,而无需更改调用者工作区中这些矩阵的值。您需要修改
flood\u fill
函数以返回
I

另一个问题是,
blobs
是一个逻辑数组,将任何非零值赋给它会产生一个值1。您需要将其强制转换为其他类型,或者使用
+blob
进行双精度转换,或者如下所示的特定整数类型

这是正确的代码:

blobs = im2bw(imread('Week6Image.jpg'),0.1);
blobs = uint16(blobs); % or uint32 if you have many regions
[W, H] = size(blobs);
out = region_labeling(blobs,W,H);

function I = region_labeling(I,W,H)
label = 2;
for u = 1 : W
   %For loop vertical Axis
   for v = 1 : H
      if I(u,v) == 1
         I = flood_fill(I,u,v,label,W,H);
         label = label + 1;
      end
   end
end
end

function I = flood_fill(I,u,v,label,W,H)
if u >= 1 && u <= W && v >= 1 && v <= H && I(u,v) == 1
   I(u,v) = label;
   I = flood_fill(I,u+1,v,label,W,H);
   I = flood_fill(I,u,v+1,label,W,H);
   I = flood_fill(I,u,v-1,label,W,H);
   I = flood_fill(I,u-1,v,label,W,H);
end
end
blobs=im2bw(imread('Week6Image.jpg'),0.1);
blobs=uint16(blobs);%或者uint32,如果您有许多地区
[W,H]=大小(斑点);
out=区域_标记(斑点,W,H);
函数I=区域_标记(I,W,H)
标签=2;
对于u=1:W
%用于循环垂直轴
对于v=1:H
如果I(u,v)==1
I=洪水填充(I、u、v、标签、W、H);
标签=标签+1;
结束
结束
结束
结束
功能I=洪水填充(I、u、v、标签、W、H)


如果u>=1&&u=1&&v,我认为这不是无限递归。但它一定非常慢,可能只是花了很长时间,你认为它陷入了无限递归?但请注意,测试应该是
u,我将修改测试。就递归而言。Matlab抛出一个无限递归错误。Matlab中有递归深度的设置吗?啊,这很有意义。我认为它通常被限制在一个相当低的值。我真的会建议一个更好的算法,而不是调整递归限制。但是你可以用
set(0,'RecursionLimit',N)
来改变它。我不认为这是一个无限递归。但它一定非常慢,可能只是花了很长时间,你认为它陷入了无限递归?但请注意,测试应该是
u,我将修改测试。就递归而言。Matlab抛出一个无限递归错误。Matlab中有递归深度的设置吗?啊,这很有意义。我认为它通常被限制在一个相当低的值。我真的会建议一个更好的算法,而不是调整递归限制。但是您可以使用
设置(0,'RecursionLimit',N)
来更改它。我很感谢您的响应。我仍然有问题。我的输入图像只有20x15像素,我将递归深度限制设置为100000,但它仍然停留在那里。你认为我的测试可能有问题吗?@BrentVaalburg:你不应该改变递归限制。这里发布的代码对我有效,但速度很慢。内存不足。可能的原因是程序中的无限递归。水滴检测>泛光填充(第22行)错误I=泛光填充(I,u+1,v,标签,W,H)@布伦特瓦尔堡:你使用的代码和我在这里发布的完全一样吗?使用300像素的图像?不能抛出内存不足错误。我不明白这怎么会发生。你能用
blobs=ones(15,20)
试试吗?这很管用,也许我图像中的模式不知怎么把它扔进了一个奇怪的循环中?我很感激你的回答。我仍然有问题。我的输入图像只有20x15像素,我将递归深度限制设置为100000,但它仍然停留在那里。你认为我的测试可能有问题吗?@BrentVaalburg:你不应该改变递归限制。这里发布的代码对我有效,但速度很慢。内存不足。可能的原因是程序中的无限递归。水滴检测>泛光填充(第22行)错误I=泛光填充(I,u+1,v,标签,W,H)@布伦特瓦尔堡:你使用的代码和我在这里发布的完全一样吗?使用300像素的图像?不能抛出内存不足错误。我不明白这怎么会发生。你能用
blobs=ones(15,20)
试试吗?这很管用,也许我图像中的模式不知怎么把它扔进了一个奇怪的循环?