圖像分割—基於圖的圖像分割(Graph-Based Image Segmentation)



圖像分割—基於圖的圖像分割(Graph-Based Image Segmentation)

Reference:

Efficient Graph-Based Image Segmentation,IJCV 2004,MIT Code

圖像分割—基於圖的圖像分割(OpenCV源碼註解)

       最後一個暑假了,不打算開疆闢土了,戰略中心轉移到品味經典,計劃把圖像分割和目標追蹤的經典算法都看一看,再記些筆記。

       Graph-Based Segmentation 是經典的圖像分割算法,作者Felzenszwalb也是提出DPM算法的大牛。該算法是基於圖的貪心聚類算法,實現簡單,速度比較快,精度也還行。不過,目前直接用它做分割的應該比較少,畢竟是99年的跨世紀元老,但是很多算法用它作墊腳石,比如Object Propose的開山之作《Segmentation as Selective Search for Object Recognition》就用它來產生過分割(oversegmentation)。還有的語義分割(senmatic segmentation )算法用它來產生超像素(superpixels)具體忘記了……

圖的基本概念

因爲該算法是將照片用加權圖抽象化表示,所以補充圖的一些基本概念。

是由頂點(vertices)和(edges)組成,表示爲,頂點,在本文中即爲單個的像素點,連接一對頂點的邊具有權重,本文中的意義爲頂點之間的相似度,所用的是無向圖

樹:特殊的圖,圖中任意兩個頂點,都有路徑相連接,但是沒有迴路。如上圖中加粗的邊所連接而成的圖。如果看成一團亂連的珠子,只保留樹中的珠子和連線,那麼隨便選個珠子,都能把這棵樹中所有的珠子都提起來。如果,i和h這條邊也保留下來,那麼頂點h,i,c,f,g就構成了一個迴路。

最小生成樹(MST, minimum spanning tree):特殊的樹,給定需要連接的頂點,選擇邊權之和最小的樹。上圖即是一棵MST

本文中,初始化時每一個像素點都是一個頂點,然後逐漸合併得到一個區域,確切地說是連接這個區域中的像素點的一個MST。如圖,棕色圓圈爲頂點,線段爲邊,合併棕色頂點所生成的MST,對應的就是一個分割區域。分割後的結果其實就是森林。

 

相似性

既然是聚類算法,那應該依據何種規則判定何時該合二爲一,何時該繼續劃清界限呢?

對於孤立的兩個像素點,所不同的是顏色,自然就用顏色的距離來衡量兩點的相似性,本文中是使用RGB的距離,即

當然也可以用perceptually uniform的Luv或者Lab色彩空間,對於灰度圖像就只能使用亮度值了,此外,還可以先使用紋理特徵濾波,再計算距離,比如,先做Census Transform再計算Hamming distance距離。

全局閾值à自適應閾值

上面提到應該用亮度值之差來衡量兩個像素點之間的差異性。對於兩個區域(子圖)或者一個區域和一個像素點的相似性,最簡單的方法即只考慮連接二者的邊的不相似度。

如圖,已經形成了棕色和綠色兩個區域,現在通過紫色邊來判斷這兩個區域是否合併。那麼我們就可以設定一個閾值,當兩個像素之間的差異(即不相似度)小於該值時,合二爲一。迭代合併,最終就會合併成一個個區域,效果類似於區域生長:星星之火,可以燎原。

顯然,上面這張圖應該聚成右圖所思的3類,高頻區h,斜坡區s,平坦區p。如果我們設置一個全局閾值,那麼如果h區要合併成一塊的話,那麼該閾值要選很大,但是那樣就會把p和s區域也包含進來,分割結果太粗。如果以p爲參考,那麼閾值應該選特別小的值,那樣的話,p區是會合併成一塊,但是,h區就會合併成特別特別多的小塊,如同一面支離破碎的鏡子,分割結果太細

顯然,全局閾值並不合適,那麼自然就得用自適應閾值。對於p區該閾值要特別小,s區稍大,h區巨大。

對於兩個區域(原文中叫Component,實質上是一個MST,單獨的一個像素點也可以看成一個區域),本文使用了非常直觀,但抗干擾性並不強的方法。先來兩個定義,原文依據這兩個附加信息來得到自適應閾值。

一個區域的類內差異

可以近似理解爲一個區域內部最大的亮度差異值,定義是MST中不相似度最大的一條邊。

兩個區域的類間差異

即連接兩個區域所有邊中,不相似度最小的邊的不相似度,也就是兩個區域最相似的地方的不相似度。

那麼直觀的判斷是否合併的標準:

等價條件

    解釋: 分別是區域所能忍受的最大差異,當二者都能忍受當前差異時,你情我願,一拍即合,只要有一方不願意,就不能強求。

    特殊情況,當二者都是孤立的像素值時,,所有像素都是"零容忍"只有像素值完全一樣才能合併,自然會導致過分割。所以剛開始的時候,應該給每個像素點設定一個可以容忍的範圍,當生長到一定程度時,就應該去掉該初始容忍值的作用。原文條件如下

    增加項:

其中爲區域所包含的像素點的個數,如此,隨着區域逐漸擴大,這一項的作用就越來越小,最後幾乎可以忽略不計。那麼就是一個可以控制所形成的的區域的大小,如果,那麼,幾乎每個像素都成爲了一個獨立的區域,如果,顯然整張圖片都會聚成一塊。所以,越大,分割後的圖片也就越大。

當然,可以採用中位數來應對超調,不過這就變成了一個NP難問題,證明見原文

形狀相似

前面提到的用顏色信息來聚類,修改相似性衡量標準,可以聚類成我們想要的特定形狀。比如我們希望得到很多長條形的區域,那麼可以用聚類後的所形成的區域的面積/周長 + 亮度值的差 衡量兩個子圖或者兩個像素之間的相似度。因爲長條形的面積/周長會比較小。

算法步驟

Step 1: 計算每一個像素點與其8鄰域或4鄰域的不相似度。

如左邊所示,實線爲只計算4領域,加上虛線就是計算8鄰域,由於是無向圖,按照從左到右,從上到下的順序計算的話,只需要計算右圖中灰色的線即可。

Step 2:按照不相似度non-decreasing排列(從小到大排序得到

Step 3: 選擇

Step 4: 對當前選擇的邊進行合併判斷。設其所連接的頂點爲。如果滿足合併條件:

(1)不屬於同一個區域

(2)不相似度不大於二者內部的不相似度。則執行Step 5。否則執行Step 6

Step 5: 更新閾值以及類標號。

更新類標號:將的類標號統一爲的標號。

更新該類的不相似度閾值爲:

注意:由於不相似度小的邊先合併,所以,即爲當前合併後的區域的最大的邊,即

Step 6: 如果,則按照排好的順序,選擇下一條邊轉到Step 4,否則結束。

結果

Segmentation parameters: sigma = 0.5, k= 500, min = 50.

Sigma先對原圖像進行高斯濾波去噪,sigma即爲高斯核的

k: 控制合併後的區域的大小,見前文

min: 後處理參數,分割後會有很多小區域,當區域像素點的個數小於min時,選擇與其差異最小的區域合併即

性質討論

結果雖然不是很好,但有很好的全局性質,結論很有意思,有興趣的可以看看。

首先要說明的是,對於任何圖像,始終存在一種分割方法,使得分割的結果既不過細,也不過粗。但是並不唯一

引理

如果step 4 時,,但並沒有合併,即,那麼肯定有一個區域已經分割好了,比如,那麼區域的範圍就不會再有增加,它將會成爲最終的分割區域中的一個區域。

Proof:

假設,,由於邊是按照non-decreasing排序,所以剩下的連接的邊的不相似度肯定都不低於,最小的邊都不行,其餘的邊自然是靠邊站了。

不過,原文說只能只有一個已經分割好了,但是我覺得還有一種情況, 並且,那麼這兩個區都應該分好了纔對呀。

Not Too fine

分割太細,也就是本來不應該分開的區域被攔腰截斷,但是本算法是能保證有情人終成眷屬的,絕對不會幹棒打鴛鴦拆散一對是一對的事。

Proof:

反證法:如上圖。本不應該分割,則應該滿足條件。如果分開了,那麼必定存在一條邊導致二者沒有合併,那麼由前面的引理,必定存在一個區域成爲最終分割結果的一部分,假設爲A部分,再回溯到判斷這條邊的時候,必定有,,從而,由於是按non-decreasing 順序,所以A部分和B部分最小的邊就是,那麼與假設條件矛盾。

Not Too coarse

分割太粗,也就是本應該分開的區域沒有分開。但本算法能保證當斷則斷,不會藕斷絲連。

反證法:如上圖。本應該分割,則應滿足條件。假設還是爲連接A,B最小的邊。如果合併了,由於,而且是non-decreasing 順序,所以在判定邊之前A區域已經形成。如果分割過粗,則判定這條邊時最小的邊滿足,則必定使得二者合併了。和條件矛盾。

等權邊處理先後次序的影響

如果兩條邊的權值相同,那麼排序時候,誰排前頭,誰落後面有影響嗎?結論是木有。

Proof:

Case1連接的區域相同,即連接的都是區域,那麼它倆誰在前面都沒關係。

Case2連接的區域完全不同,比如連接區域,連接區域,那麼誰先誰後,都不影響是否合併,也不影響是否合併。

Case3連接,連接

Case3-1:在先,在後,並且,使得合併,交換二者處理順序,先處理,後處理。如果不合並,那不影響合併;如果合併,那麼合併後的,照樣合併。

Case3-2:在先,在後,並且,不合並,交換二者處理順序,先處理,後處理。如果是。那是否合併,都不會使得合併;如果,那同樣也有,同樣也沒影響。

補充:

彩色圖片

對於彩色圖片,上文是將R,G,B作爲距離,整張圖片只進行一次分割,原文說對每一個通道都進行一次分割,最後對結果取交集,也就是說圖片中的兩個點要劃分到同一個區域,則在R,G,B三個通道的劃分結果中,它倆得始終在同一個區域。原文說這樣效果更好……不過他的程序是採用一次分割。

Nearest Neighbor Graphs

前文是隻用了空間位置來構件圖的連接關係,缺點是明顯的,空間不相鄰,色彩完全一樣也白搭,於是中間稍微有斷開都會分成多個部分。於是另一種更爲平等的策略是二者一塊考慮,先映射到特徵空間,再構建圖。此時有連接關係的就不一定是4/8鄰域了,由於有對邊,因此如果考慮所有邊的連接關係的話,太恐怖了!原文是對每個像素點找10個歐氏距離最近的點即10最近鄰,構建圖,當然,另外一種方法不是固定鄰居數目,而是限定距離範圍。


那麼類內距離的解釋就和直觀了,類內最短的距離,那麼會以這條邊爲半徑,在特徵空間構成一個超球體,不過會和別人有相交。

同樣還是兩個類直接的最短距離。

找10-NN太累,原文采用近似算法ANN《Approximate nearest neighbor searching》來找10近鄰,快。

剩下的和上面一樣,但是有一點我沒明白,就是的更新,比如上圖,肯定是用綠色這條線更新,那麼的意義就不再是包含集合所有點的最短半徑了,求解?

結果如下:可以看到被欄杆分開的草地也連在一塊了,下面的花朵也屬於同一個類別

                                        


圖像分割—基於圖的圖像分割(OpenCV源碼註解)

下個星期寫Mean shift,敬請期待


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章