Antworten:
cv2
wird numpy
zum 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, img
haben diese zwei Dimensionen. Daher müssen Sie den Code ändern in:height, width = img.shape
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:
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
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?
img.shape[:2][::-1]
numpy.shape
ist nicht aufrufbar. Es ist nur eine Ebenetuple
. Leider kann es entweder 3 oder 2 Elemente lang sein.