如何在Python OpenCV中读取TIFF图像的alpha通道?

12

我希望使用Python OpenCV从一张tiff图像中读取 alpha 通道。我正在使用Enthought Canopy并已经导入了 OpenCV 2.4.5-3 模块。

我遵循了OpenCV网站的教程,使用了cv2.imread函数,但似乎不起作用。

现在我的代码如下:

import cv2
image = cv2.imread('image.tif', -1)

然后我使用了:print (image.shape),仍然显示为(8192, 8192, 3)。但是我用Matlab读取相同的图像,我可以看到这个图像的维度是(8192, 8192, 4)。

我不确定应该怎么做才能读取这个图像的alpha通道。

先行致谢! Nan


不确定以下关于“OpenCV中的Alpha通道”(https://dev59.com/oUnSa4cB1Zd3GeqPN2-2)的回答是否仍然相关,但它可能是:https://dev59.com/oUnSa4cB1Zd3GeqPN2-2#2111434 - iljau
谢谢,iljau!如果同一张图片是PNG文件,我可以使用cv2.imread读取它,并且我可以看到有4个图层。但是如果格式是具有alpha通道的TIFF(Matlab可以显示它),它只显示3个图层。我想知道为什么? - Nan An
虽然这不是对问题的回答,但我发现 https://github.com/luispedro/imread 是将图像转换为numpy数组最方便的方法。 - iljau
或者 scipy.ndimage.imread,它在内部使用 PIL - iljau
3个回答

17

这是一个老问题,但以防其他人也遇到同样的问题:如果img.tiff是一个四通道的TIFF格式,那么

import cv2
img = cv2.imread('img.tiff', cv2.IMREAD_UNCHANGED)
print img.shape 
channels = cv2.split(img)

您可以参考 alpha 通道 (channels[3]),比如作为掩模。

这个想法来自于How do I use Gimp / OpenCV Color to separate images into coloured RGB layers?,它巧妙地使用了一个虚拟图层和 merge 函数,以便恢复各个 RGB 层的实际颜色。


1
尝试了标志,仍然得到了3个通道。我的cv2版本是2.4.9。也许这取决于cv2的构建标志?Tiff图像是通过在“通道”选项卡中添加“Alpha”通道来使用Photoshop生成的。没有使用透明度或图层,只有背景层。也许这也很重要。 - ogurets
Photoshop是否将图像保存为RGBA格式(即将名为“Alpha”的图层明确注册为实际的Alpha图层)?如果不是这样,那么这是有道理的,因为并非每个4通道图像都是RGBA格式。我经常会得到具有4个图层(其中一个命名为“Alpha”)的图像,但需要显式地“转换”为RGBA格式。在https://gis.stackexchange.com/questions/229758/gdal-python-api-warp-and-translate-struggling-with-rgba中,我遇到了这个问题,并希望避免“转换为RGBA”步骤(每张图片需要大约60毫秒,但有大约3百万张图片...所以它增加了**愚蠢的**时间)。 - GT.
我在CS4中没有这个选项(图片->模式中没有类似于“RGBA”的东西)。我也查看了这个帖子-https://forums.adobe.com/thread/1587246,那些人也很困惑。我不得不将文件保存为Tiff格式,并使用Xnview批量转换成Png格式(这样Alpha通道就变成了透明),并在OpenCV中使用Png格式。此外,在OpenCV中没有可用的内容,即使是内部变量也只包含3个通道,没有其他内容。 - ogurets

1
我发现了一个解决方案,通过PIL库将原始图像转换为RBGA格式。
from PIL import Image
import numpy as np
import cv2

path_to_image = 'myimg.png'
image = Image.open(path_to_image).convert('RGBA')
image.save(path_to_image)

image = cv2.imread(path_to_image, cv2.IMREAD_UNCHANGED)
print image.shape

out > (800, 689, 4)


我现在正在使用PIL。但是我在想OpenCV是否可以直接读取RGBA图像。 - Nan An

-3

我用以下方法解决了相同的问题:

pip install --upgrade opencv-python

1
你的意思是你遇到了相同的问题,升级OpenCV解决了它? - Pratibha
是的,我发现一些评论说“openCV 2.4”存在一些错误。因此这可能会得到改进。 - Li Pi

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