生活随笔
收集整理的這篇文章主要介紹了
图像分割II
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
區域增長算法
目標
掌握區域生長法的基本思想 掌握圖像分裂合并分割的基本思想及步驟
區域生長法分割
大津算法的局限性:噪聲比較嚴重的圖片、分割目標顏色漸變的情況,分割效果差。 區域生長:從種子點開始,按照一定準則(如相鄰像素灰度相似性)向周圍擴散,將鄰域相似像素加入區域中。 按照擴散順序,分為廣度優先搜索(優先比較原像素所有周邊像素)和深度優先搜索(比較原像素某一特定方向的像素)。
區域生長實現步驟:
對圖像順序掃描。找到第1個還沒有歸屬的像素,設像素為(x0,y0x_0,y_0 x 0 ? , y 0 ? ); 以(x0,y0x_0,y_0 x 0 ? , y 0 ? )為中心,考慮(x0,y0x_0,y_0 x 0 ? , y 0 ? )的8鄰域像素(x,y)(x,y) ( x , y ) ,如果(x,y)(x,y) ( x , y ) 滿足生長準則,將(x,y)(x,y) ( x , y ) 與(x0,y0x_0,y_0 x 0 ? , y 0 ? )合并,同時將(x,y)(x,y) ( x , y ) 壓入堆棧; 從堆棧中取出一個像素,把它當作(x0,y0)(x_0,y_0) ( x 0 ? , y 0 ? ) 返回到步驟2; 當堆棧為空時,返回步驟1; 重復步驟1-4直到圖像中的每個點都有歸屬時,生長結束。
區域分裂合并
圖像分裂:分裂合并可采用基于四叉樹的數據表示 對于像素方差不大的區域不用分裂,像素方差大的區域進行分裂。將相鄰像素的區域進行合并。 實現步驟:
對區域分裂合并法無需預先指定種子點,它按某種一致性準則分裂或合并區域 可以先進行分裂運算,然后再進行合并運算;也可以分裂和合并運算同時進行,經過連續的分裂和合并,最后得到圖像的精確分割效果。 分裂合并法對分割復雜的場景圖像比較有效。
總結
區域生長法基于相鄰像素間的相似性,由種子像素逐步生長得到 分裂-合并基于圖像塊內在的相似性,通過不斷分裂得到區域外邊界,通過合并將不同塊連接
分水嶺算法
目標
掌握分水嶺算法的基本思想 了解分水嶺算法的運行步驟
分水嶺算法分割
如果以圖像位置(x,y)(x,y) ( x , y ) 為坐標,則圖像(x,y)(x,y) ( x , y ) 可以看作是地形俯視圖,其中“山峰的高度”與圖像中的灰度值對應。 假設在每個“盆地”的最低點開始打洞讓水漫上來,并且讓水以均勻速率上升,那么,當不同“盆地”的水開始匯聚時,能通過修建一個“水壩”==擋住這種聚合的弧線就是圖像的分界線。 在漫水過程中,存在三種類型的點: 局部極小值點,該點對應一個盆地的最低點,當我們在盆地滴一滴水的時候,由于重力作用,水最終會匯聚到該點。注意:可能存在一個最小值面,該平面內都是最小值點。 盆地的其它位置點,該位置滴的水滴會匯聚帶局部最小點。 盆地的邊緣點,是該盆地和其它盆地交接點,在該點滴一滴水,會等概率的流向任何一個盆地。
符號: T[n]T[n] T [ n ] :滿足灰度<n<n < n 的所有圖像點的集合; C(Mi)C(M_i) C ( M i ? ) :與區域最小值集合MiM_i M i ? 相聯系的盆地圖像點集合 C[n]C[n] C [ n ] :在第n階灰度計算的圖像區域集合,C[n]=∪i=1RCn(Mi)C[n] = \cup_{i=1}^RC_n(M_i) C [ n ] = ∪ i = 1 R ? C n ? ( M i ? ) 目標:迭代計算C[n]C[n] C [ n ] ,進一步獲得區域分割線(水壩) 步驟:
初始化:從最低水面(最低灰度對應的點集)開始,對應C[min+1]=T[min+1]C[min+1]= T[min+1] C [ m i n + 1 ] = T [ m i n + 1 ] 迭代計算:由C[n?1]C[n-1] C [ n ? 1 ] 計算C[n]C[n] C [ n ] : 令QQ Q 表示T[n]T[n] T [ n ] 中連通分量的點集。對每個分量q∈Qq\in Q q ∈ Q ,如下處理: (1)q∩C[n?1]=?q\cap C[n-1]=\varnothing q ∩ C [ n ? 1 ] = ? :發現新的區域,連通分量q并入C[n]C[n] C [ n ] (2)q∩C[n?1]q\cap C[n-1] q ∩ C [ n ? 1 ] :填充未溢出(到別的盆地);連通分量q并入C[n]C[n] C [ n ] (3)q∩C[n?1]q\cap C[n-1] q ∩ C [ n ? 1 ] 包含C[n?1]C[n-1] C [ n ? 1 ] 中的多個分量:填充溢出;在q內構筑水壩,方法同前
分水嶺算法的過分割問題
由于噪聲或者其它干擾因素的存在,使用分水嶺算法常常存在過度分割的現象,這是因為很多很小的局部極值點的存在。 在初始時給marker,改善過分割問題: 為了解決過分割的問題,可以使用基于標記(mark)圖像的分水嶺算法,就是指定mark圖像(圖中紅色 區域),在這個區域的洪水淹沒過程中,水平面都是定義的marker開始的,這樣可以避免一些很小的噪聲極值區域的分割。 使用marker改善分割結果:
總結:
分水嶺算法基本思想來源于由低到高"漫水"和“修建水壩”。分割過程通過漫水和膨脹,按照不同灰度級迭代進行。
圖像分割實戰演練(II)
目標:
使用OpenCV實現區域漫水填充 使用OpenCV實現分水嶺分割
相關函數
retval
, image
, mask
, rect
= cv2
. floodFill
( image
, mask
, seedPoint
, newVal
[ , loDiff
[ , upDiff
[ , flags
] ] ] )
makers
= cv2
. watershed
( image
, markers
)
解決思路:
圖像采集(取到圖像) 圖像預處理 使用距離變換或計算圖像梯度,得到分水嶺處理圖像 應用分水嶺算法分割 圖像特征描述及目標分析 得到最終結果
import cv2
import numpy
as npimg
= cv2
. imread
( 'C:/python/img/water_coins.jpg' )
gray
= cv2
. cvtColor
( img
, cv2
. COLOR_BGR2GRAY
)
ret
, thresh
= cv2
. threshold
( gray
, 0 , 255 , cv2
. THRESH_BINARY_INV
+ cv2
. THRESH_OTSU
)
kernel
= np
. ones
( ( 3 , 3 ) , np
. uint8
)
opening
= cv2
. morphologyEx
( thresh
, cv2
. MORPH_OPEN
, kernel
, iterations
= 2 )
sure_bg
= cv2
. dilate
( opening
, kernel
, iterations
= 3 ) cv2
. imshow
( "threshold" , thresh
)
cv2
. imshow
( "Opened image" , opening
)
cv2
. imshow
( "Dilated image" , sure_bg
) cv2
. waitKey
( )
cv2
. destroyAllWindows
( )
讀入圖像,轉換為灰度圖像; 使用大津算法二值化; 使用形態學開運算二次去掉小的白色噪點,使用膨脹運算確保背景與原圖一致
dist_transform
= cv2
. distanceTransform
( opening
, cv2
. DIST_L2
, 5 )
ret
, sure_bg
= cv2
. threshold
( dist_transform
, 0.7 * dist_transform
. max ( ) , 255 , 0 )
sure_fg
= np
. uint8
( sure_fg
)
unkown
= cv2
. subtract
( sure_bg
, sure_fg
) cv2
. imshow
( "dist_ret" , dist_transform
)
cv2
. imshow
( "threshold" , sure_fg
)
cv2
. imshow
( "unkown regions" , unkown
) cv2
. waitKey
( )
cv2
. destroyAllWindows
( )
使用距離變換(distance Transform)計算每個硬幣中心。采用腐蝕變換可以實現類似效果 使用閾值化得到分離的硬幣 通過相減得到相連接硬幣的不確定區域(有待分割計算)
ret
, markers
= cv2
. connectedComponents
( sure_fg
)
markers
= markers
+ 1
markers
[ unkown
== 255 ] = 0 markers
= cv2
. watershed
( img
, markers
)
img
[ markers
== - 1 ] = [ 255 , 0 , 0 ] markers
= np
. uint8
( markers
) cv2
. imshow
( 'result image' , img
)
cv2
. imshow
( 'result' , markers
) cv2
. waitKey
( )
cv2
. destroyAllWindows
( )
使用connectedComponents給每個連通區域做標記,標記從0開始。0為背景 標記值+1,讓標記從1開始 不確定區域標記置為0,便于下一步分割 使用watershed做分水嶺標記 分割線(水壩)用藍色標記
總結
以上是生活随笔 為你收集整理的图像分割II 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。