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

Posted

技术标签:

【中文标题】如何在 Python OpenCV 中读取 TIFF 图像的 alpha 通道?【英文标题】:How to read the alpha channel of a TIFF image in Python OpenCV? 【发布时间】:2014-03-06 08:09:01 【问题描述】:

我想使用 Python OpenCV 从 tiff 图像中读取 alpha 通道。我正在使用 Enthought Canopy 和 OpenCV 2.4.5-3 模块。

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

我现在拥有的是:

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

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

我不确定我应该如何读取这张图片的 Alpha 通道。

提前致谢!! 南

【问题讨论】:

不确定"Alpha channel in OpenCV" 的以下回答是否仍然相关,但可能是:***.com/a/2111434/2419207 谢谢,伊尔乔!如果相同的图像是 PNG 文件,我可以使用 cv2.imread 读取它,我可以看到有 4 层。但是如果格式是具有 alpha 通道的 TIFF(Matlab 可以显示),它只显示 3 层。我想知道为什么?? 不确定是否相关,但是:"OpenCV issue: alpha channel support for 8-bit tiffs (Patch #2791)" 这不是问题的答案,但我发现 ..github.com/luispedro/imread .. 是将图像转换为 numpy 数组的最便捷方法。 scipy.ndimage.imread,它使用PIL 隐藏。 【参考方案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

输出 > (800, 689, 4)

【讨论】:

PIL 是我现在使用的。但我在想OpenCV是否可以直接读取RGBA图像。【参考方案2】:

这是一个老问题,但以防其他人偶然发现:如果 img.tiff 是 4 通道 TIFF,那么

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

产量 (212,296,4) 符合预期。

如果你再使用

channels = cv2.split(img)

您可以引用 alpha 层 (channels[3]) - 例如,作为蒙版。

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

【讨论】:

尝试了标志,仍然有 3 个频道。我的 cv2 版本是 2.4.9。也许它取决于 cv2 构建标志?通过将通道“Alpha”添加到“通道”选项卡,使用 Photoshop 生成 Tiff 图像。没有使用透明度或图层,仅使用背景图层。也许它也很重要。 Photoshop 是否将图像保存为 RGBA(即专门将名为“Alpha”的图层注册为实际的 Alpha 图层)?如果没有,那将是有意义的,因为并非每个 4 通道图像都是 RGBA。我经常得到具有 4 层的图像(一个名为“Alpha”),但需要明确“转换”为 RGBA。在gis.stackexchange.com/questions/229758/… 中,我遇到了这个问题,并希望避免“转换为 RGBA”步骤(需要大约 60 毫秒/图像,但有大约 3m 图像......所以它增加了 愚蠢 的时间量)。 我在 CS4 中没有这个选项(图像->模式没有“RGBA”之类的东西)。还检查了这个线程 - forums.adobe.com/thread/1587246,那些人也很困惑。我必须将文件保存为 Tiffs 并使用 Xnview 将它们批量转换为 Png(alpha 以这种方式变为透明度)并在 OpenCV 中使用 Png。在 OpenCV 也没有什么可以使用的,即使内部变量也只包含 3 个通道,没有别的。【参考方案3】:

我解决了同样的问题:

pip install --upgrade opencv-python

【讨论】:

你的意思是你有同样的问题,升级 OpenCV 解决了吗? 是的,我发现一些 cmets 说“openCV 2.4”有一些错误。所以这可能会有所改善。

以上是关于如何在 Python OpenCV 中读取 TIFF 图像的 alpha 通道?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV—Python PyLibTiff_psd 图像基本操作以及图像格式转换

如何在 OpenCV python 中读取视频流作为输入?

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

LIBTIFF 16位灰度tif图像转成OpenCV中的Mat格式并显示

如何从 OpenCV 中的 YUV 文件中读取帧?

Opencv和Qt QImage格式转Mat