1. 程式人生 > >matlab區域增長法分割影象例子

matlab區域增長法分割影象例子

1.區域生長是一種序列區域分割的影象分割方法

優點是基本思想相對簡單,通常能將具有相同特徵的聯通區域分割出來,並能提供很好的邊界資訊和分割結果。在沒有先驗知識可以利用時,可以取得最佳的效能,可以用來分割比較複雜的圖象,如自然景物。

但是,區域生長法是一種迭代的方法,空間和時間開銷都比較大噪聲和灰度不均一可能會導致空洞和過分割,並在對影象中的陰影效果處理上往往不是很好。

2.區域生長的基本思想是:

將具有相似性質的畫素集合起來構成區域。

  • 先對每個需要分割的區域找一個種子畫素作為生長的起點
  • 然後將種子畫素周圍鄰域中與種子畫素具有相同或相似性質的畫素(根據某種事先確定的生長或相似準則來判定)合併到種子畫素所在的區域中
  • 將這些新畫素當做新的種子畫素繼續進行上面的過程,直到再沒有滿足條件的畫素可被包括進來,這樣,一個區域就長成了。

3.區域生長是指從某個畫素出發,按照一定的準則,逐步加入鄰近畫素,當滿足一定的條件時,區域生長終止。區域生長的好壞決定於

  • 初始點(種子點)的選取。
  • 生長準則。
  • 終止條件。

區域生長是從某個或者某些畫素點出發,最後得到整個區域,進而實現目標的提取。

4.簡單來說下三個法則,對出需要分割的影象:

  1. 選取影象中的一點為種子點(種子點的選取需要具體情況具體分析)。
  2. 在種子點處進行8鄰域或4鄰域擴充套件,判定準則是:如果考慮的畫素與種子畫素灰度值差的絕對值小於某個門限T,則將該畫素包括進種子畫素所在的區域。
  3. 當不再有畫素滿足加入這個區域的準則時,區域生長停止。

區域生長實現的步驟如下:

  1. 對影象順序掃描!找到第1個還沒有歸屬的畫素, 設該畫素為(x0, y0);

  2.  以(x0, y0)為中心, 考慮(x0, y0)的8鄰域畫素(x, y),如果(x,, y)滿足生長準則, 將(x, y)與(x0, y0)合併(在同一區域內), 同時將(x, y)壓入堆疊;

  3.  從堆疊中取出一個畫素, 把它當作(x0, y0)返回到步驟2;

  4.  當堆疊為空時!返回到步驟1;

  5. 重複步驟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,[]);