本文介紹了python opencv之分水嶺算法示例,分享給大家,具體如下:
目標
原理:
灰度圖像可以被看成拓撲平面,灰度值高的區域可以看出山峰,灰度值低的區域可以看成是山谷。向每一個山谷當中灌不同顏色的水。水位升高,不同山谷的水會匯合,為防止不同山谷的水匯合,小在匯合處建立起堤壩。然后繼續灌水,然后再建立堤壩,直到山峰都掩模。構建好的堤壩就是圖像的分割。
此方法通常會得到過渡分割的結果,因為圖像中的噪聲以及其他因素。為了減少此影響,opencv使用基于標記的分水嶺算法,此算法要設置哪些山谷中的匯合點,哪些不是。這是一種交互式的圖像分割算法那。我們要給已知對象打上不同表情。如果某個區域肯定是前景或對象,就使用某個顏色或灰度值標簽標記它。如果是背景那么使用其他顏色進行標記,其余不能確定的部分用0標記。然后使用分水嶺算法,每次灌水,標簽會被更新,當兩個不同顏色的標簽相遇就會構建堤壩,知道所有山峰掩模,最后得到的邊界對象值是-1。
代碼:
對挨在一起的對象進行分割。

使用Otsu's 二值化后的結果為

要出去圖像中的白噪聲??梢允褂眯螒B學運算,使用閉運算去除對象中的空洞。
靠近對象中心的區域是前景,離對象遠的區域是背景,不確定的區域是邊界。
首先提取硬幣區域,使用腐蝕操作去掉邊緣,剩下的就是硬幣。但硬幣沒有接觸時,此方法有效,但是由于硬幣相互接觸,就要使用另外一種有效的方法:距離變換加上合適的閾值。
之后,要尋找不確定是否是硬幣的區域。這里需要膨脹操作。膨脹操作會將對象邊界延伸到背景當中。由于邊界區域被去除,現在就能知道哪些區域是前景,哪些是背景。
余下的區域不知道如何區分,那么使用分水嶺算法。這些區域通常是前景與背景的交界處。從能否確認是否是背景的區域中減去確定是前景的區域就得到了邊界。
(前景和背景)

(上面的圖是直接使用作者的代碼后生產的結果,提取到了前景,為了演示一下不確定的區域,調了一下計算前景的距離變換的參數,使得中間出現不確定的區域)
新聞熱點
疑難解答