Python OpenCV2 (cv2) Wrapper, um die Bildgröße zu erhalten?

97

So ermitteln Sie die Größe eines Bildes im cv2Wrapper in Python OpenCV (numpy). Gibt es einen richtigen Weg, dies anders zu tun als numpy.shape(). Wie kann ich es in folgenden Formatabmessungen erhalten: (Breite, Höhe) Liste?

xercool
quelle
1
numpy.shapeist nicht aufrufbar. Es ist nur eine Ebene tuple. Leider kann es entweder 3 oder 2 Elemente lang sein.
Tomasz Gandor

Antworten:

209

cv2wird numpyzum Bearbeiten von Bildern verwendet. Der richtige und beste Weg, um die Größe eines Bildes zu ermitteln, ist die Verwendung numpy.shape. Angenommen, Sie arbeiten mit BGR-Bildern, hier ein Beispiel:

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

Wenn Sie mit Binärbildern gearbeitet haben, imghaben diese zwei Dimensionen. Daher müssen Sie den Code ändern in:height, width = img.shape

jabaldonedo
quelle
23
Ach komm schon. Anstatt davon auszugehen, dass das Bild BGR oder Mono ist, schreiben Sie einfach allgemein - h, w = img.shape[:2]zumal das OP nicht an der Tiefe interessiert ist. (Ich auch nicht). Siehe meine Antwort für weitere Details.
Tomasz Gandor
19

Ich fürchte, es gibt keinen "besseren" Weg, um diese Größe zu erreichen, aber es ist nicht so viel Schmerz.

Natürlich sollte Ihr Code sowohl für Binär- / Monobilder als auch für Mehrkanalbilder sicher sein, aber die Hauptabmessungen des Bildes stehen in der Form des Numpy-Arrays immer an erster Stelle. Wenn Sie sich für die Lesbarkeit entscheiden oder sich nicht die Mühe machen möchten, dies einzugeben, können Sie es in eine Funktion einbinden und ihm einen Namen geben, den Sie mögen, z cv_size.

import numpy as np
import cv2

# ...

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

Wenn Sie sich auf einem Terminal / Ipython befinden, können Sie es auch mit einem Lambda ausdrücken:

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

Das Schreiben von Funktionen mit defmacht keinen Spaß, wenn Sie interaktiv arbeiten.

Bearbeiten

Ursprünglich dachte ich, dass die Verwendung [:2]in Ordnung ist, aber die numpy Form ist (height, width[, depth]), und wir brauchen (width, height), wie z. B. cv2.resizeerwartet, also - wir müssen verwenden [1::-1]. Noch weniger denkwürdig als [:2]. Und wer erinnert sich überhaupt an Reverse Slicing?

Tomasz Gandor
quelle
1
Vielleicht nicht besonders hilfreich, aber Sie könnten es auch alsimg.shape[:2][::-1]
billyjmc
13
Es gibt keinen Grund, warum Sie sich in Doppelpunkte in Ihren Indexklammern verlieben müssen. return (image.shape [1], image.shape [0]) ist sowohl prägnant als auch lesbar.
Mcduffee