分水嶺算法是一種基于區域分割的算法。它是基于地理形態的分析的圖像分割算法,模仿地理結構(比如山川、溝壑,盆地)來實現對不同物體的分類。
圖像的灰度空間很像地球表面的整個地理結構,每個像素的灰度值代表高度。其中的灰度值較大的像素連成的線可以看做山脊,也就是分水嶺。其中的水就是用于二值化的gray threshold level,二值化閾值可以理解為水平面,比水平面低的區域會被淹沒,剛開始用水填充每個孤立的山谷(局部最小值)。當水平面上升到一定高度時,水就會溢出當前山谷,可以通過在分水嶺上修大壩,從而避免兩個山谷的水匯集,這樣圖像就被分成2個像素集,一個是被水淹沒的山谷像素集,一個是分水嶺線像素集。最終這些大壩形成的線就對整個圖像進行了分區,實現對圖像的分割。在該算法中,空間上相鄰并且灰度值相近的像素被劃分為一個區域。
分水嶺算法的運行過程:
用上面的算法對圖像進行分水嶺運算,由于噪聲點或其它因素的干擾,可能會得到密密麻麻的小區域,即圖像被分得太細(over-segmented,過度分割),這因為圖像中有非常多的局部極小值點,每個點都會自成一個小區域。
其中的解決方法:
下面三個圖分別是原圖,分水嶺過分割的圖以及基于標記的分水嶺算法得到的圖:
其中標記的每個點就相當于分水嶺中的注水點,從這些點開始注水使得水平面上升,但是如上圖所示,圖像中需要分割的區域太多了,手動標記太麻煩,我們可是使用距離轉換的方法進行標記,OpenCV中就是使用的這種方法。
在OpenCV中,我們需要給不同區域貼上不同的標簽。用大于1的整數表示我們確定為前景或對象的區域,用1表示我們確定為背景或非對象的區域,最后用0表示我們無法確定的區域。然后應用分水嶺算法,我們的標記圖像將被更新,更新后的標記圖像的邊界像素值為-1。
下面對相互接觸的硬幣應用距離變換和分水嶺分割。
圖6
先使用 Otsu's 二值化對圖像進行二值化。
import cv2import numpy as npimg = cv2.imread('coins.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
圖7
先使用開運算去除圖像中的細小白色噪點,然后通過腐蝕運算移除邊界像素,得到的圖像中的白色區域肯定是真實前景,即靠近硬幣中心的區域(下面左邊的圖);膨脹運算使得一部分背景成為了物體到的邊界,得到的圖像中的黑色區域肯定是真實背景,即遠離硬幣的區域(下面中間的圖)。
剩下的區域(硬幣的邊界附近)還不能確定是前景還是背景??赏ㄟ^膨脹圖減去腐蝕圖得到,下圖中的白色部分為不確定區域(下面右邊的圖)。
# noise removalkernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)sure_bg = cv2.dilate(opening, kernel, iterations=2) # sure background areasure_fg = cv2.erode(opening, kernel, iterations=2) # sure foreground areaunknown = cv2.subtract(sure_bg, sure_fg) # unknown area
圖8
剩下的區域不確定是硬幣還是背景,這些區域通常在前景和背景接觸的區域(或者兩個不同硬幣接觸的區域),我們稱之為邊界。通過分水嶺算法應該能找到確定的邊界。
由于硬幣之間彼此接觸,我們使用另一個確定前景的方法,就是帶閾值的距離變換。
下面左邊的圖為得到的距離轉換圖像,其中每個像素的值為其到最近的背景像素(灰度值為0)的距離,可以看到硬幣的中心像素值最大(中心離背景像素最遠)。對其進行二值處理就得到了分離的前景圖(下面中間的圖),白色區域肯定是硬幣區域,而且還相互分離,下面右邊的圖為之前的膨脹圖減去中間這個表示前景的圖。
# Perform the distance transform algorithmdist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)# Normalize the distance image for range = {0.0, 1.0}cv2.normalize(dist_transform, dist_transform, 0, 1.0, cv2.NORM_MINMAX)# Finding sure foreground arearet, sure_fg = cv2.threshold(dist_transform, 0.5*dist_transform.max(), 255, 0)# Finding unknown regionsure_fg = np.uint8(sure_fg)unknown = cv2.subtract(sure_bg,sure_fg)
圖9
現在我們可以確定哪些是硬幣區域,哪些是背景區域。然后創建標記(marker,它是一個與原始圖像大小相同的矩陣,int32數據類型),表示其中的每個區域。分水嶺算法將標記的0的區域視為不確定區域,將標記為1的區域視為背景區域,將標記大于1的正整數表示我們想得到的前景。
我們可以使用 cv2.connectedComponents() 來實現這個功能,它是用0標記圖像的背景,用大于0的整數標記其他對象。所以我們需要對其進行加一,用1來標記圖像的背景。
cv2.connectedComponents() 將傳入圖像中的白色區域視為組件(前景)。
# Marker labellingret, markers = cv2.connectedComponents(sure_fg)# Add one to all labels so that sure background is not 0, but 1markers = markers+1# Now, mark the region of unknown with zeromarkers[unknown==255] = 0
注意:得到的markers矩陣的元素類型為 int32,要使用 imshow() 進行顯示,需要將其轉換為 uint8 類型( markers=np.uint8(markers) )。
我們對得到的markers進行顯示:
markers_copy = markers.copy()markers_copy[markers==0] = 150 # 灰色表示背景markers_copy[markers==1] = 0 # 黑色表示背景markers_copy[markers>1] = 255 # 白色表示前景markers_copy = np.uint8(markers_copy)
圖10
標記圖像已經完成了,最后應用分水嶺算法。然后標記圖像將被修改,邊界區域將被標記為-1。
# 使用分水嶺算法執行基于標記的圖像分割,將圖像中的對象與背景分離markers = cv2.watershed(img, markers)img[markers==-1] = [0,0,255] # 將邊界標記為紅色
經過分水嶺算法得到的新的標記圖像和分割后的圖像如下圖所示:
圖11
任何兩個相鄰連接的組件不一定被分水嶺邊界(-1的像素)分開;例如在傳遞給 watershed 函數的初始標記圖像中的物體相互接觸。
我們通過一個例子介紹了分水嶺算法的整個過程,主要分為以下幾步:
參考鏈接https://zhuanlan.zhihu.com/p/67741538
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
ps怎么讓皮膚變白?使用軟件版本:PS CS6版本使用Photoshop對人物皮膚進行如下美白:1.打開PS軟件,放入要蒙皮的人的圖像,Ctrl J復制一層;2.執行 amp的設置參數過濾gt雜散gt減少雜散gt先進gt每個頻道在菜單欄中如下:紅色強度10-保留細節100%綠色強度10-保留細節6%藍色強度10-保留細節6%。3.執行命令 "濾鏡gt銳化gtUSM銳化 "在菜單欄中。設置參數個數:...
《踏山河》完整版歌詞歌曲踏山河完整版歌詞?踏山河歌詞曲原唱?《踏山河》是由祝何作詞,祝何作曲,由歌手“是七叔呢”演唱的歌曲,收錄于同名專輯《踏山河》,于2020年11月19日發行。歌詞:秋風落日入長河 ,江南煙雨行舟;亂石穿空 ,卷起多少的烽火;萬里山河都踏過 ,天下又入誰手;分分合合 ,不過幾十載春秋;我在 十面埋伏, 四面楚歌的時候;把酒與蒼天對酌,縱然一去不回 此戰又如何;誰見 萬箭齊發 星...
世界十大名牌音箱都有哪些?世界十大名牌音箱主要包括:荷蘭的AVANCE,英國KEF和Acoystic,德國ELAC,美國JBL,荷蘭尊寶,英國的天郎、ATC,也有丹拿和Bowers amp Wilkins。以下屬于詳解:;1、Bowers amp Wilkins被稱作是皇室的最佳選擇商品,于1966年在英國開創,是全世界頂級的音響品牌;2、丹拿是由Wilfried Ehrenholz在1977年所...