Wrapper Python OpenCV2 (cv2) para obter o tamanho da imagem?


97

Como obter o tamanho de uma imagem em cv2wrapper em Python OpenCV (numpy). Existe uma maneira correta de fazer isso diferente numpy.shape(). Como posso obtê-lo nestas dimensões de formato: (largura, altura) lista?


1
numpy.shapenão é exigível. É apenas uma planície tuple. Infelizmente, pode ter 3 ou 2 elementos.
Tomasz Gandor

Respostas:


210

cv2usa numpypara manipular imagens, portanto, a melhor e mais adequada maneira de obter o tamanho de uma imagem é usando numpy.shape. Supondo que você esteja trabalhando com imagens BGR, aqui está um exemplo:

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

Caso você esteja trabalhando com imagens binárias, imgterá duas dimensões e, portanto, deverá alterar o código para:height, width = img.shape


23
Oh vamos lá. Em vez de presumir que a imagem será BGR ou mono, basta escrever geralmente - h, w = img.shape[:2], especialmente porque o OP não está interessado na profundidade. (Nem eu estava). Veja minha resposta para mais detalhes.
Tomasz Gandor


19

Receio que não haja maneira "melhor" de obter esse tamanho, no entanto, não é muito doloroso.

É claro que seu código deve ser seguro tanto para imagens binárias / mono quanto para imagens multicanais, mas as dimensões principais da imagem sempre vêm em primeiro lugar na forma do array numpy. Se você optar pela legibilidade, ou não quiser se preocupar em digitar isso, pode embrulhar em uma função e dar a ela um nome que você goste, por exemplo cv_size:

import numpy as np
import cv2

# ...

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

Se você estiver em um terminal / ipython, também poderá expressá-lo com um lambda:

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

Escrever funções com defnão é divertido ao trabalhar interativamente.

Editar

Originalmente, pensei que usar [:2]estava OK, mas a forma numpy é (height, width[, depth]), e precisamos (width, height), como por exemplo cv2.resize, espera, então - devemos usar [1::-1]. Ainda menos memorável do que [:2]. E quem se lembra do corte reverso?


1
Talvez não seja muito útil, mas você também pode img.shape[:2][::-1]
dividir

13
Não há razão para você amar os dois pontos entre os colchetes do índice. return (image.shape [1], image.shape [0]) é sucinto e legível.
mcduffee
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.