¿El contenedor de Python OpenCV2 (cv2) para obtener el tamaño de la imagen?

97

Cómo obtener el tamaño de una imagen en cv2contenedor en Python OpenCV (numpy). ¿Hay alguna forma correcta de hacerlo además de numpy.shape(). ¿Cómo puedo obtenerlo en estas dimensiones de formato: (ancho, alto) lista?

xercool
fuente
1
numpy.shapeno es invocable. Es simplemente un llano tuple. Desafortunadamente, puede tener 3 o 2 elementos.
Tomasz Gandor

Respuestas:

210

cv2utiliza numpypara manipular imágenes, por lo que la mejor y más adecuada forma de obtener el tamaño de una imagen es utilizando numpy.shape. Suponiendo que está trabajando con imágenes BGR, aquí hay un ejemplo:

>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
  600 800 3

En caso de que estuvieras trabajando con imágenes binarias, imgtendrá dos dimensiones, y por lo tanto deberás cambiar el código a:height, width = img.shape

jabaldonedo
fuente
23
Oh vamos. En lugar de asumir que la imagen será BGR o mono, simplemente escriba en general h, w = img.shape[:2], especialmente porque el OP no está interesado en la profundidad. (Ni yo). Vea mi respuesta para más detalles.
Tomasz Gandor
19

Me temo que no hay una forma "mejor" de conseguir este tamaño, sin embargo, no es tanto dolor.

Por supuesto, su código debe ser seguro tanto para imágenes binarias / mono como para multicanal, pero las dimensiones principales de la imagen siempre son lo primero en la forma de la matriz numpy. Si opta por la legibilidad, o no quiere molestarse en escribir esto, puede envolverlo en una función y darle un nombre que le guste, por ejemplo cv_size:

import numpy as np
import cv2

# ...

def cv_size(img):
    return tuple(img.shape[1::-1])

Si está en una terminal / ipython, también puede expresarlo con una lambda:

>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)

Escribir funciones con defno es divertido mientras se trabaja de forma interactiva.

Editar

Originalmente pensé que usarlo [:2]estaba bien, pero la forma numpy lo es (height, width[, depth]), y necesitamos (width, height), como por ejemplo cv2.resize, espera, así que debemos usar [1::-1]. Incluso menos memorable que [:2]. ¿Y quién recuerda el corte inverso de todos modos?

Tomasz Gandor
fuente
1
Tal vez no sea muy útil, pero también podría cortarlo comoimg.shape[:2][::-1]
billyjmc
13
No hay ninguna razón por la que tenga que estar enamorado de los dos puntos en sus paréntesis índice. return (image.shape [1], image.shape [0]) es a la vez sucinto y legible.
mcduffee