Обгортка Python OpenCV2 (cv2), щоб отримати розмір зображення?


97

Як отримати розмір зображення в cv2обгортці в Python OpenCV (numpy). Чи є правильний спосіб зробити це крім numpy.shape(). Як я можу отримати його у таких розмірах формату: (ширина, висота), список?


1
numpy.shapeне викликається. Це просто рівнина tuple. На жаль, він може мати довжину 3 або 2 елементи.
Томаш Гандор

Відповіді:


210

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 не цікавить глибина. (Я теж не був). Докладніше див. У моїй відповіді.
Томаш Гандор


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]нормально, але фігурна форма є (height, width[, depth]), і нам потрібно (width, height), як, наприклад, cv2.resizeочікується, тому - ми повинні використовувати [1::-1]. Навіть менш запам'ятовується, ніж [:2]. А хто взагалі пам’ятає зворотну нарізку?


1
Можливо, це не дуже корисно, але ви також можете це нарізати якimg.shape[:2][::-1]
billyjmc

13
Немає жодної причини, що ви повинні закохуватися в двокрапку в ваших дужках. повернення (image.shape [1], image.shape [0]) є стислим і читабельним.
mcduffee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.