python - Python OpenCV.fillPoly() 没有填充我的多边形。为什么?
问题描述
使用 OpenCV for Python,我试图获取图像中噪声元素的掩码,以便稍后用作cv.inpaint()
函数的输入。
我在input_mtx_8u
变量中得到一个灰度图像(值从 0 到 255 的二维矩阵),带有噪声(值非常低的孤立多边形)。
到目前为止,我所做的是:
- 获取梯度大于 25 的边缘:
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)
- 填充确定的轮廓
filled_mtx = input_mtx_8u.copy()
cv2.fillPoly(filled_mtx, contours, (255, 255, 0), 4)
出于某种原因,我的“填充多边形”没有完全填充(见图)。我做错了什么?
解决方案
正如@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)
不起作用。必须循环并逐个轮廓绘制轮廓...
推荐阅读
- javascript - ReactJS:eventListener tranistionend 没有在 useEffect 中被清理
- java - 我如何在 Java 中获得插入符号位置
- android - 允许录制屏幕未在 android 的应用程序外部显示
- python - 如何找到关于某个坐标的表面的最近点?
- git - git合并开发和主问题
- python - pyldavis AttributeError:“DataFrame”对象没有属性“ix”
- c# - 协变接口不可能包含类型参数是协变类型的泛型类型吗?
- c++ - 如何使用自定义 BoringSSL 符号前缀构建 GRPC?
- python-3.x - 如何过度分配作业或“回收” SLURM 分配,以便它也可以被另一个作业使用?
- flutter - 独立为图像的每个部分着色