关于使用Python的后台transparent.png格式OpenCV的问题

2024-06-17 12:07:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python研究OpenCV。我试着用PNG格式改变图片的颜色,但是我遇到了一些PNG背景的问题(图像有透明的背景)。在

当我把它变成灰度时,背景变成了黑色——我的照片不再透明了。我想要的是保持图片的透明背景。在


原始图像:

我的代码:

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

输出图像:

期望输出:

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


Tags: 代码图像imgpng颜色格式line图片
2条回答

您必须在数组中添加第四个通道,以便透明度信息可以在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图像的结果:

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


因为输入图像已经包含了alpha通道,所以解决方案很简单,只需重用alpha通道。在

尽管PNG格式允许alpha通道具有灰度,但有一个小问题,AFAIK没有办法用OpenCV编写这样的图像。在

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

因为我们使用Python,因此图像被表示为numpy数组,所以我们可以使用array indexing来提取我们需要的通道。^{}允许我们轻松添加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)

结果:

在不同的背景下,您可以看到它是真正透明的:

相关问题 更多 >