Python opencv-使用二进制掩码将图像的一部分替换为另一部分,但锯齿线会妨碍良好的效果

Python opencv-使用二进制掩码将图像的一部分替换为另一部分,但锯齿线会妨碍良好的效果,python,opencv,mask,bitmask,Python,Opencv,Mask,Bitmask,我在Python中使用openCV中的二进制掩码,并使用fillConvexPoly创建了一个掩码。第一个结果可以在中看到。正如您所看到的,边缘并不平滑,而是看起来像楼梯 所以我在fillconvexpoly中使用了抗锯齿标志,即cv2.LINE_AA。正如您在中所看到的,结果看起来很有希望。问题是在按位操作中使用此掩码会导致错误。为什么? 好的,在仔细检查和查看实际像素值后,我可以看到这条线由像素值的减少表示,而不是像素(x,y)=255,像素(x+1,y)=0和像素(x+1,y+1)=255

我在Python中使用openCV中的二进制掩码,并使用fillConvexPoly创建了一个掩码。第一个结果可以在中看到。正如您所看到的,边缘并不平滑,而是看起来像楼梯

所以我在fillconvexpoly中使用了抗锯齿标志,即cv2.LINE_AA。正如您在中所看到的,结果看起来很有希望。问题是在按位操作中使用此掩码会导致错误。为什么?

好的,在仔细检查和查看实际像素值后,我可以看到这条线由像素值的减少表示,而不是像素(x,y)=255,像素(x+1,y)=0和像素(x+1,y+1)=255。在(大图)中,您可以看到一行中像素值的减少。在这里,你可以看到我想要的结果。我知道这在现实中是不可能的,因为直线没有这个角度,但是应该有一个更好的表示,如图1所示,对吗?。我之所以需要它,是因为我要用另一个图像替换图像的一部分,而遮罩代表替换的区域。我使用逐位运算得到结果。对0或255以外的值使用位运算会导致错误和不同的颜色等,所以我需要它为0或255。现在的结果在中,蓝色区域被替换(以前为红色)。正如你所看到的,结果不是很吸引人。如果这是一条“直线”,结果会更好。(顺便说一句,在直边上应用模糊会使其看起来很好,但在模糊后楼梯运动仍然可见)

我所尝试的:

  • 设置像素值的阈值。这将导致FILLCONVERXPOLY不带线_AA,这是合乎逻辑的,因为f.e.15像素的水平像素值减小,然后达到0,此时减小从下一行开始,这再次导致同一行中的15像素值减小。。。因此,对任何值进行阈值处理都会产生具有不同偏移的相同结果
  • 形态操作,如打开/关闭/膨胀/侵蚀等。不适用于这些类型的线条。当我读到它们的工作原理和用途时,也有点合乎逻辑
  • 随后模糊遮罩和阈值,从而产生相同的锯齿/楼梯边缘
  • 扫描stackoverflow几天以获得解决方案
  • 如果你对这个问题还有别的建议,我很乐意听听。 提前谢谢

    编辑:在最终结果上使用模糊非常适用于有很多步骤的线,例如每2或3个像素。发件人:。在边缘应用模糊: 但是在一条很长的线路上应用这种技术,只需几个步骤:原创:参见图5,和。如您所见,结果不错,但仍然包含这种逐步模式。真的想摆脱它。
    (从下面发出的光晕是我将来要处理的)

    您可以使用基于数组的权重的等效值来解决此问题。假设您有8位数组
    image
    overlay
    mask
    ,并且由于您的掩码似乎应用于覆盖而不是基本图像,您可以执行以下操作

    导入cv2
    将numpy作为np导入
    ... # 获取/读取图像和覆盖,创建遮罩
    alpha=掩码/255#转换为0-1范围,也可以使用cv2.normalize
    组合=np.uint8(叠加*α+图像*(1-α))
    
    图像1的分辨率似乎太低,无法获得所需的结果。每个阶梯状图案的高度保持为单个像素。你可以沿最终图像的边缘应用平滑函数。嗨,吉汉,谢谢你的建议,但我已经尝试过了。(我用我得到的编辑了我的文章)。结果不错,但仍然包含逐步模式。这不起作用。cv2.addWeighted将单个值作为alpha参数,而不是每个像素的权重。不过谢谢你的建议。抱歉-已经有一段时间了,我应该通过医生和测试来确认。我对解决方案进行了编辑,以包含一个手动实现,该实现接受基于数组的权重。