【问题标题】:Creating ROI mask by using drawContours in OpenCV在 OpenCV 中使用 drawContours 创建 ROI 掩码
【发布时间】:2019-01-12 03:55:23
【问题描述】:

我正在使用 drawContours 制作用于提取 ROI 的蒙版。

我已经定义了四个点和一个用于绘制轮廓的零掩码。

drawContours 函数的输出掩码有点像梯形,这正是我想要的。

但是,当我使用此掩码对图像进行 bitwise_and 处理时, 结果与面具的形状并不完全相同。

形状的边缘明显是锯齿状的。

这是我的python代码sn-p:

hull2 = cv2.convexHull(crop1)
mask10 = np.zeros(image.shape[:2], dtype = "uint8")
print(len(hull2))
cv2.drawContours(mask10, [hull2], -1,255, -1,cv2.LINE_AA)   


cv2.imshow("mask10",mask10)
cv2.waitKey(0)
crop = cv2.bitwise_and(image, image, mask=mask10)



cv2.imshow("crop",crop)
cv2.waitKey(0) 
cv2.drawContours(image, [hull2], -1, (0, 255, 0), -1,cv2.LINE_AA)
cv2.imshow("mask+img",image)
cv2.waitKey(0) 

这是显示结果的图片: "crop" is the ROI result image

感谢任何试图提供帮助的人。

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    当你的蒙版看起来有平滑边缘时,你得到锯齿状边缘的原因是因为你在 drawContours( - ,cv2.LINE_AA) 上使用了抗锯齿标志,它用较暗的像素填充锯齿状边缘的周围创建一个渐变,让您的眼睛误以为它是平滑的边缘。

    为什么这很重要?当您将 bitwise_and 与掩码一起使用时,掩码中大于 0 的任何值都被评估为“真”,并且将选择图像中的相应像素。 因此,尽管灰度值小于 255,但那些额外的 AA 像素正在扩展蒙版的边缘,从而在裁剪中创建锯齿状边缘。要模拟这一点,请执行 mask10[mask10 > 0] = 255; cv2.imshow('mask10', mask10) 应该和crop的形状一样。

    现在,作为解决您问题的一种可能方法,您可以使用 alpha 混合来使用这些额外 AA 像素的渐变(变暗强度)来使裁剪图像边缘像素变暗。

    mask_float = cv2.cvtColor(mask10, cv2.COLOR_GRAY2BGR).astype('float32') / 255
    image_float = image.astype('float32')
    crop = cv2.multiply(image_float, mask_float).astype('uint8')
    

    首先我们将 mask10 转换为 3 通道数组,以便我们可以将 alpha 混合应用到图像的所有 3 个 BGR 通道。

    然后我们将掩码标准化为 [0-1] 范围,因为我们需要在下一步中将值相乘,而 dtype uint8 不允许大于 255。所以首先转换为 float32,然后除以 255。(我们可以可能使用 cv2.normalize() 但 numpy 应该更快)

    然后我们将图像转换为 float32 以允许与掩码相乘。

    然后我们将图像与掩码相乘,得到前景到黑色背景的 alpha 混合图像,并将其转换回 uint8 用于 opencv。

    现在,由于 BGR 值从 float32 转换为 uint8,它将丢弃导致颜色变化可以忽略不计的十进制值。此外,我不是 100% 确定,但是由于将每个通道分别乘以相同的值(例如:20%),颜色可能会发生微小变化,或者它可能很好,我只是想多了?但这仅适用于那些变暗的 AA 像素,效果也应该可以忽略不计,而且我们已经在原版的基础上对其进行了修改,所以应该没问题!

    作为替代方案,您还可以将图像转换为 HLS,并将蒙版仅与 L 通道相乘。如果这很重要,我认为应该更真实地处理这些边缘上的图像颜色,并且允许较慢的速度

    【讨论】:

    • 你给我上了一课,解决了我的问题。非常感谢。但根据你的解释,我发现做 mask10[mask10 更容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2015-08-05
    • 2022-01-09
    相关资源
    最近更新 更多