Как получить размер изображения в cv2оболочке в Python OpenCV (numpy). Есть ли правильный способ сделать это, кроме numpy.shape(). Как мне получить его в следующих размерах формата: (ширина, высота) список?
Ответы:
cv2использует numpyдля управления изображениями, поэтому лучший и правильный способ получить размер изображения - использовать 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будут иметь два измерения, поэтому вы должны изменить код на:height, width = img.shape
h, w = img.shape[:2]тем более, что OP не интересуется глубиной. (Я тоже). Подробнее см. Мой ответ.
Боюсь, что нет "лучшего" способа получить такой размер, но это не так уж больно.
Конечно, ваш код должен быть безопасным как для двоичных / моно изображений, так и для многоканальных, но основные размеры изображения всегда идут первыми в форме массива 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]- это нормально, но форма numpy есть (height, width[, depth]), и нам нужно (width, height), как, например, cv2.resizeожидает, поэтому - мы должны использовать [1::-1]. Еще менее запоминающийся, чем [:2]. А кто вообще помнит обратную нарезку?
img.shape[:2][::-1]
numpy.shapeне вызывается. Это просто равнинаtuple. К сожалению, это может быть 3 или 2 элемента.