【发布时间】:2014-11-26 13:20:18
【问题描述】:
我正在尝试使用 openCV 中的 Canny 过滤器识别轮廓并填充轮廓,以创建蒙版。我有这种起始图像:
我正在尝试识别图像中的所有特征,绘制轮廓并填充它们。我正在尝试在 openCV 中使用此代码来实现它:
img = cv2.imread(os.path.join(fName,f), 0)
img = cv2.GaussianBlur(img,(5,5),0)
cv2.bilateralFilter(img, 9, 150,450)
edge = np.zeros((img.shape[0] + 2, img.shape[1] + 2), np.uint8)
edge = cv2.Canny(img, 500, 300, apertureSize=5)
cont, heir = cv2.findContours(edge.copy(), cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
contours = [cv2.approxPolyDP(cnt, 3, True) for cnt in cont]
cv2.morphologyEx(img, cv2.MORPH_CLOSE, np.ones((5,5), dtype='uint8'))
cv2.drawContours(img, contours, -1, 255, -1)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
大多数情况下,我在猜测参数(反复试验;这很难!)。不幸的是,我得到的不是整齐的轮廓,而是用白色填充的,更像是这样的:
有什么想法吗?显然,我需要更好地关闭边缘,并调整我的一些 Canny 参数,但我真的可以使用一些指导。
谢谢!
编辑:阈值不能很好地创建我想要的那种蒙版,要么: 我认为我的“亮”点没有比背景足够亮,但我会喜欢在黑色背景上有白点。
代码:
img = cv2.imread(os.path.join(fName,f), 0)
cv2.bilateralFilter(img, 9, 90,16)
#img = cv2.GaussianBlur(img,(5,5),0)
#binImg = np.zeros((img.shape[0], img.shape[1]), np.uint8)
binImg = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 2)
#binImg = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#newimg = np.multiply(img, np.divide(edge, 255.0))
plt.imshow(binImg, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
#plt.show()
【问题讨论】: