如何在 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.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
因为 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 中从图像中获取通道数?的主要内容,如果未能解决你的问题,请参考以下文章