如何在 OpenCV 2 中从图像中获取通道数?

Posted

技术标签:

【中文标题】如何在 OpenCV 2 中从图像中获取通道数?【英文标题】:how to get the number of channels from an image, in OpenCV 2? 【发布时间】:2013-10-04 11:11:10 【问题描述】:

Can I determine the number of channels in cv::Mat Opencv 的答案为 OpenCV 1 回答了这个问题:您使用图像的Mat.channels() 方法。

但在 cv2(我使用的是 2.4.6)中,我拥有的图像数据结构没有 channels() 方法。我正在使用 Python 2.7。

代码sn-p:

cam = cv2.VideoCapture(source)
ret, img = cam.read()
# Here's where I would like to find the number of channels in img.

互动尝试:

>>> img.channels()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'channels'
>>> type(img)
<type 'numpy.ndarray'>
>>> img.dtype
dtype('uint8')
>>> dir(img)
['T',
 '__abs__',
 '__add__',
...
 'transpose',
 'var',
 'view']
# Nothing obvious that would expose the number of channels.

感谢您的帮助。

【问题讨论】:

【参考方案1】:

使用img.shape

它为您提供各个方向的 img 形状。即二维数组(灰度图像)的行数、列数。对于 3D 阵列,它还为您提供了通道数。

所以如果len(img.shape) 给你两个,它只有一个频道。

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

更多详情,visit here

【讨论】:

正是我需要的。谢谢! 这已经过时了。改用@abhiTronix 答案(或者更好的是我在他的答案下的评论)。【参考方案2】:

我有点晚了,但还有另一种简单的方法:

使用image.ndimSource,将为您提供正确的频道数量如下:


if image.ndim == 2:

    channels = 1 #single (grayscale)

if image.ndim == 3:

    channels = image.shape[-1]

编辑:单行:

channels = image.shape[-1] if image.ndim == 3 else 1

因为 image 只是一个 numpy 数组。在此处查看 OpenCV 文档:docs

【讨论】:

技术不错,谢谢。我将其实现为:channels = 0 if img.ndim == 2 else img.shape[2]。因此,如果图像是灰度图像,则通道为 0,否则通道是一个数字,表示在第 3 个数组维度中有多少通道(这是读取数据的正确位置,因为昏暗 1 = 高度,昏暗 2 = 宽度,昏暗 3 = 颜色频道)。【参考方案3】:

据我所知,你应该使用 image.shape[2] 来确定通道数,而不是 len(img.shape),后者给出了数组的尺寸。

【讨论】:

请仔细阅读 Abid 的回答......他同意 image.shape[2] 给出了当 image.shape[2] 存在时的通道数,即当len(image.shape) == 3. 你说得对,LarsH。对不起阿比德,他的回答更笼统。【参考方案4】:

我想在这里添加一个使用 PIL 库的独立脚本和另一个使用 cv2 库的脚本

CV2 库脚本

import cv2
import numpy as np

img = cv2.imread("full_path_to_image")

img_np = np.asarray(img)

print("img_np.shape: ", img_np.shape)

最后打印的最后一列会显示通道数,例如

img_np.shape: (1200, 1920, 4)

PIL 库脚本

from PIL import Image
import numpy as np

img = Image.imread("full_path_to_image")

img_np = np.asarray(img)

print("img_np.shape: ", img_np.shape)

最后打印的最后一列会显示通道数,例如

img_np.shape: (1200, 1920, 4)

注意:从上面的脚本中,您可能会(我曾经)使用img_np.shape[2] 来检索频道数。但是,如果您的图像包含 1 个通道(例如灰度),则该行会给您带来问题(IndexError: tuple index out of range)。相反,只需打印一个简单的形状(就像我在脚本中所做的那样),你会得到这样的东西

img_np.shape: (1200, 1920)

【讨论】:

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

OpenCV学习-获取图像的像素和通道数

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

如何使用python OpenCV在单通道图像中找到与特定值匹配的最大连通分量?