基于贴标号算法的二值图像区域分割 面积计算
发布日期:2021-11-21 04:41:17 浏览次数:41 分类:技术文章

本文共 2122 字,大约阅读时间需要 7 分钟。

一、算法介绍

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

转载地址:https://blog.csdn.net/xiaojiajia007/article/details/53142897 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LBP, Uniform LBP 等价模式个数的推导
下一篇:最大值,最小值滤波的opencv3.0实现

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 18时45分45秒