关于背景透明.png格式OpenCV与Python的问题

Nek*_*eko 7 python png opencv image python-3.x

我正在用 Python 学习 OpenCV。我试图以 PNG 格式更改图片的颜色,但我遇到了 PNG 背景的一些问题(图像具有透明背景)。

当我将其更改为灰度时,背景已更改为黑色——我的图片不再透明。我想要的是保持图片的透明背景。


原图:

我的代码:

img = cv2.imread('line.png',cv2.IMREAD_UNCHANGED)
cv2.imshow('line',img)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)

输出图像:

期望的输出:

边框图像周围的白色应该是透明的。我怎么能做到这一点?

Dan*_*šek 9

首先,让我提一下,如果您使用 alpha 透明度显示图像,cv2.imshow那么透明区域将是黑色的。


由于您的输入图像已经包含一个 alpha 通道,解决方案很简单——只需重用 alpha 通道。

有一个小问题——即使 PNG 格式允许具有 alpha 通道的灰度,AFAIK 也无法用 OpenCV 编写这样的图像。

因此解决方案很简单:将处理后的灰度图像转换回 BGR,添加原始 alpha 通道,并保存结果。

由于我们在 Python 中,因此图像表示为一个 numpy 数组,我们可以使用数组索引来提取我们需要的通道。numpy.dstack允许我们轻松添加 alpha 通道。


示例代码:

import cv2
import numpy as np

src = cv2.imread('51IgH.png', cv2.IMREAD_UNCHANGED)

bgr = src[:,:,:3] # Channels 0..2
gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)

# Some sort of processing...

bgr = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
alpha = src[:,:,3] # Channel 3
result = np.dstack([bgr, alpha]) # Add the alpha channel

cv2.imwrite('51IgH_result.png', result)
Run Code Online (Sandbox Code Playgroud)

结果:

再一次在不同的背景上,所以你可以看到它真的很透明: