首先,如果您使用cv2.imshow
显示具有alpha透明度的图像,则透明区域将是黑色的。
由于您的输入图像已经包含了一个alpha通道,所以解决方案很简单--只需重复使用alpha通道即可。
但有一个小问题--尽管PNG格式允许带有alpha通道的灰度图像,但我认为没有办法使用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)
结果:
再次展示在不同的背景下,您可以看到它真正的透明度:
您需要在数组中添加第四个通道,以便透明度信息可以编码在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 图像的结果:
cv2.imread
中的 1
应该替换为 cv2.IMREAD_COLOR
。| 但是,再次查看这个问题,似乎很多操作都是不必要的。OP 的输入图像已经包含了透明通道,所以没有必要再使用 threshold
来确定它。 - Dan Mašek
imshow
,那么透明区域将是黑色的(因为这是使用的背景 - 窗口本身不透明)。其次,即使PNG支持灰度+ alpha,我也不知道如何使用OpenCV保存这样的图像。 - Dan Mašek