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?
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:
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.
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:
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?
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.
numpy.shape
ist nicht aufrufbar. Es ist nur eine Ebenetuple
. Leider kann es entweder 3 oder 2 Elemente lang sein.Antworten:
cv2
wirdnumpy
zum Bearbeiten von Bildern verwendet. Der richtige und beste Weg, um die Größe eines Bildes zu ermitteln, ist die Verwendungnumpy.shape
. Angenommen, Sie arbeiten mit BGR-Bildern, hier ein Beispiel:Wenn Sie mit Binärbildern gearbeitet haben,
img
haben diese zwei Dimensionen. Daher müssen Sie den Code ändern in:height, width = img.shape
quelle
h, w = img.shape[:2]
zumal das OP nicht an der Tiefe interessiert ist. (Ich auch nicht). Siehe meine Antwort für weitere Details.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
.Wenn Sie sich auf einem Terminal / Ipython befinden, können Sie es auch mit einem Lambda ausdrücken:
Das Schreiben von Funktionen mit
def
macht 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.resize
erwartet, also - wir müssen verwenden[1::-1]
. Noch weniger denkwürdig als[:2]
. Und wer erinnert sich überhaupt an Reverse Slicing?quelle
img.shape[:2][::-1]