将PNG的PIL图像转换为OpenCV图像会用黑色背景替代透明度。

3

当我尝试将PNG类型的PIL图像转换为OpenCV图像时,PNG中的透明背景会变成黑色背景。如何在OpenCV图像对象中保留透明背景。

以下是代码片段:

# PIL Image object which holds a transparent background png image.  
pil_img = Image.open(ioFile).convert('RGBA')
pil_img.show()

# I use numpy to convert the pil_image into a numpy array
numpy_image = np.array(pil_img)

# I convert to a openCV2 image, notice the COLOR_RGB2BGR which means that
# the color is converted from RGBA to BGR format
opencvImage = cv2.cvtColor(numpy_image, cv2.COLOR_RGBA2BGRA)
# 
#(I commented below lines, to show that I tried them but did not work.)
#
# opencvImage = cv2.cvtColor(numpy_image, cv2.IMREAD_UNCHANGED)
# opencvImage = cv2.cvtColor(numpy_image,  cv2.COLOR_RGB2BGR)
showImage(opencvImage) 

代码的最后一行显示了一个黑色背景的图片。我可能选择了错误的转换方法,找不到合适的方法。

1
如果您将其转换为BGR,则会丢失透明通道(alpha),这将是BGR通道具有的内容,在您的情况下为0、0、0。尝试转换为保留A通道的其他格式。 - api55
@api55 - 根据您所说的,我尝试了这个:opencvImage = cv2.cvtColor(numpy_image, cv2.COLOR_RGBA2BGRA)。但是这也没有起作用。 - eknbrk
1
我猜你是用 cv2.imshow 显示图像...这个函数会把透明部分也显示成黑色 :) 可以参考这篇帖子。如果你保存图片,它将保持透明。顺便问一下,你需要在 PIL 中使用这张图片吗?也许你可以跳过一些步骤,直接从 OpenCV 中加载它。 - api55
@api55,谢谢!你说的imshow()是对的。当我保存文件时,它是透明的。实际上,我不需要PIL图像,但是当我尝试使用OpenCV从URL读取PNG文件时,透明背景会变成黑色背景。我也通过imwrite()进行了检查 :) - eknbrk
1
不确定从URL中读取时,可以尝试使用cv2.IMREAD_UNCHANGED。如果它是一个.png文件,也许最好确保它以.png结尾(如果URL没有以.png结尾,请在末尾尝试使用一个虚拟变量,如?dummy=.png)。 - api55
1个回答

0

在转换时,您可以使用此代码来保存透明度

从Pillow图像转换(带Alpha通道)到OpenCv图像:

您可以手动更改颜色顺序。

import cv2
from PIL import Image
import numpy as np

pillowImage = Image.open('picturePath.png').convert('RGBA')
img = np.array(pillowImage)    # 'img' Color order: RGBA
red = img[:,:,0].copy()        # Copy R from RGBA
img[:,:,0] = img[:,:,2].copy() # Copy B to first order. Color order: BGBA
img[:,:,2] = red               # Copy R to the third order. Color order: BGRA
opencvImage = img              # img is OpenCV variable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接