欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于OpenCV-Python中文教程中分水岭算法中输出图像的问题

程序员文章站 2024-01-28 09:57:22
...

在OpenCV-Python中文教程的分水岭算法示例中,对接触的钱币使用分水岭算法进行计数,其计算过程中对程序输出的图像并没有十分详细的解释。
关于OpenCV-Python中文教程中分水岭算法中输出图像的问题
如在Distance Transfrom中并未说明如何输出下图中硬币的骨架图片。
关于OpenCV-Python中文教程中分水岭算法中输出图像的问题
以及在使用cv2.connectedComponents()标记后,如何对图片使用colormap着色。
关于OpenCV-Python中文教程中分水岭算法中输出图像的问题
首先,对于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()

输出的图片如下图
关于OpenCV-Python中文教程中分水岭算法中输出图像的问题