1. 程式人生 > >數字影象處理筆記——影象分割(Image Segmentation)

數字影象處理筆記——影象分割(Image Segmentation)

影象分割

區域生長

影象第一種演算法我們稱為區域生長(region growing)

其主要思路就是從原始影象中選取幾個重要的點,然後從這些點分別往外擴充套件,如果周圍的畫素與其的畫素差小於某個閾值,那麼將其置1(白色),並繼續從這個點向外延展,直到不滿足條件,其他點置0(黑色)。在matlab中我們可以用grayconnected這個函式來實現這個功能

如下圖是利用這個演算法,在影象中隨便選取一點後得到的結果。從圖中可見這個分割演算法結果並不是很理想,實際上這個演算法對點的選取要求很高,如果點沒選好那麼結果將會很差

區域分割合併

除了上一中演算法我們還可以利用四叉樹的方法對影象進行分割,之後分別對四個區域進行某種條件的判決,如果不滿足該條件,則將這塊區域進行更進一步的劃分,直到演算法收斂。之後我們可以將影象中仍不滿足條件的塊置0,其他置1

聚類

第三種演算法叫做k-means聚類演算法,意思是我們將每個畫素放在色彩空間來看並將其分為不同的類

大致演算法思路是選取幾個重要的點,之後判斷各個點在色彩空間中到這些點的距離,根據距離來對他們進行分類,之後更新這個中心點直到演算法收斂。我們可以看出這個演算法中對初始點的選取也是非常重要,在實際操作中我們往往是多次隨機取點,然後選取效果最好的一次,這裡的效果是利用類之內的方差來衡量

如下圖的例子我們可以利用以上演算法來對影象中的點進行自動分類

超畫素

我們可以從上圖的結果看到影象對顏色的劃分確實效果不錯,但是在空間上卻散落成了很多小的塊。這是由於在該演算法中沒有利用空間相關性。為了解決這個問題,我們有一個改良的演算法叫做超畫素,超畫素是一塊擁有相近顏色的區域塊。

具體該演算法如下:現在影象中等間距取一定數量的點,這些點的數目與你想要劃分的塊相關,並將這些點進行微調,之後對一定區域內的畫素進行“距離”判斷,之後類似k-means演算法進行步驟的重複即可。

這個演算法中的“距離”就是其與k-means演算法不同的地方,這個距離D不僅考慮了在色彩空間上的距離,還考慮了在空域上的距離。其中的c與s可以用來調整空域距離與色彩空間距離佔得比重來對二者進行權衡

以下是利用超畫素分割的結果

圖割演算法

第四個分割演算法叫圖割演算法。其主要是能夠對影象進行前景和背景的分割

其主要思路是設定兩個終端(前景與後景),然後將畫素之間與畫素與終端之間的連邊賦予權重。然後找到一條權重和最小的分割方法將影象分為前景和後景

那麼這些邊的權重應該如何選取呢?我們先看相鄰畫素之間的權重,我們可以直觀的理解為如果畫素的值相近,那麼代表這個地方不是邊界,那麼切割的代價非常高;如果畫素的值相差非常遠,那麼這個位置可以理解為存在邊界,切割代價就很低

那麼畫素與終端之間的權重呢?我們可以通過初始化選取處在前景的畫素與處在後景的畫素,再來判斷圖中任意一個畫素點位於前景/後景的概率值為多少,根據這個概率值我們可以求出對應邊的權重

我們在matlab中也存在工具箱來實現這個演算法,我們可以看到matlab中這個演算法實際上是基於超畫素而不是畫素來進行圖割的,因此很大程度上該演算法結果如何很大程度上取決於超畫素對邊界劃分的結果,下圖就是一個超畫素劃分不是十分理想的例子。當然這樣做的好處就是速度較快,我們也可以讓圖割演算法基於畫素來做來獲得更好的效果