連通分量的提取
實際上,在二值圖像中提取連通分量是許多自動圖像分析應用中的核心任務。 令 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