您的位置:首页 > 其它

基于贴标号算法的二值图像区域分割 面积计算

2016-11-12 20:39 387 查看
一、算法介绍

8 连通意义下的贴标号算法

输入图像: 2 值图像I(i,j) 1≤i≤I,1≤j≤J。

输出图像: 标号图像 L(i,j)1≤i≤I,1≤j≤J。

若干标记:

i 图像的行指标;

j 图像的列指标;

nl 用于存储现时刻图像中连通区域个数的变量;

T(k) 用于记录贴标号算法中间结果(反映合并过程的有关信息)的一维标号表。

算法步骤:

( 1)完成初始化操作:将 L(i,j)、 T(k)和 nl 清零,并置 i=1 和 j=1。

以下,从像素λ(1,1)处开始,如图 所示,按自上而下、从左到右的顺序

逐行处理每一个像素。

( 2)设现时刻的待处理像素为I(i,j)。



贴标号算法 1 按自上而下、从左到右的顺序扫描整幅图像

如果λ(i,j)=1,去( 3),否则置 L(i,j)=0,去( 4)。

( 3)如图所示,将现时刻待处理像素I(i,j)的邻域中已处理完毕的像素依次记

为 Xp, p=1,2,3,4,相应的标号值记为 lp, p=1,2,3,4。假定在{T(lp), lp ≠ 0, p=1,2,3,4}中共有 n 个不同的标号值出现。它们按升序重新被排列后变为 L1,...Ln。易证 n≤2。事实上,此时仅有 X1X2X3、 X1X2X4、 X1X3X4、 X2X3X4和 X1X2X3X4 等几种可能情况。用穷举法可证不论是那一种情况,均可推出 n≤2的结论成立。例如,对于 X1X2X3 中各个像素的值均不为零的情形,此时,因 X1、X2 和 X3 是互为连通的,故在前面的处理中已被赋予同一个标号,即有
n=1 成立。

当 n=0 时,去(3-1)。

当 n=1 时,去(3-2)。

当 n=2 时,去(3-3)。

(3-1) 此时,待处理像素属于一个新的连通区域。

置 nl ← nl+1, T(nl) ← nl, L(i,j) ← nl 后,去( 4)。

(3-2) 此时,待处理像素和一个已知区域相连通。

置 L(i,j) ← L1 后,去( 4)。

(3-3) 此时,待处理像素和两个已知区域相连通。

置 L(i,j) ← L1,并对满足

T(k) = L2, 2≤ k ≤nl

的所有 T(k),置 T(k) ← L1,即用较小的标号值合并和待处理像素相连通的所有

已知像素。然后,去( 4)。

( 4)如果全部像素被处理完毕,去( 5);否则,像素指针加 1,去( 2)。

( 5)更新标号表。即在不更动原有排列顺序的前提下,将 T(k), k=1,2,...nl 中的值按

照标号不间断的原则重新赋值。

( 6)根据新的标号表,更新标号图像 L(i,j), 1≤i≤I,1≤j≤J。即对所有

L(i,j),若 L(i,j) > 0,则置 L(i,j) ← T(L(i,j))。

二、实验程序与结果:



待处理图像
程序

%图像的面积测量
I=imread('二值化几何图.jpg');
I=im2bw(I);
imshow(I);
[m,n]=size(I);
L=zeros(m,n); %标号图像
T=[];%标号表
nl=0;%连通区域的个数
for i=2:m-1
    for j=2:n-1
        if I(i,j)==0
           templist=unique([L(i-1,j-1),L(i-1,j),L(i-1,j+1),L(i,j-1)]);%合并相同标号
            templist=setdiff(templist,0);%去除0标号
            templist=sort(templist);%templist的值分别是L1,L2
            [q,nt]=size(templist);  %nt只可能是1或者2
            %针对不同的nt进行标号处理
            if nt==0
                nl=nl+1;
                T=[T,nl];
                L(i,j)=nl;
            end
            if nt==1
                L(i,j)=templist(1);
            end
            if nt==2
                L(i,j)=templist(1);
                T(T==templist(2))=templist(1);
                  %T(find(T==templist(2)))=templist(1);matlab自动fix的           end
        else
            continue
        end
    end
end
%更新I和L
newT=T;
newT=sort(unique(newT));
mm=length(newT);
for i=1:mm
    T(find(T==newT(i)))=i;
end     %更新I
for i=1:m
    for j=1:n
        if (L(i,j)>0)
            L(i,j)=newT(L(i,j));
        end     %更新标号图L
    end
end
%计算区域面积
areas=zeros(1,max(newT));
for i=1:m
    for j=1:n
       if L(i,j)>0
           areas(L(i,j))=areas(L(i,j))+1;
       end
    end
end
disp('计算得到的不同区域面积分别为: ')
areas
          
 

运行结果:

T =

 

     1     2    2     2     2    2     2     2    2     2     3

 

areas =

 

       11024        7503        6850
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息