OpenCV+python:分水岭算法
生活随笔
收集整理的這篇文章主要介紹了
OpenCV+python:分水岭算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1,概念簡介
現實中我們可以或者說可以想象有山有湖的景象,那么那一定是水繞 山,山圍水的情形。當然在需要的時候,要人工構筑分水嶺,以防集水盆之間的互相穿透。而區分高山(plateaus)與水的界線,以及湖與湖之間的間隔或 都是連通的關系,就是我們可愛的分水嶺(watershed)
分水嶺算法是在分割的過程中,它會把跟臨近像素間的相似性作為重要的參考依據,從而將在空間位置上相近并且灰度值相近(求梯度)的像素點互相連接起來構成一個封閉的輪廓。
分水嶺算法常用的操作步驟:彩色圖像灰度化,然后再求梯度圖,最后在梯度圖的基礎上進行分水嶺算法,求得分段圖像的邊緣線。
如果圖像中的目標物體是連接在一起的,則分割起來會更困難,分水嶺分割算法經常用于處理這類問題,通常會取得比較好的效果。分水嶺分割算法把圖像看成一幅“地形圖”,其中亮度比較強的區域像素值較大,而比較暗的區域像素值較小,通過尋找“匯水盆地”和“分水嶺界限”,對圖像進行分割。
2,源代碼
import cv2 as cv
import numpy as npdef watershed_demo():# print(src.shape)blurred = cv.pyrMeanShiftFiltering(src, 10, 100) #邊緣保留濾波去噪# gray\binary imagegray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY) #轉化為灰度圖ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #二值化cv.imshow("binary-image", binary)# morphology operation形態學操作kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) #構造結構mb = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=2) #連續兩次開操作(去除圖像中的任何小的白噪聲);閉運算(為了去除物體上的小洞)sure_bg = cv.dilate(mb, kernel, iterations=3) #連續三次膨脹操作cv.imshow("mor-opt", sure_bg)# distance transformdist = cv.distanceTransform(mb, cv.DIST_L2, 3)#距離變化(提取出我們確信它們是硬幣的區域)dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)#歸一化dist_output1 = np.uint8(dist_output)ret, surface = cv.threshold(dist, dist.max()*0.6, 255, cv.THRESH_BINARY)surface_fg = np.uint8(surface)#將float類型轉化為uintcv.imshow("surface-bin", surface_fg)unknown = cv.subtract(sure_bg, surface_fg)#除種子以外的區域(剩下的區域是我們不知道的區域,無論是硬幣還是背景.分水嶺算法應該找到它)ret, markers = cv.connectedComponents(surface_fg) #求連通區域(創建標記:它是一個與原始圖像相同大小的數組,但使用int32數據類型,并對其內部的區域進行標記.)# watershed transform 分水嶺變換markers = markers + 1 # Add one to all labels so that sure background is not 0, but 1markers[unknown==255] = 0 # mark the region of unknown with zeromarkers = cv.watershed(src, markers=markers)src[markers==-1] = [0, 0, 255]#標記cv.imshow("result", src)src = cv.imread("F:/images/coins.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
watershed_demo()
cv.waitKey(0)cv.destroyAllWindows()
總結
以上是生活随笔為你收集整理的OpenCV+python:分水岭算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV+python:顶帽、黑帽、
- 下一篇: OpenCV+python:人脸检测