圖像切割—基於圖的圖像切割(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,敬請期待
圖像切割—基於圖的圖像切割(Graph-Based Image Segmentation)