Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中的连通分量递归函数_Matlab_Image Processing_Recursion - Fatal编程技术网

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

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