2013-09-30 8 views
42

cv2の画像のサイズをPython OpenCV(numpy)で取得する方法。 numpy.shape()より正しい方法がありますか?どのようにフォーマットの寸法でそれを取得する:(幅、高さ)のリスト?Python opencv2(cv2)ラッパー画像サイズを取得しますか?

おかげ

+1

'numpy.shape'は呼び出し可能ではありません。それは単純なタプルです。不幸なことに、それは3つまたは2つの要素の長さにすることができます。 –

答えて

98

cv2は、画像を操作するためのnumpyを使用していますので、画像のサイズを取得するための適切かつ最善の方法は、numpy.shapeを使用しています。あなたが二値画像で働いていた場合には、imgは、2次元を持つことになります

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

、したがって、あなたはにコードを変更する必要があります:あなたはここで、BGRの画像で作業していると仮定すると、一例である私はheight, width = img.shape

+6

ああ、どうぞ。イメージがBGRまたはモノであると仮定するのではなく、特にOPが深さに関心がないので、一般的に 'h、w = img.shape [:2]'と書いてください。 (どちらも私ではなかった)。詳細は私の答えを見てください。 –

+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を使っているのであれば、あなたもラムダとそれを表現することができます:対話的に作業しながらdef

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

ライティング機能は楽しみではありません。

編集

もともと私は[:2]を使用してOKだったと思ったが、numpyの形状が(height, width[, depth])であり、我々は(width, height)を必要とし、例えばなどcv2.resizeが期待しているので、[1::-1]を使用する必要があります。 [:2]よりも記憶に残っていない。とにかく逆スライスを覚えているのは誰ですか?

+1

恐らくそれほど有用ではないかもしれませんが、 'img.shape [:2] [:: - 1]' – billyjmc

+1

索引括弧内のコロンと恋をする必要はありません。 return(image.shape [1]、image.shape [0])は簡潔で読みやすい。 – mcduffee

関連する問題