用于矩阵标记的MATLAB代码

时间:2014-04-12 17:09:13

标签: matlab image-processing signal-processing

我在编写matlab代码的代码时遇到了麻烦,无法对二进制矩阵执行标记。在我的代码中,我将当前元素的值与其顶部,左上角和左上角的值进行比较,如果值匹配,则我给元素指定相同的标签。

代码如下:

clc; clear all; close all; tic;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

M=10; N=20;

I_b=[
     0     1     0     0     0     1     0     0     0     0     1     0     0     0     0     0     1     0     0     1
     0     0     1     1     0     1     0     0     1     1     1     0     0     0     0     0     1     1     0     0
     1     0     0     1     1     0     0     1     0     0     0     0     0     1     1     0     1     1     1     1
     0     1     0     0     0     1     0     0     0     0     0     0     0     0     1     0     0     0     1     0
     0     0     0     0     0     0     0     1     0     0     0     1     0     1     0     1     0     0     1     0
     0     1     1     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     1     0
     1     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     1     0     1
     0     0     0     1     0     1     0     1     1     0     0     0     1     0     0     0     0     1     1     0
     0     0     1     0     0     0     0     1     0     0     0     0     0     0     1     0     0     1     0     0
     0     1     1     1     1     0     0     1     1     0     1     0     0     0     0     1     0     1     1     1  
];

[ID]=UnionFind(I_b,M,N);

I_b

ID

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
toc;




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [ID] = UnionFind(I_b, M, N)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ID=reshape(1:1:M*N,M,N);

for i=2:1:M*N

        if(I_b(i)==I_b(i-1))

            ID(i)=ID(i-1);

        elseif (i>M)

            if(I_b(i)==I_b(i-M))

                ID(i)=ID(i-M);

            end

        elseif (i>(M+1))

            if (I_b(i)==I_b(i-1-M))

                ID(i)=ID(i-1-M);

            end

        end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

运行此代码时,您会注意到零的某些部分和一个有多个标签,即使它们已连接,因此必须具有相同的标签。

请查看此代码吗?

1 个答案:

答案 0 :(得分:0)

在遍历期间,当两个不同标记的区域合并到一个区域时,您(至少)不处理这种情况。你也有包裹I_b(i - 1)的错误。请改用内置函数bwlabel