如何用透明背景和填充覆盖轮廓图像?

How to overlay outline Image with transparent background and filling?

我想拍摄一张图像,然后将其叠加为轮廓而不 background/filling。我有一张图片是 PNG 格式的轮廓,它的背景和轮廓内的内容都被删除了,这样打开时,除了轮廓之外的所有内容都是透明的,类似于这张图片:

但是,当我打开图像并尝试在 OpenCV 中叠加它时,轮廓内的背景和区域显示为全白,显示了图像尺寸的完整矩形并遮盖了背景图像。

然而,我想要做的是下面的,其中只有轮廓覆盖在背景图像上,如下所示:

如果你也能帮我改变轮廓的颜色,加分。

我不想处理任何与 alpha 的混合,因为我需要背景完整显示,并且希望轮廓非常清晰。

在这种特殊情况下,您的图像有一些您可以使用的 alpha 通道。在“背景”图像 w.r.t 中使用 Boolean array indexing, you can access all values 255 in the alpha channel. What's left to do, is setting up some region of interest (ROI)。某个位置,在该 ROI 中,您再次使用布尔数组索引将所有像素设置为某种颜色,即红色。

这是一些代码:

import cv2

# Open overlay image, and its dimensions
overlay_img = cv2.imread('1W7HZ.png', cv2.IMREAD_UNCHANGED)
h, w = overlay_img.shape[:2]

# In this special case, take the alpha channel of the overlay image, and
# check for value 255; idx is a Boolean array
idx = overlay_img[:, :, 3] == 255

# Open image to work on
img = cv2.imread('path/to/your/image.jpg')

# Position for overlay image
top, left = (50, 50)

# Access region of interest with overlay image's dimensions at position
#   img[top:top+h, left:left+w]   and there, use Boolean array indexing
# to set the color to red (for example)
img[top:top+h, left:left+w, :][idx] = (0, 0, 255)

# Save image
cv2.imwrite('output.png', img)

这是一些随机“背景”图像的输出:

对于一般情况,即没有适当的 alpha 通道,您可以对叠加图像设置阈值,为布尔数组索引设置适当的掩码。

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.5
OpenCV:      4.5.1
----------------------------------------