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?

xercool
fonte
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

Jabaldonedo
fonte
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?

Tomasz Gandor
fonte
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