閾值分割與區域分割

本文主要包括如下內容 算法

  • 閾值分割技術
  • 基於區域的圖像分割技術
  • 本章的典型案例
    • 基於LoG和Canny算子的精確邊緣檢測
    • 基於Hough變換的直線檢測
    • 圖像的四叉樹分解

閾值分割

咱們曾在3.5節學習過灰度閾值變換的相關知識, 利用灰度閾值變換分割圖像就稱爲閾值分割, 它是一種基本的圖像分割方法。
闕值分割的基本思想是肯定一個閾值, 而後把每一個像素點的灰度值和閾值相比較,根據比較的結果把該像素劃分爲兩類:前景或者背景,閾值分割能夠分紅如下3步: markdown

  • 肯定閾值.
  • 將閾值和像素比較,.
  • 把像素歸類

其中第1步閾值最重要。閾值的選擇將直接影響分割的準確性以及由此產生的圖像描述,分析的正確性。函數

閾值分割方法

閾值分割經常使用的方法通常有如下幾種。 學習

實驗法
實驗法是經過人眼的觀察, 對已知某些特徵的圖像, 只要試驗不一樣的閾值, 而後看是否知足已知特徵便可。這種方法的不足在於適用範圍窄,
使用前必須瞭解圖像的某些特徵, 譬如平均灰度等,並且分割後圖像質量的好壞受主觀侷限性很大。 ui

根據直方圖谷底肯定閾值
若是圖像的前景物體內部和背景區域的灰度值分佈都比較均勻, 那麼這個圖像的灰度直方圖將具備明顯雙峯, 此時能夠選擇兩峯之間的谷底做爲閾值。
其表達式爲:

注意:因爲直方圖是各灰度的像素統計,其峯值和谷底特性不必定表明目標和背景.所以,若是沒有圖像其餘方面的知識,只靠直方圖進行圖像分割不必定準確 .spa

迭代選擇閾值法
迭代式閾值選擇方法的基本思想是:開始選擇一個閾值做爲初始估計值,而後按照某種規則不斷地更新這一估計值,直到知足給定的條件爲止。這個過程的關鍵在於選擇怎麼樣的 迭代規則。一個好的迭代規則必須既可以快速收斂,又可以在每個迭代過程當中產生優於上次迭代的結果。下面是一種迭代選擇閾值算法:
(1)選擇一個T的初始估計值。
(2)利用閾值T把圖像分爲兩個區域R1, 和R2
(3)對區域R1和R2中的全部像素計算平均灰度值μ1和μ2
(4)計算新的閾值:
3d

T=12(u1+u2)

(5)重複步驟2-4, 直到逐次迭代所得的T值小於事先定義的參數T。

最小均方偏差法
最小均方偏差法也是經常使用的閾值分割法之一。這種方法一般以圖像中的灰度爲模式特徵,假設各模式的灰度是獨立分佈的隨機變量,並假設圖像中待分割的模式服從必定的機率分佈。通常來講,採用的是正態分佈,即高斯機率分佈。
首先假設一幅圖像僅包含兩個主要的灰度區域前景和背景。令z表示灰度值,p(z)表示灰度值機率密度函數的估計值。假設機率密度函數一個對應於背景的灰度值,另外一個對應於圖像中前景即對象的灰度值。則描述圖像中總體灰度變換的混合密度函數是:
code

p(z)=P1p1(z)+P2p2(z)

其中 P1 是前景中具備值z的像素出現的機率, P2 是背景中具備值z的像素出現的機率,二者的關係爲:
P1+P2=1


最大類間方差法
在對圖像進行閾值分割時,選定的分割閾值應使前景區域的平均灰度、背景區域的平均灰度與整幅圖像的平均灰度之間差異最大,這種差別用區域的方差來表示。由此,Otsu在1978年提出了最大方差法。該算法在判決分析最小二乘法原理的基礎上推導得出,計算過程簡單是一種穩定、經常使用的算法。

讓T在[O,L-1]範圍內依次取值, 使類間方差最大的T值即是最佳區域分割閾值。
該方法不須要人爲設定其餘參數,是一種自動選擇閾值的方法,並且能獲得較好的結果。它不只適用於包含兩個區域的單閾值選擇,也一樣適用於多區域的多閾值選擇。對象

Matlab實現

最大類間方差法
Matlab中和闕值變換相關的兩個主要函數是im2bw和graythresh。實際上,利用graythresh函數便可實現最大類間方差法。 blog

迭代選擇閾值法

function [Ibw, thres] = autothreshold(I)
% 迭代法自動閾值分割
%
% 輸入:I - 要進行自動閾值分割的灰度圖像
% 輸出:Ibw - 分割後的二值圖像
% thres - 自動分割採用的閾值

thres = 0.5 * (double(min(I(:))) + double(max(I(:)))); %初始閾值
done = false; %結束標誌
while ~done
    g = I >= thres;
    Tnext = 0.5 * (mean(I(g)) + mean(I(~g)));
    done = abs(thres - Tnext) < 0.5;
    thres = Tnext;
end;

Ibw = im2bw(I, thres/255); % 二值化

區域分割

前面所講的圖像分割方法都是基於像素的灰度來進行閾值分割, 本節將討論以區域爲基礎的圖像分割技術。傳統的區域分割方法有區域生長和區域分裂與合井, 其中最基礎的是區域生長法。

區域生長及其實現

區域生長是根據事先定義的準則將像素或者子區域聚合成更大區域的過程。其基本思想是從一組生長點開始(生長點能夠是單個像素,也能夠爲某個小區域),將與該生長點性質類似的相鄰像素或者區域與生長點合併,造成新的生長點,重複此過程直到不能生長爲止。生長點和相鄰區域的類似性判據能夠是灰度值、紋理、顏色等多種圖像信息。

區域生長算法
區域生長通常有3個步驟。
(1)選擇合適的生長點。
(2)肯定類似性準則即生長準則。
(3)肯定生長中止條件。
通常來講, 在無像素或者區域知足加入生長區域的條件時, 區域生長就會中止。

上述方法比較的是單個像素與其鄰域的灰度特徵以實現區域生長,也有一種混合型區域生長把圖像分割成若干小區域,比較相鄰小區域的類似性,若是類似則合併。在實際中,區 域生長時常常還要考慮到生長的」歷史」,還要根據區域的尺寸、形狀等圖像的全局性質來決定區域的合併。

matlab實現

function J = regionGrow(I)
% 區域生長,須要以交互方式設定初始種子點,具體方法爲鼠標單擊圖像中一點後,按下回車鍵
%
% 輸入:I - 原圖像
% 輸出:J - 輸出圖像

if isinteger(I)
    I=im2double(I);
end
figure,imshow(I),title('原始圖像')
[M,N]=size(I);
[y,x]=getpts;             %得到區域生長起始點
x1=round(x);            %橫座標取整
y1=round(y);            %縱座標取整
seed=I(x1,y1);           %將生長起始點灰度值存入seed中
J=zeros(M,N);          %做一個全零與原圖像等大的圖像矩陣J,做爲輸出圖像矩陣
J(x1,y1)=1;             %將J中與所取點相對應位置的點設置爲白
sum=seed;              %儲存符合區域生長條件的點的灰度值的和
suit=1;                 %儲存符合區域生長條件的點的個數
count=1;               %記錄每次判斷一點周圍八點符合條件的新點的數目
threshold=0.15;         %閾值,注意須要和double類型存儲的圖像相符合
while count>0
    s=0;                   %記錄判斷一點周圍八點時,符合條件的新點的灰度值之和
     count=0;
     for i=1:M
       for j=1:N
         if J(i,j)==1
          if (i-1)>0 & (i+1)<(M+1) & (j-1)>0 & (j+1)<(N+1)  %判斷此點是否爲圖像邊界上的點
           for u= -1:1                               %判斷點周圍八點是否符合閾值條件
            for v= -1:1
              if  J(i+u,j+v)==0 & abs(I(i+u,j+v)-seed)<=threshold& 1/(1+1/15*abs(I(i+u,j+v)-seed))>0.8
                           J(i+u,j+v)=1;
                    %判斷是否還沒有標記,而且爲符合閾值條件的點
                    %符合以上兩條件即將其在J中與之位置對應的點設置爲白
                 count=count+1;
                 s=s+I(i+u,j+v);                      %此點的灰度之加入s中
              end
            end
           end
          end
         end
       end
     end
    suit=suit+count;                                   %將n加入符合點數計數器中
    sum=sum+s;                                     %將s加入符合點的灰度值總合中
    seed=sum/suit;                                    %計算新的灰度平均值
end


選擇不一樣的生長點,結果不一樣。

區域分裂與合併

區域生長是從一組生長點開始的,另外一種方法是在開始時將圖像分割爲一系列任意不相交的區域, 而後將它們合併或者拆分以知足限制條件, 這就是區域分裂與合併。 經過分裂, 能夠將不一樣特徵的區域分離開, 而經過合併, 能夠將相同特徵的區域合併起來。

區域分裂與合併算法


圖像先分裂爲如圖9.22Ca)所示;第二次分裂時,如圖(b)所示,因爲左下角區域知足 P(Ri)=TRUE ,則不進行分裂操做;第三次分裂時,如圖(c)所示,僅僅右邊的突出部分 P(Ri)=FALSE , 須要進行分裂操做,其他不變,完成後,分裂中止;最後,對兩個相鄰區域 實行合併,一直獲得最後的結果,如圖(d)所示。
區域分裂與合併對分割複雜的場景圖像比較有效,若是引入應用領域知識,則能夠更好地提升分割效果。

區域分裂的Matlab實現
在Matlab中, 和區域分裂相關的3個主要函數分別是qtdecomp、qtgetblk和qtsetblk。

(1) qtdecomp函數
Matlab的IPT函數qtdecomp能夠進行四叉樹分解。該函數首先將圖像劃分紅相等大4的4塊,而後對每個塊進行一致性檢查。若是該塊不符合一致性標準, 則將該塊繼續分爲4塊; 不然不對其進行進一步的分割。這個過程將會一直重複直至每個塊都符合一致性標
準, 分解的結果可能會包含許多大小不一樣的塊。
qtdecomp函數的經常使用調用形式爲:
S = qtdecomp(I,threshold,[mindim,maxdim])

threshold是分割成的子塊中容許的閾值,默認值爲0.如杲子塊中最大元素和最小元 素的差值小於該閾值就認爲知足一致性條件.對於double型矩陣,threshold將直接做爲閾值;而對於uinit8和uintl6類型的矩陣,threshold將被乘以255和65535以做爲實際閾值.對於圖像而言,threshold的取值範圍是0到1.

[mindim maxdim]是尺度閾值.mindim參數能夠屏蔽函數對尺度上小於mindim的子塊的處理,而不論這個子塊是否知足一致性條件;若是參數形式爲[mindim maxdim], 則表示不產生小於mindim尺度的子塊,也不保留大於maxdim尺度的子塊,此時 maxdim/mindim必須是2的整數次冪

注意: qtdecomp函數主要適用於邊長是2的整數次冪的正方形圖像, 如128x128,512x512, 此時分解可一直進行至子塊大小爲1x1。對於長寬不是2的整數次冪的圖像, 分解可能沒法進行到底. 例如, 對於96x96
的圖像, 將首先分解爲48x48, 而後是24x24, 12*12, 6*6, 最後是3x3, 沒法再繼續分解. 此時必須指定mindim參數爲3或是2的整數次幕與3的乘積.

(2) qtgetblk函數
在獲得稀疏矩陣S後, 利用IPT函數qtgetblk可進一步得到四叉樹分解後全部指定大小的子塊像素及位置信息。經常使用調用形式爲:
[vals,r,c]=qtgetblk(I,S,dim)
稀疏矩陣S是通過qtdecomp函數處理的輸出結果.
dim是指定子塊的大小

vals是dim*dim*k的三維矩陣,包含I中全部符合條件的子塊數據。其中k爲符合 條件的dim*dim的大小的子塊的個數,vals(:.:,i)表示符合條件的第i個子塊的內容.
r和c均爲列向量,分別表示圖像I中符合條件子塊左上角的縱座標(行索引)和橫座標(列索引).

(3) qtsetblk函數
在將圖像劃分爲子塊後, 還須要使用函數qtsetblk將四叉樹分解所獲得的子塊中符合條件的部分所有替換爲指定的子塊。函數語法爲:
J = qtsetblk(I,S,dim,vals)
S是I通過qtdecomp函數處理的結果.
dim是指定的子塊大小.
vals是dim*dim*k的三維矩陣,包含了用來替換原有子塊的新子塊信息.其中K應爲圖像I中大小爲dim*dim的子塊的總數,vals(:,:,i)表示要替換的第i個子塊.

I1 = imread('rice.png');

S = qtdecomp(I1,0.2);
S2 = full(S);

figure;
subplot(1,2,1),imshow(I1);
subplot(1,2,2),imshow(S2);

ct = zeros(6,1);
for ii = 1:6
    [vals{ii},r,c]=qtgetblk(I1,S2,2^(ii-1));
    ct(ii) = size(vals(ii),3);
end

小結 圖像分割問題是一個十分困難的問題。由於分割後的圖像是系統目標的一個函數, 因此根本不存在理想的或正確的分割。 物體及其組成部件的二維表現形式受到光照條件、透視畸變、觀察點變化、遮擋等的影響。此外, 物體及其組成部件與背景之間在視覺上可能沒法區分。所以, 人們沒法預測可以從圖像中抽取出哪些與物體識別相關的初始信息。 惟一能夠確定的是,這一過程將在本質上具備不可靠性。某些有用的信息可以被抽取出,且同時也會出現許多錯誤。所以,在任何應用領域中都不存在最優解。分割結果的好壞或者正確與否, 目前尚未一個統一的評價判斷標準, 大都從分割的視覺效果和實際的應用場景來判斷。

相關文章
相關標籤/搜索