如何确定图像中的通道数?

mef*_*man 0 python opencv image-processing

我想查看热图像、RGB 图像、灰度图像和二值图像的通道数。

所以我写了这个程序:

import cv2
import numpy

img = cv2.imread("B2DBy.jpg")
print('No of Channel is: ' + str(img.ndim))

cv2.imshow("Channel", img)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)

但它为所有类型的图像提供了相同的三通道结果?我已经阅读了这个问题,但它给出了一个错误:

img = cv2.imread("B2DBy.jpg", CV_LOAD_IMAGE_UNCHANGED)
NameError: name 'CV_LOAD_IMAGE_UNCHANGED' is not defined
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:这是查看频道数量的正确方法吗?或者,不知何故,我一直输入三通道图像,因此它给出了三通道输出?

我的输入:

热成像

灰圣像

二进制图像

RGB 图像

Han*_*rse 5

您的正确参数cv2.imread应该是:

img = cv2.imread('path/to/your/image', cv2.IMREAD_UNCHANGED)
Run Code Online (Sandbox Code Playgroud)

现在让我们来看看你的图像。我使用ImageJShow Info...命令以及以下带有 OpenCV 和Pillow 的Python 代码:

import cv2
from PIL import Image

img_pil = Image.open('path/to/your/image')
print('Pillow: ', img_pil.mode, img_pil.size)

img = cv2.imread('path/to/your/image', cv2.IMREAD_UNCHANGED)
print('OpenCV: ', img.shape)
Run Code Online (Sandbox Code Playgroud)

第一张图(深度图)

Pillow:  RGB (640, 512)
OpenCV:  (512, 640, 3)
Run Code Online (Sandbox Code Playgroud)

ImageJ 还说,那是一个 RGB 图像。因此,很可能您的深度图只是保存为 RGB png

第二张图片(狗)

Pillow:  RGB (332, 300)
OpenCV:  (300, 332, 3)
Run Code Online (Sandbox Code Playgroud)

有趣的是,ImageJ 说,这是一个灰度jpg!我认为,OpenCV 和 Pillow 只是不支持灰度jpg,尽管似乎有灰度jpg格式

第三张图片(标志)

Pillow:  1 (200, 140)
OpenCV:  (140, 200)
Run Code Online (Sandbox Code Playgroud)

Pillow 和 OpenCV 都说,这是一个灰度图像,ImageJ 也支持它。此外,枕头在此处使用模式'1',这反映在图像的抖动外观上。

第四张图片(颜色)

Pillow:  RGB (500, 333)
OpenCV:  (333, 500, 3)
Run Code Online (Sandbox Code Playgroud)

那只是一些 RGB 图像;ImageJ 也这么说。

结论

是的,很可能,您的大部分图像可能只是 RGB 图像。尽管如此,使用cv2.IMREAD_UNCHANGED至少会正确识别灰度png文件。如果jpg正确支持灰度文件,这是有问题的。

希望有帮助!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
OpenCV:      4.2.0
Pillow:      7.0.0
----------------------------------------
Run Code Online (Sandbox Code Playgroud)