2013-09-30 31 views
42

如何在Python OpenCV(numpy)中獲取cv2包裝中的圖像大小。有沒有比numpy.shape()更正確的方法。如何獲得格式維度:(寬度,高度)列表?Python opencv2(cv2)包裝獲取圖像大小?

感謝

+1

'numpy.shape'不可調用。這只是一個普通的「元組」。不幸的是,它可以是3或2個元素。 –

回答

98

cv2使用numpy用於處理圖像,所以正確的和最佳的方式來獲得圖像的大小使用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

+6

哦,來吧。而不是假設圖像是BGR或單色,只需要寫一般 - 'h,w = img.shape [:2]',尤其是OP對深度沒有興趣。 (我也沒有)。查看我的答案瞭解更多詳情。 –

+1

我覺得這有幫助:http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#accessing-image-properties – djwbrown

10

我恐怕沒有「更好」的方式來達到這個尺寸,但是這並不是那麼痛苦。

當然,您的代碼對於二進制/單色圖像以及多通道圖像都應該是安全的,但圖像的主要尺寸總是以numpy陣列的形狀出現。如果您選擇可讀性,或者不想打擾輸入,可以將其封裝在一個函數中,併爲其指定一個您喜歡的名稱,例如cv_size

import numpy as np 
import cv2 

# ... 

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

如果你在一個終端/ IPython中,你也可以用一個lambda表達出來:與def

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

書寫功能,而交互工作不好玩。

編輯

原本我以爲使用[:2]是確定的,但numpy的形狀是(height, width[, depth]),我們需要(width, height),作爲例如cv2.resize預計,所以 - 我們必須使用[1::-1]。比[:2]更難忘。誰又記得反向切片?

+1

也許不是非常有幫助,但你也可以切片爲'img.shape [:2] [:: - 1]' – billyjmc

+1

沒有理由必須愛上索引括號中的冒號。返回(image.shape [1],image.shape [0])既簡潔又可讀。 – mcduffee