Обертка Python OpenCV2 (cv2) для получения размера изображения?
98
Как получить размер изображения в cv2оболочке в Python OpenCV (numpy). Есть ли правильный способ сделать это, кроме numpy.shape(). Как мне получить его в следующих размерах формата: (ширина, высота) список?
numpy.shapeне вызывается. Это просто равнина tuple. К сожалению, это может быть 3 или 2 элемента.
Tomasz Gandor
Ответы:
211
cv2использует numpyдля управления изображениями, поэтому лучший и правильный способ получить размер изображения - использовать numpy.shape. Предполагая, что вы работаете с изображениями BGR, вот пример:
Да ладно тебе. Вместо того, чтобы предполагать, что изображение будет BGR или монохромным, просто напишите в целом - h, w = img.shape[:2]тем более, что OP не интересуется глубиной. (Я тоже). Подробнее см. Мой ответ.
Боюсь, что нет "лучшего" способа получить такой размер, но это не так уж больно.
Конечно, ваш код должен быть безопасным как для двоичных / моно изображений, так и для многоканальных, но основные размеры изображения всегда идут первыми в форме массива numpy. Если вы выбираете удобочитаемость или не хотите утруждать себя вводом этого текста, вы можете обернуть его функцией и дать ей имя, которое вам нравится, например cv_size:
import numpy as npimport cv2# ...def cv_size(img):return tuple(img.shape[1::-1])
Если вы используете терминал / ipython, вы также можете выразить это с помощью лямбды:
defПри интерактивной работе писать функции с помощью не очень весело.
редактировать
Первоначально я думал, что использование [:2]- это нормально, но форма numpy есть (height, width[, depth]), и нам нужно (width, height), как, например, cv2.resizeожидает, поэтому - мы должны использовать [1::-1]. Еще менее запоминающийся, чем [:2]. А кто вообще помнит обратную нарезку?
numpy.shape
не вызывается. Это просто равнинаtuple
. К сожалению, это может быть 3 или 2 элемента.Ответы:
cv2
используетnumpy
для управления изображениями, поэтому лучший и правильный способ получить размер изображения - использоватьnumpy.shape
. Предполагая, что вы работаете с изображениями BGR, вот пример:В случае, если вы работали с двоичными изображениями, они
img
будут иметь два измерения, поэтому вы должны изменить код на:height, width = img.shape
источник
h, w = img.shape[:2]
тем более, что OP не интересуется глубиной. (Я тоже). Подробнее см. Мой ответ.Боюсь, что нет "лучшего" способа получить такой размер, но это не так уж больно.
Конечно, ваш код должен быть безопасным как для двоичных / моно изображений, так и для многоканальных, но основные размеры изображения всегда идут первыми в форме массива numpy. Если вы выбираете удобочитаемость или не хотите утруждать себя вводом этого текста, вы можете обернуть его функцией и дать ей имя, которое вам нравится, например
cv_size
:Если вы используете терминал / ipython, вы также можете выразить это с помощью лямбды:
def
При интерактивной работе писать функции с помощью не очень весело.редактировать
Первоначально я думал, что использование
[:2]
- это нормально, но форма numpy есть(height, width[, depth])
, и нам нужно(width, height)
, как, например,cv2.resize
ожидает, поэтому - мы должны использовать[1::-1]
. Еще менее запоминающийся, чем[:2]
. А кто вообще помнит обратную нарезку?источник
img.shape[:2][::-1]