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

时间:2018-11-19 18:04:52

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

我正在使用Python研究OpenCV。我试图以PNG格式更改图片的颜色,但是PNG背景存在一些问题(图像具有透明背景)。

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


原始图片:

我的代码:

img = cv2.imread('line.png',cv2.IMREAD_UNCHANGED)
cv2.imshow('line',img)
cv2.waitKey()

输出图像:

所需的输出:

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

2 个答案:

答案 0 :(得分:1)

首先,我要说一下,如果使用cv2.imshow显示具有alpha透明度的图像,则透明区域将变为黑色。


由于您的输入图像已经包含Alpha通道,因此解决方案很简单-只需重复使用Alpha通道即可。

有一个小问题-尽管PNG格式允许使用alpha通道进行灰度处理,但AFAIK无法使用OpenCV编写此类图像。

因此解决方案非常简单:将经过处理的灰度图像转换为BGR,添加原始的Alpha通道,然后保存结果。

由于我们使用的是Python,因此图像表示为numpy数组,因此我们可以使用array indexing提取所需的通道。 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)

结果:

在不同的背景上有更多的介绍,因此您可以看到它非常透明:

  

答案 1 :(得分:0)

您必须在数组中添加第四个通道,以便可以在alpha通道中编码透明度信息。

这是一个python代码示例:

import cv2
file_name = "source.png"

src = cv2.imread(file_name, cv2.IMREAD_UNCHANGED)

# Save the transparency channel alpha
*_, alpha = cv2.split(src)

gray_layer = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

# ... Your image processing

# Duplicate the grayscale image to mimic the BGR image and finally add the transparency
dst = cv2.merge((gray_layer, gray_layer, gray_layer, alpha))
cv2.imwrite("result.png", dst)

灰色图像的结果:

Grey image with transparency

BGR图片的结果: