【问题标题】:How to superimpose masked part of image to a new image?如何将图像的蒙版部分叠加到新图像上?
【发布时间】:2019-05-16 07:37:41
【问题描述】:

对于这个基本问题,我真的很抱歉,但我是 OpenCV 和图像处理的新手,在摆弄了一段时间后无法弄清楚。

这是我想要做的:

我有一个透明的 PNG 图片:

我创建了一个二进制蒙版,透明区域为黑色,对象为白色:

现在,我有另一个这样的图像,具有相同的尺寸:

现在,我希望将第一张图像(实际对象)中的白色蒙版部分叠加到这张图像上。我该怎么做?

【问题讨论】:

  • c++ 语法有一个 mat.copyTo(mat, mask) 函数。不确定python语法。确保两个图像具有相同的大小,或者使用子图像。
  • 可能是这里的博客帖子sourcecodezoneseven.blogspot.com/2019/05/… 可能会有所帮助,这也正在做类似的事情。

标签: python python-3.x opencv image-processing


【解决方案1】:

这是一种方法:

import cv2

# Load images
bg     = cv2.imread('bg.png')                                                                 
obj = cv2.imread('object.png')                                                         
mask   = cv2.imread('mask.png')                                                             

# Zero background where we want to overlay
bg[mask>0]=0                                                                              

# Add object to zeroed out space
bg += obj*(mask>0)                                                                     

cv2.imwrite('result.png',bg)  

【讨论】:

    【解决方案2】:

    利用我们手头有 numpy 数组的事实,我们可以首先将掩码扩展到三个维度:

    # Case 1: original mask is OpenCV mask (foreground values 255)
    mask = np.dstack([(mask > 0)]*3)
    # Case 2: original mask is already boolean
    mask = np.dstack([mask]*3)
    

    然后使用蒙版复制图像:

    np.copyto(background, foreground, where=mask)
    

    【讨论】:

    • 我的面具的形状是(300,300),而source1和source2都是(300,300,3)。这给了我一个错误:“ValueError:操作数无法与形状(300,300)(300,300,3)一起广播”。
    • 是的,我只是想分享一下总体思路。它与 C++ OpenCV Mat 对象的工作方式类似,但在具有 ndarrays 的 Python 中,您必须做更多的事情。您可以在第三维扩展蒙版。我有这方面的 python 代码,我可以稍后发布。
    • 哦,我明白了!非常感谢!我会尝试扩展面具的尺寸。
    • 我使用np.dstack 来扩展我的面具。这应该可以工作:mask = np.dstack([mask]*3),或者只是mask = np.dstack((mask, mask, mask))。但我将编辑我的答案,以单独使用 np 提供更好的解决方案。
    • 为了扩展掩码,我这样做了:_, extended_mask = np.broadcast_arrays(source1, mask[..., None])。有效。我也会试试你的代码,看看我能不能让它更快。感谢您的帮助! :)
    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 2020-03-30
    • 2021-09-13
    • 2015-07-09
    • 2012-12-09
    • 2019-12-24
    • 1970-01-01
    • 2021-09-06
    相关资源
    最近更新 更多