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


98

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


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


23
Да ладно тебе. Вместо того, чтобы предполагать, что изображение будет BGR или монохромным, просто напишите в целом - h, w = img.shape[:2]тем более, что OP не интересуется глубиной. (Я тоже). Подробнее см. Мой ответ.
Tomasz Gandor


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.