【问题标题】:Connected components recursive function in MATLABMATLAB中的连通分量递归函数
【发布时间】:2016-11-09 16:30:52
【问题描述】:

我是 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

这工作了几个小时,没有任何反应。我无法修复递归部分!这可能是因为我的编程水平很差。一点帮助会很棒!

谢谢

【问题讨论】:

标签: matlab image-processing recursion


【解决方案1】:

您的问题是 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

【讨论】:

  • 谢谢,这是我错过的一点。但不幸的是,我的问题仍然存在。
  • @Burak 有趣。我在我生成的示例图像上尝试了这个并且它有效,但也许我错过了一些东西。你有一些失败的输入吗?
  • 我刚刚发现我错过了 BI(i,j) 和 LI(i,j) 都必须等于 0 !再次感谢您。
  • 所以你将图像标记在BI == 0?这与我的假设相反。
  • 我的错误 :) 如果图像是黑色的,我将对其进行标记。所以,是的,它必须像 BI == 0 。
猜你喜欢
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多