关于OpenCV-Python中文教程中分水岭算法中输出图像的问题
程序员文章站
2024-01-28 09:57:22
...
在OpenCV-Python中文教程的分水岭算法示例中,对接触的钱币使用分水岭算法进行计数,其计算过程中对程序输出的图像并没有十分详细的解释。
如在Distance Transfrom中并未说明如何输出下图中硬币的骨架图片。
以及在使用cv2.connectedComponents()标记后,如何对图片使用colormap着色。
首先,对于cv2.distanceTransform和cv2.connectedComponents,其输出的格式均为32位浮点型矩阵,在imshow之前需要先使用cv2.normalize将图像转化成0-255对应的unit8格式。
之后,对用cv2.connectedComponents标记过的图像使用cv2.applyColorMap着色。
import cv2
import numpy as np
img = cv2.imread("water_coins.jpg")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret1, thresh1 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# 消除噪音
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh1,cv2.MORPH_OPEN,kernel,iterations=2)
# 确定的背景区域
sure_bg = cv2.dilate(opening,kernel,iterations=3)
# 寻找确定的前景区域
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
''' 这里使用cv2.normalize将32位矩阵归一化成unit8格式(cv2.CV_8UC1) '''
dist2 = cv2.normalize(dist_transform, None, 255,0, cv2.NORM_MINMAX, cv2.CV_8UC1)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
# 寻找未知区域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
# Marker labelling
ret, markers1 = cv2.connectedComponents(sure_fg)
# Add one to all labels so that sure background is not 0, but 1
markers = markers1+1
# Now, mark the region of unknown with zero
markers[unknown==255] = 0
markers3 = cv2.watershed(img,markers)
img[markers3 == -1] = [255,0,0]
''' 这里使用cv2.normalize将32位矩阵归一化成unit8格式(cv2.CV_8UC1) '''
''' 再使用cv2.applyColorMap着色 '''
img_markers = cv2.normalize(markers3, None, 255,0, cv2.NORM_MINMAX, cv2.CV_8UC1)
im_color = cv2.applyColorMap(img_markers,cv2.COLORMAP_JET)
cv2.imshow("opening",opening)
cv2.imshow("sure_bg",sure_bg)
cv2.imshow("dist2",dist2)
cv2.imshow("sure_fg",sure_fg)
cv2.imshow("unknown",unknown)
cv2.imshow("im_color",im_color)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出的图片如下图
下一篇: php学习之道:WSDL详解(二)