Python OpenCV2(cv2)包装器获取图像大小?


98

如何cv2在Python OpenCV(numpy)的包装器中获取图像的大小。除了之外还有其他正确的方法吗numpy.shape()?如何获得以下格式的尺寸:(宽度,高度)列表?


1
numpy.shape不可通话。这只是一个平原tuple。不幸的是,它可以是3或2个元素长。
Tomasz Gandor 2015年

Answers:


211

cv2numpy用于处理图像,因此使用来获取图像大小的正确和最佳方法是numpy.shape。假设您正在使用BGR图像,下面是一个示例:

>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
  600 800 3

如果您正在使用二进制图像,img它将具有两个尺寸,因此必须将代码更改为:height, width = img.shape


23
哦,拜托 而不是假定图像将是BGR或单声道,只需大体写- h, w = img.shape[:2],尤其是因为OP对深度不感兴趣。(我也不是)。请参阅我的答案以获取更多详细信息。
Tomasz Gandor 2015年


19

恐怕没有“更好”的方法来获得这种大小,但是没有那么多痛苦。

当然,您的代码对于二进制/单图像以及多通道图像都应该是安全的,但是图像的主要尺寸始终以numpy数组的形状排在首位。如果您选择可读性,或者不想打扰它,可以将其包装在一个函数中,并为其命名,例如cv_size

import numpy as np
import cv2

# ...

def cv_size(img):
    return tuple(img.shape[1::-1])

如果您在终端机/ ipython上,还可以使用lambda表示它:

>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)

def交互工作时,用编写函数并不有趣。

编辑

本来我以为可以使用[:2],但是numpy的形状是(height, width[, depth]),并且我们需要(width, height)cv2.resize预期的那样-因此我们必须使用[1::-1]。难忘的是[:2]。还有谁记得反向切片?


1
也许不是很有帮助,但您也可以将其切片为img.shape[:2][::-1]
billyjmc 2015年

13
没有理由您必须爱上索引括号中的冒号。return(image.shape [1],image.shape [0])既简洁又可读。
mcduffee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.