首页 > 解决方案 > Python OpenCV.fillPoly() 没有填充我的多边形。为什么?

问题描述

使用 OpenCV for Python,我试图获取图像中噪声元素的掩码,以便稍后用作cv.inpaint()函数的输入。

我在input_mtx_8u变量中得到一个灰度图像(值从 0 到 255 的二维矩阵),带有噪声(值非常低的孤立多边形)。

到目前为止,我所做的是:

  1. 获取梯度大于 25 的边缘:
laplacian = cv2.Laplacian(input_mtx_8u, cv2.CV_8UC1)
lapl_bin, lapl_bin_val = cv2.threshold(laplacian, 25, 255, cv2.THRESH_BINARY)
  1. 获取工件的轮廓
contours, _ = cv2.findContours(lapl_bin_val, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
  1. 填充确定的轮廓
filled_mtx = input_mtx_8u.copy()
cv2.fillPoly(filled_mtx, contours, (255, 255, 0), 4)

出于某种原因,我的“填充多边形”没有完全填充(见图)。我做错了什么?

在此处输入图像描述

标签: pythonopencv

解决方案


正如@fmw42 所指出的,填充轮廓的解决方案是使用 drawContours()而不是fillPoly().

我得到的最终工作代码是:

# input_mtx_8u = 2D matrix with uint8 values from 0 to 255

laplacian = cv2.Laplacian(input_mtx_8u, cv2.CV_8UC1)
lapl_bin, lapl_bin_val = cv2.threshold(laplacian, 25, 255, cv2.THRESH_BINARY)

contours, _ = cv2.findContours(lapl_bin_val, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

inpaint_mask = np.zeros(input_mtx_8u.shape, dtype=np.uint8)
for contour in contours:
    cv2.drawContours(inpaint_mask, [contour], -1, (255, 0, 0), thickness=-1)

# inpaint_mask = can be used as the mask for cv2.inpaint()

请注意,出于某种原因:

cv2.drawContours(input_mtx_cont, contours, -1, (255, 0, 0), thickness=-1)

不起作用。必须循环并逐个轮廓绘制轮廓...


推荐阅读