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?
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:
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.
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 npimport 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:
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?
numpy.shape
não é exigível. É apenas uma planícietuple
. Infelizmente, pode ter 3 ou 2 elementos.Respostas:
cv2
usanumpy
para manipular imagens, portanto, a melhor e mais adequada maneira de obter o tamanho de uma imagem é usandonumpy.shape
. Supondo que você esteja trabalhando com imagens BGR, aqui está um exemplo:Caso você esteja trabalhando com imagens binárias,
img
terá duas dimensões e, portanto, deverá alterar o código para:height, width = img.shape
fonte
h, w = img.shape[:2]
, especialmente porque o OP não está interessado na profundidade. (Nem eu estava). Veja minha resposta para mais detalhes.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
:Se você estiver em um terminal / ipython, também poderá expressá-lo com um lambda:
Escrever funções com
def
nã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 exemplocv2.resize
, espera, então - devemos usar[1::-1]
. Ainda menos memorável do que[:2]
. E quem se lembra do corte reverso?fonte
img.shape[:2][::-1]