我正在使用Python研究OpenCV。我试图以PNG格式更改图片的颜色,但是PNG背景存在一些问题(图像具有透明背景)。
当我将其更改为灰度时,背景已更改为黑色-我的图片不再透明。我想要的是保持图片的透明背景。
原始图片:
我的代码:
img = cv2.imread('line.png',cv2.IMREAD_UNCHANGED)
cv2.imshow('line',img)
cv2.waitKey()
输出图像:
所需的输出:
边框图像周围的白色应该是透明的。我该怎么做?
答案 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)
灰色图像的结果:
BGR图片的结果: