圖像分割是視覺圖像處理的基礎,指的是将數字圖像細分為多個圖像子區域。這樣友善對圖像中的每個子區域進行特征統計,或者提取感興趣的區域。
最簡單的分割算法當屬門檻值分割,即在0到255之間設定一個值,當圖像的灰階值大于等于的設定的值時為1,小于設定的值時為0.基于這種固定門檻值分割算法又演變出多種門檻值分割算法。如局部自适應門檻值分割,動态門檻值分割,基于局部均值和方法的門檻值分割,利用直方圖的波峰波谷特性進行門檻值分割,最大類間方差分割等等門檻值分割算法。這些分割算法都可以歸為門檻值分割算法。門檻值分割的問題主要在于如何設定合适的門檻值,對于背景和特征比較明顯的圖像,門檻值分割比較有效,而且運作速度快,在機器視覺中是常用的方法。
除了門檻值分割之外,還有一種分割算法是基于邊界的分割。首先利用邊界檢測算法檢測圖像的邊界,然後基于檢測的邊界對圖像再進行門檻值分割。如sobel算法,canny算法,LOG(高斯拉普拉斯算法),DOG(高斯差分算法)等等。邊界檢測算法主要是利用圖像在邊界位置的梯度變化來實作的。由于圖像的邊緣部分的梯度變化比較大,一般用一階差分或二階差分将邊界凸顯出來,然後進行門檻值分割。這種分割算法比較依賴邊界檢測的準确性,但是梯度的變化即使在邊界比較模糊的情況下也能夠準确的檢測出來,隻要圖像在邊緣的灰階有一定的變化就可以,這是相對于門檻值分割的有優點。但是邊界檢測算法有很多,如何選擇合适的邊緣檢測算子也要根據不同的圖像進行測試才能夠得到更好的結果。
除了以上兩種常見的分割算法之外,要有一種比較常用的分割算法,即基于區域的分割,如區域生長算法,分水嶺算法,和最大穩定極值區域算法。
區域生長算法的基本思想是将有相似性質的像素點合并到一起。對每一個區域要先指定一個種子點作為生長的起點,然後将種子點周圍領域的像素點和種子點進行對比,将具有相似性質的點合并起來繼續向外生長,直到沒有滿足條件的像素被包括進來為止。這樣一個區域的生長就完成了。圖1是區域生長算法的示例。
算法實作步驟:
1)根據圖像的不同應用選擇一個或一組種子,它或者是最亮或最暗的點,或者是位于點簇中心的點;
2)選擇一個描述符(條件);
3)從該種子開始向外擴張,首先把種子像素加入結果集合,然後不斷将與集合中各個像素連通、且滿足描述符的像素加入集合
4)上一過程進行到不再有滿足條件的新結點加入集合為止。
圖1 區域生長算法示例
區域生長算法需要手動這隻種子點,這對機器視覺的應用是非常不利的。是以,在實際應用中。一般自動選擇設定的一個局部區域内的均值或者中心像素點作為種子點,這樣避免了手動選擇的缺陷。常用的區域生長的判斷生長條件一般采用灰階值的大小,即比較每個點與種子點的灰階值大小是否在一個範圍内來确定是否生長。其實,這裡還可以有别的生長條件,比如,利用梯度關系來判斷是否生長這應該是一種比較穩定的生長條件。比如LSD直線檢測算法其實就利用的梯度方向資訊進行生長得到了比較好的效果。是以,利用區域生長算法的關鍵是如何設定生長的條件,如果找到一種好的條件,則分割出來的效果是非常好的。這也是目前部分人的研究方向。
分水嶺算法是另一種比較有名的算法。按照百度百科上的說明,水嶺算法有好多種實作算法。分水嶺分割方法是一種基于拓撲理論的數學形态學的分割方法,其基本思想是把圖像看作是測地學上的拓撲地貌,圖像中每一點像素的灰階值表示該點的海拔高度,每一個局部極小值及其影響區域稱為集水盆,而集水盆的邊界則形成分水嶺。分水嶺的概念和形成可以通過模拟浸入過程來說明。在每一個局部極小值表面,刺穿一個小孔,然後把整個模型慢慢浸入水中,随着浸入的加深,每一個局部極小值的影響域慢慢向外擴充,在兩個集水盆彙合處構築大壩,即形成分水嶺。
分水嶺算法的關鍵是找到局部區域的最小極值點,通常分水嶺算法也不用灰階值大小,采用梯度大小來進行判斷是一種比較穩健的方式。采用分水嶺算法要防止過分割的問題。同樣,分水嶺算法也需要手工設定标志點。當然也可以通過計算的方式設定标志點。分水嶺算法的步驟如下:
1)建構圖像梯度圖像。
2)通過一定規則生成n個最初的注水區域(先驗知識或局部梯度最小值)。
3)往注水區域内加水,當兩注水區域即将合并時,記錄下此時的邊界。
4)當圖像邊緣徹底被分割成n個獨立區域是算法結束。
由于圖像可能受到噪聲的感染,是以,采用分水嶺算法之前,一般先對圖像進行平滑濾波處理。
MSER(最大穩定極值區域算法)是另一種分割算法,參考網上的介紹,是對一幅圖像取門檻值進行二值化處理,門檻值從0到255依次遞增。該算法類似于分水嶺算法。在得到的所有二值圖像中,圖像中的某些連通區域變化很小,甚至沒有變化,則該區域就被稱為最大穩定極區域。MSER檢測一次後需要将其反轉,再做一次MSER檢測,兩次操作又稱MSER+和MSER-。MSER主要用于自然場景的文本分割。
下面利用halcon來簡單實作下這三種算法,利用的圖像選自halcon自帶的一張圖像,比較下這三種算法的分割結果。
read_image(Image,'e:/test/work_sheet_02.png')
regiongrowing(Image,Regions, 5, 5, 16, 100)
gauss_filter(Image,ImageGauss, 5)
regiongrowing(ImageGauss,Regions1, 5, 5, 16, 100)
sobel_amp(ImageGauss,EdgeAmplitude, 'sum_abs', 3)
regiongrowing(EdgeAmplitude,Regions2, 5, 5, 16, 100)
watersheds_threshold(EdgeAmplitude,Basins, 15)
segment_image_mser(ImageGauss,MSERDark,MSERLight, 'both', 10, [], 15, [], [])
圖2 圖像分割結果比較
以上是這三種不同分割算法對同一圖像的分割結果,分水嶺算法沒有對原圖進行分割,而是采用了sobel操作之後進行分割,因為原圖分割的效果實在太差了。大家可以采用不同的圖像利用這三種算法進行分割,通過調整參數比較分割結果。進而找出最适合自己圖像的分割算法。MSER應該是比較好的一種分割算法,尤其在自然場景文本檢測方面的應用還是比較好的。當然,除了這幾種分割算法,還有其他很多比較好的分割算法,比如利用機器學習的分割算法,這将在以後進行介紹。