如何使用opencv python在闭合曲线中正确填充颜色

Posted

技术标签:

【中文标题】如何使用opencv python在闭合曲线中正确填充颜色【英文标题】:How to fill color correctly in closed curve using opencv python 【发布时间】:2022-01-16 05:12:13 【问题描述】:

我想使用填充操作填充黑白图像,但如第一行图像所示,某些部分缺失,并且某些部分未正确填充(看起来某些部分与主要对象分离),如第二行图像所示。为了描述,我在下面展示了一些例子:

洪水填充之前与之后:

下面是我的代码:

 im_in = cv2.imread(path to image,cv2.IMREAD_GRAYSCALE)
 th, im_th = cv2.threshold(im_in, 220, 255, cv2.THRESH_BINARY_INV)
 im_floodfill = im_th.copy()
 h, w = im_th.shape[:2]
 mask = np.zeros((h+2, w+2), np.uint8)
 cv2.floodFill(im_floodfill, mask, (0,0), 255)

请指教

谢谢

【问题讨论】:

相关:forum.opencv.org/t/… 【参考方案1】:

图像的某些部分似乎缺失的原因是因为cv2.floodFill() 方法没有将形状的轮廓作为需要填充的区域的一部分。

如果你想保留这些行,你可以在cv2.findContours()方法中使用cv2.RETR_TREE标志:

import cv2
import numpy as np

img = cv2.imread("image.png", cv2.IMREAD_GRAYSCALE)
img_canny = cv2.Canny(img, 50, 50)
img_dilate = cv2.dilate(img_canny, None, iterations=1)
img_erode = cv2.erode(img_dilate, None, iterations=1)

mask = np.full(img.shape, 255, "uint8")
contours, hierarchies = cv2.findContours(img_erode, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(mask, [cnt], -1, 0, -1)
    
cv2.imshow("result", mask)
cv2.waitKey(0)

输入文件:

输出文件:

【讨论】:

以上是关于如何使用opencv python在闭合曲线中正确填充颜色的主要内容,如果未能解决你的问题,请参考以下文章

opencv边缘检测 不闭合

有没有办法使用 cv2.approxPolyDP 来近似开放曲线?

教你如何使用 OpenCV检测图像中的轮廓

教你如何使用 OpenCV检测图像中的轮廓

如何使用 Python/Opencv 分割二进制图像中的附近元素

使用 OpenCV 进行垂直曲线检测