【问题标题】:How to determine the number of channels in image?如何确定图像中的通道数?
【发布时间】:2020-02-24 19:52:56
【问题描述】:

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

所以我写了这个程序:

import cv2
import numpy

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

cv2.imshow("Channel", img)
cv2.waitKey()

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

img = cv2.imread("B2DBy.jpg", CV_LOAD_IMAGE_UNCHANGED)
NameError: name 'CV_LOAD_IMAGE_UNCHANGED' is not defined

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

我的意见:

【问题讨论】:

  • @HansHirse 我已经添加了输入图像。

标签: python opencv image-processing


【解决方案1】:

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

img = cv2.imread('path/to/your/image', cv2.IMREAD_UNCHANGED)

现在让我们看看您的图片。我使用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)

第一张图片(深度图)

Pillow:  RGB (640, 512)
OpenCV:  (512, 640, 3)

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

第二张图片(狗)

Pillow:  RGB (332, 300)
OpenCV:  (300, 332, 3)

有趣的是,ImageJ 说,这是一个灰度jpg!我假设,OpenCV 和 Pillow 只是不支持灰度jpg,尽管似乎有一个grayscale jpg format

第三张图片(标志)

Pillow:  1 (200, 140)
OpenCV:  (140, 200)

Pillow 和 OpenCV 都说,这是一个灰度图像,ImageJ 也支持。此外,Pillow 在这里使用了mode '1',这体现在图像的抖动外观上。

第四张图片(颜色)

Pillow:  RGB (500, 333)
OpenCV:  (333, 500, 3)

这只是一些 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
----------------------------------------

【讨论】:

    【解决方案2】:

    如果图像是灰度图像,则需要设置一个标志,返回的元组仅包含行数和列数。

    所以这是检查加载的图像是灰度图还是彩色图的好方法。

    image = cv2.imread('gray.jpg', cv2.IMREAD_GRAYSCALE)
    image.shape
    

    如果len(img.shape) 给你三个,第三个元素给你频道数。

    【讨论】:

    • 但使用 len(img.shape) 也会为所有输入提供 3(第三个元素)。
    • 尝试设置 Load_image_grayscale 标志
    • img.shape[2] 为您提供通道数。
    【解决方案3】:

    我不确定它是否会起作用,但文档说: cv.LoadImage(filename, iscolor=flag) 带有给定的标志。有一个标志“

    img = cv2.imread("B2DBy.jpg",iscolor=<0)
    

    或者这个

    img = cv2.imread("B2DBy.jpg",iscolor=CV_LOAD_IMAGE_ANYDEPTH)
    

    【讨论】:

    • 对于第一个,它给出了无效的语法 =
    • 对不起 :( 另外,你介意试试 img = cv2.imread("B2DBy.jpg",-1) 吗?
    • 我刚刚发现,如果您事先不知道,OpenCV 无法确定您的图像是 RGB、GreyScale 还是其他任何图像。 stackoverflow.com/questions/2122706/…阅读此内容以获得进一步解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多