Otoka Pythona OpenCV2 (cv2), aby uzyskać rozmiar obrazu?

98

Jak uzyskać rozmiar obrazu w cv2opakowaniu w Python OpenCV (numpy). Czy jest na to inny sposób niż numpy.shape(). Jak mogę to uzyskać w tych wymiarach formatu: (szerokość, wysokość) lista?

xercool
źródło
1
numpy.shapenie jest wywoływalne. To po prostu zwykłe tuple. Niestety może mieć długość 3 lub 2 elementy.
Tomasz Gandor

Odpowiedzi:

211

cv2używa numpydo manipulowania obrazami, więc właściwym i najlepszym sposobem uzyskania rozmiaru obrazu jest użycie numpy.shape. Zakładając, że pracujesz z obrazami BGR, oto przykład:

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

Jeśli pracujesz z obrazami binarnymi, imgbędzie miał dwa wymiary, dlatego musisz zmienić kod na:height, width = img.shape

jabaldonedo
źródło
23
Och przestań. Zamiast zakładać, że obraz będzie BGR lub mono, pisz ogólnie - h, w = img.shape[:2]zwłaszcza, że ​​PO nie interesuje głębia. (Ja również nie). Zobacz moją odpowiedź, aby uzyskać więcej informacji.
Tomasz Gandor
19

Obawiam się, że nie ma „lepszego” sposobu na uzyskanie takiego rozmiaru, jednak nie jest to aż tak duży ból.

Oczywiście twój kod powinien być bezpieczny zarówno dla obrazów binarnych / mono, jak i wielokanałowych, ale główne wymiary obrazu zawsze są na pierwszym miejscu w kształcie tablicy numpy. Jeśli zdecydujesz się na czytelność lub nie chcesz zawracać sobie głowy wpisywaniem tego, możesz zawinąć ją w funkcję i nadać jej nazwę, którą lubisz, np cv_size:

import numpy as np
import cv2

# ...

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

Jeśli jesteś na terminalu / ipythonie, możesz to również wyrazić za pomocą lambda:

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

Pisanie funkcji w programie defnie jest przyjemne podczas pracy interaktywnej.

Edytować

Początkowo myślałem, że używanie [:2]jest OK, ale kształt numpy jest (height, width[, depth])i potrzebujemy (width, height), jak np. Się cv2.resizespodziewa, więc - musimy użyć [1::-1]. Jeszcze mniej niezapomniany niż [:2]. A kto tak czy owak pamięta o odwrotnym krojeniu?

Tomasz Gandor
źródło
1
Może niezbyt pomocne, ale możesz też pokroić to tak, jakimg.shape[:2][::-1]
billyjmc
13
Nie ma powodu, dla którego musisz kochać dwukropki w nawiasach indeksowych. return (image.shape [1], image.shape [0]) jest zwięzłe i czytelne.
mcduffee