¿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?
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:
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
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.
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 npimport cv2# ...def cv_size(img):return tuple(img.shape[1::-1])
Si está en una terminal / ipython, también puede expresarlo con una lambda:
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?
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.
numpy.shape
no es invocable. Es simplemente un llanotuple
. Desafortunadamente, puede tener 3 o 2 elementos.Respuestas:
cv2
utilizanumpy
para manipular imágenes, por lo que la mejor y más adecuada forma de obtener el tamaño de una imagen es utilizandonumpy.shape
. Suponiendo que está trabajando con imágenes BGR, aquí hay un ejemplo:En caso de que estuvieras trabajando con imágenes binarias,
img
tendrá dos dimensiones, y por lo tanto deberás cambiar el código a:height, width = img.shape
fuente
h, w = img.shape[:2]
, especialmente porque el OP no está interesado en la profundidad. (Ni yo). Vea mi respuesta para más detalles.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
:Si está en una terminal / ipython, también puede expresarlo con una lambda:
Escribir funciones con
def
no 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 ejemplocv2.resize
, espera, así que debemos usar[1::-1]
. Incluso menos memorable que[:2]
. ¿Y quién recuerda el corte inverso de todos modos?fuente
img.shape[:2][::-1]