首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python实现背景透明.png格式OpenCV的问题

用Python实现背景透明.png格式OpenCV的问题
EN

Stack Overflow用户
提问于 2018-11-19 18:04:51
回答 2查看 21.5K关注 0票数 8

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

当我把它改成灰度时,背景变黑了--我的照片不再透明了。我想要的是保持画面的透明背景。

原始图像:

我的代码:

代码语言:javascript
运行
复制
img = cv2.imread('line.png',cv2.IMREAD_UNCHANGED)
cv2.imshow('line',img)
cv2.waitKey()

输出图像:

期望输出:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-19 21:48:56

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

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

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

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

因为我们使用Python,因此图像被表示为一个numpy数组,所以我们可以使用数组索引提取我们需要的通道。numpy.dstack允许我们轻松地添加alpha通道。

示例代码:

代码语言:javascript
运行
复制
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)

结果:

再一次在不同的背景下,您可以看到它是非常透明的:

票数 11
EN

Stack Overflow用户

发布于 2018-11-19 18:07:40

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

下面是一个python代码示例:

代码语言:javascript
运行
复制
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图像的结果:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53380318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档