27

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

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

代码片段:

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.

谢谢你的帮助。

4

4 回答 4

47

利用img.shape

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

因此,如果len(img.shape)给您两个,则它只有一个通道。

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

欲了解更多详情,请访问此处

于 2013-09-28T03:55:46.213 回答
14

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

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


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

由于图像只不过是一个numpy数组。在此处查看 OpenCV 文档:文档

于 2018-12-13T09:05:25.613 回答
1

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

于 2019-06-28T08:58:18.747 回答
0

我想在这里添加一个使用库的独立脚本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)

于 2021-12-02T16:50:41.890 回答