matlab區域增長法分割影象例子
阿新 • • 發佈:2018-12-30
1.區域生長是一種序列區域分割的影象分割方法
其優點是基本思想相對簡單,通常能將具有相同特徵的聯通區域分割出來,並能提供很好的邊界資訊和分割結果。在沒有先驗知識可以利用時,可以取得最佳的效能,可以用來分割比較複雜的圖象,如自然景物。
但是,區域生長法是一種迭代的方法,空間和時間開銷都比較大,噪聲和灰度不均一可能會導致空洞和過分割,並在對影象中的陰影效果處理上往往不是很好。
2.區域生長的基本思想是:
將具有相似性質的畫素集合起來構成區域。
- 先對每個需要分割的區域找一個種子畫素作為生長的起點
- 然後將種子畫素周圍鄰域中與種子畫素具有相同或相似性質的畫素(根據某種事先確定的生長或相似準則來判定)合併到種子畫素所在的區域中
- 將這些新畫素當做新的種子畫素繼續進行上面的過程,直到再沒有滿足條件的畫素可被包括進來,這樣,一個區域就長成了。
3.區域生長是指從某個畫素出發,按照一定的準則,逐步加入鄰近畫素,當滿足一定的條件時,區域生長終止。區域生長的好壞決定於
- 初始點(種子點)的選取。
- 生長準則。
- 終止條件。
區域生長是從某個或者某些畫素點出發,最後得到整個區域,進而實現目標的提取。
4.簡單來說下三個法則,對出需要分割的影象:
- 選取影象中的一點為種子點(種子點的選取需要具體情況具體分析)。
- 在種子點處進行8鄰域或4鄰域擴充套件,判定準則是:如果考慮的畫素與種子畫素灰度值差的絕對值小於某個門限T,則將該畫素包括進種子畫素所在的區域。
- 當不再有畫素滿足加入這個區域的準則時,區域生長停止。
區域生長實現的步驟如下:
-
對影象順序掃描!找到第1個還沒有歸屬的畫素, 設該畫素為(x0, y0);
-
以(x0, y0)為中心, 考慮(x0, y0)的8鄰域畫素(x, y),如果(x,, y)滿足生長準則, 將(x, y)與(x0, y0)合併(在同一區域內), 同時將(x, y)壓入堆疊;
-
從堆疊中取出一個畫素, 把它當作(x0, y0)返回到步驟2;
-
當堆疊為空時!返回到步驟1;
-
重複步驟1 - 4直到影象中的每個點都有歸屬時。生長結束。
matlab例子(來源於matlab中文論壇:http://www.ilovematlab.cn/thread-75607-1-1.html):
A0=imread('圓圈.jpg');%讀取影象
seed=[1,2];%選擇起始位置
thresh=15;%相似性選擇閾值
A=rgb2gray(A0);%灰度化
A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]);
A=double(A);%將影象灰度化
B=A;
[r,c]=size(B);%r為行數,c為列
n=r*c;%計算影象包含點的個數
pixel_seed=A(seed(1),seed(2));%原圖起始點灰度值
q=[seed(1),seed(2)];%q用來裝載起始位置
top=1;%迴圈判斷flag
M=zeros(r,c);%建立一個與原圖大小一樣的矩陣
M(seed(1),seed(2))=1;%將起始點賦為1,其餘為0
count=1;%計數器
while top~=0 %迴圈結束條件
r1=q(1,1);%起始點行位置
c1=q(1,2);%起始點列位置
p=A(r1,c1);%起始點灰度值
dge=0;
for i=-1:1%周圍點迴圈判斷
for j=-1:1
if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0%保證在點周圍範圍內
if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1
top=top+1;%滿足判定條件則top+1,top為多少,則q的行數有多少
q(top,:)=[r1+i,c1+j];%將滿足判定條件的周圍點位置賦予q,q記載了滿足判定的每一外點
M(r1+i,c1+j)=1;%滿足判定條件將M中相對應的點賦1
count=count+1;%統計滿足條件的點個數,其實與top此時的值一樣
B(r1+i,c1+j)=1;%滿足判定條件將B中相對應點賦值1
end
if M(r1+i,c1+j)==0;%如果M中相對應的值為0,將dge賦值為1,也就是說這幾個點不滿足條件
dge=1;
end
else
dge=1;%在影象外將dge賦值為1
end
end
end
%此時對周圍幾點判斷完畢,在點在影象外或不滿足判定條件則將dge賦為1,滿足條件dge為0
if dge~=1
B(r1,c1)=A(seed(1),seed(2));%將原圖起始位置賦予B
end
if count>=n%如果滿足判定條件的點個數大於等於n
top=1;
end
q=q(2:top,:);
top=top-1;
end
subplot(121),imshow(A,[]);
subplot(122),imshow(B,[]);