画像サイズを取得するPython OpenCV2(cv2)ラッパー?


97

cv2Python OpenCV(numpy)のラッパーで画像のサイズを取得する方法。以外、他の操作を行うための正しい方法はありますnumpy.shape()。これらのフォーマットの寸法(幅、高さ)リストでどのように取得できますか?


1
numpy.shape呼び出し可能ではありません。それは単なるプレーンtupleです。不愉快なことに、それは3または2要素の長さのどちらかです。
Tomasz Gandor 2015年

回答:


210

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には2つの次元があるため、コードを次のように変更する必要があります。height, width = img.shape


23
ああ、どうぞ。-代わりに、画像は、ちょうど書き込み概して、BGR又はモノであろうと仮定してのh, w = img.shape[:2]OPが深さに関心がない、特にとして、。(私もいませんでした)。詳細については、私の回答を参照してください。
Tomasz Gandor 2015年

1
私はこれが役に立ったと評価してい:docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/...
djwbrown

19

このサイズを取得するための「より良い」方法はないと思いますが、それほど苦痛はありません。

もちろん、コードはバイナリ/モノ画像とマルチチャネル画像の両方に対して安全でなければなりませんが、画像の主要な次元は常にnumpy配列の形で最初に来ます。読みやすさを選択した場合、またはこれを入力する手間をかけたくない場合は、関数にまとめて、好きな名前を付けることができます。例cv_size

import numpy as np
import cv2

# ...

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

ターミナル/ ipythonを使用している場合は、ラムダで表現することもできます。

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

で関数を書くことは、defインタラクティブに作業している間は楽しくありません。

編集する

もともと使用[:2]は大丈夫だと思っていましたが、でこぼこの形状は問題(height, width[, depth])なく(width, height)、たとえばcv2.resize期待どおりに必要なので、使用する必要があります[1::-1]。よりも記憶に残る[:2]。とにかく誰が逆スライシングを覚えていますか?


1
ひどくimg.shape[:2][::-1]
役に立た

13
インデックスブラケットのコロンに恋しなければならない理由はありません。return(image.shape [1]、image.shape [0])は簡潔で読みやすいです。
mcduffee 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.