我正在用Python学习OpenCV。我试着用PNG格式改变图片的颜色,但是我对PNG背景有一些问题(图像有透明的背景)。
当我把它改成灰度时,背景变黑了--我的照片不再透明了。我想要的是保持画面的透明背景。
原始图像:
我的代码:
img = cv2.imread('line.png',cv2.IMREAD_UNCHANGED)
cv2.imshow('line',img)
cv2.waitKey()
输出图像:
期望输出:
边界图像周围的白色应该是透明的。我怎么能这么做?
发布于 2018-11-19 21:48:56
首先,让我提到,如果您使用cv2.imshow
显示具有alpha透明度的图像,那么透明区域将是黑色的。
因为您的输入映像已经包含了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)
结果:
再一次在不同的背景下,您可以看到它是非常透明的:
发布于 2018-11-19 18:07:40
您必须在数组中添加第四个通道,以便在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图像的结果:
https://stackoverflow.com/questions/53380318
复制相似问题