Как получить размер изображения в 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 элемента.