Обертка Python OpenCV2 (cv2) для получения размера изображения?

98

Как получить размер изображения в cv2оболочке в Python OpenCV (numpy). Есть ли правильный способ сделать это, кроме numpy.shape(). Как мне получить его в следующих размерах формата: (ширина, высота) список?

xercool
источник
1
numpy.shapeне вызывается. Это просто равнина tuple. К сожалению, это может быть 3 или 2 элемента.
Tomasz Gandor

Ответы:

211

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

Jabaldonedo
источник
23
Да ладно тебе. Вместо того, чтобы предполагать, что изображение будет BGR или монохромным, просто напишите в целом - h, w = img.shape[:2]тем более, что OP не интересуется глубиной. (Я тоже). Подробнее см. Мой ответ.
Tomasz Gandor
1
Я нашел это полезным: docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/…
djwbrown
19

Боюсь, что нет "лучшего" способа получить такой размер, но это не так уж больно.

Конечно, ваш код должен быть безопасным как для двоичных / моно изображений, так и для многоканальных, но основные размеры изображения всегда идут первыми в форме массива 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]. А кто вообще помнит обратную нарезку?

Томаш Гандор
источник
1
Может быть, не очень полезно, но вы также можете нарезать это какimg.shape[:2][::-1]
billyjmc
13
Нет причин любить двоеточия в индексных скобках. return (image.shape [1], image.shape [0]) краток и удобочитаем.
Mcduffee