1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > OpenCV - 分水岭算法图像分割(Python实现)

OpenCV - 分水岭算法图像分割(Python实现)

时间:2024-03-27 07:37:43

相关推荐

OpenCV - 分水岭算法图像分割(Python实现)

原理

分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。

代码

import numpy as npimport cv2from matplotlib import pyplot as pltimg = cv2.imread('img.jpg')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# noise removalkernel = np.ones((3,3),np.uint8)opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2) # 形态开运算# sure background areasure_bg = cv2.dilate(opening,kernel,iterations=3)# Finding sure foreground areadist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)# Finding unknown regionsure_fg = np.uint8(sure_fg)unknown = cv2.subtract(sure_bg,sure_fg)# 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] = 0markers = cv2.watershed(img,markers)img[markers == -1] = [255,0,0]cv2.imshow('img',img)cv2.waitKey(0)cv2.destroyAllWindows()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。