在 Python 中使用三个不同的库读取图像时的三种不同类型的输出

Posted

技术标签:

【中文标题】在 Python 中使用三个不同的库读取图像时的三种不同类型的输出【英文标题】:Three different types of output when reading an image with three different libraries in Python 【发布时间】:2018-06-26 10:23:21 【问题描述】:

我正在使用三个不同的库在 python 中读取图像

    imageio PIL.Image cv2.

我在使用这些库中的每一个读取图像时得到的输出都是不同的。例如

    关于使用 imageio 阅读

    a = imageio.imread('test_img.png')

    输出类型为 - uint8,大小为 (500,334,4)

    使用图片

    b = Image.open('test_img.png')

    类型 - 图片,大小 (334,500)

    使用 cv2

    c = cv2.imread('test_img.png')

    type- uint8, size (500,334,3)

为什么我在使用三个不同的库时会为同一个图像获得三种不同的尺寸?请帮助我理解其中的区别。

【问题讨论】:

你明白这些数字的含义吗? 所有尺寸都相同...高度 500,宽度 334。它们可能表示数据不同...第三维是深度,在 OpenCV 中,例如,这意味着通道加载图像时默认为 3 (BGR) 是的,我知道在每种情况下我都在获取图像的高度和宽度,但是 imageio 的通道数是 4,而 Opencv 的通道数是 3。我感到困惑的原因。 我不太明白你在问什么:你正在使用三个不同的库,所以你当然不能指望所有三个库都给你相同的输出。您应该在每个库的文档中查找每个值的含义。 @poke 我试图读取索引图像,但不确定哪个库适合。所以我尝试了三个不同的库,它们为同一索引图像提供了三种不同的结果,并且还显示了不同的图像形状。这就是我困惑的原因。同样早些时候,我对 Alpha 通道一无所知。 【参考方案1】:

从 imageio 和 OpenCV 返回的是图像的三个属性,高度、宽度和通道(或深度)。对于标准 BGR 图像,您只有 3 个通道,这就是为什么您在 OpenCV 中看到 3 个通道

对于 imageio,它可能正在读取第四个通道,通常是 alpha,它表示图像透明度,并且经常出现在 PNG 图像中。

如果您想要 OpenCV 的第四个通道,那么您需要使用以下代码:

Mat image = imread("image.png", IMREAD_UNCHANGED);

这会给你第四个频道

【讨论】:

以上是关于在 Python 中使用三个不同的库读取图像时的三种不同类型的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何识别图像中的三种对象?

Python下opencv使用笔记(图像简单读取显示与储存)

Python opencv 常用操作

python 编程中的一个关于图片的库 imageio (读取照片RGB内容,转换照片格式)

python+opencv2怎么将图像像素值转换为float64用于后续计算

在 Python 中使用 OpenCV 不扭曲点时的不良结果