形態學處理——連通分量的提取


連通分量的提取

   實際上,在二值圖像中提取連通分量是許多自動圖像分析應用中的核心任務。 令 Y 表示一個包含於集合 A 中的連通分量,並假設 Y 中的一個點 p 是已知的。而后,用下列的迭代表達式生成 Y 的所有元素:

                

 

 

 代碼實例

clear all;
close all;
clc;

img=imread('shape.bmp');
[m n]=size(img);
imshow(img);
[x y]=ginput();
result=zeros(m,n);
x=round(x);
y=round(y);
result(x,y)=0;

tmp=ones(m,n);
queue_head=1;       %隊列頭
queue_tail=1;       %隊列尾
neighbour=[-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1];  %和當前像素坐標相加得到八個鄰域坐標
%neighbour=[-1 0;1 0;0 1;0 -1];     %四鄰域用的
q{queue_tail}=[y x];
queue_tail=queue_tail+1;
[ser1 ser2]=size(neighbour);

while queue_head~=queue_tail
    pix=q{queue_head};
    for i=1:ser1
        pix1=pix+neighbour(i,:);
        if pix1(1)>=1 && pix1(2)>=1 &&pix1(1)<=m && pix1(2)<=n
            if img(pix1(1),pix1(2))==0 
                img(pix1(1),pix1(2))=1;
                result(pix1(1),pix1(2))=1;
                q{queue_tail}=[pix1(1) pix1(2)];
                queue_tail=queue_tail+1;

            end      
        end
    end

    queue_head=queue_head+1;
end

figure(1)
imshow(mat2gray(result));
title('提取之后的結果');

 

 結果:

下面展示一種遞歸的算法:

clear all; %清理內存
close all; %關閉窗口
clc        %清屏

%圖像分割
Ii=imread('shape.bmp');  %讀取彩色圖像並轉換為灰度圖像
QuYuFenGe(Ii);           %區域分割(8鄰域區域生長)
function QuYuFenGe(Ii)
figure,subplot(1,2,1),imshow(Ii),title('二值化圖像'); %顯示輸入圖像

%通過“鼠標點擊+回車”,選取種子點(x0,y0)
%規定:只允許在對象(白色區域)中選取一個種子點
x0=1;
y0=1;
while Ii(x0,y0) == 255
    [y0,x0]=getpts;
    x0=uint32(x0);
    y0=uint32(y0);
end

[M,N]=size(Ii);

%TODO: 初始化大小為M×N、像素值為0的輸出圖像Io
Io=zeros(M,N);
Io=QuYuShengZhang(x0,y0,Io,Ii);    %對Io執行區域迭代生長

subplot(1,2,2),imshow(Io,[]),title('分割后圖像'); %顯示分割后圖像
function Io=QuYuShengZhang(x0,y0,Io,Ii)
[M,N]=size(Ii);

for i=[-1,0,1]%TODO: 對於每個種子點(x0,y0),遍歷它的每個8鄰域像素(xn,yn)
    for j=[-1 0 1]%TODO
        %TODO: 計算xn, yn
        xn=x0+i;
        yn=y0+j;
        if (xn>0&&xn<=M && yn>0 && yn<=N &&Ii(x0,y0)==Ii(xn,yn) && Io(xn,yn)==0) %TODO: 如果(xn,yn)位於圖像空間內,並且同時滿足Ii(x0,y0)=Ii(xn,yn),Io(xn,yn)=0
            Io(xn,yn)=255;%TODO: 區域生長
            Io=QuYuShengZhang(xn,yn,Io,Ii); %將(xn,yn)作為新的種子點,重復此步驟
        end
    end
end

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM