Obter o tamanho da imagem (largura e altura) com Python, OpenCV e Pillow(PIL)

O negócio

Em Python existem várias bibliotecas para manipulação de imagens, tais como OpenCV e Pillow (PIL). Esta secção explica como obter o tamanho da imagem (largura e altura) para cada uma delas.

Pode obter o tamanho da imagem (largura e altura) como um tuple usando a forma para OpenCV e o tamanho para Pillow (PIL), mas note que a ordem de cada um é diferente.

A seguinte informação é fornecida aqui.

  • OpenCV
    • ndarray.shape:Obter o tamanho da imagem (largura, altura)
      • Para imagens a cores
      • Para imagens em escala de cinzentos (monocromáticas)
  • Pillow(PIL)
    • size,width,height:Obter o tamanho da imagem (largura, altura)

Ver o artigo seguinte sobre como obter o tamanho (capacidade) de um ficheiro em vez do tamanho (tamanho) da imagem.

OpenCV: ndarray.shape: Obter o tamanho da imagem (largura, altura)

Quando um ficheiro de imagem é carregado no OpenCV, é tratado como um NumPy array ndarray, e o tamanho da imagem (largura e altura) pode ser obtido a partir da forma do atributo, que indica a forma do ndarray.

Não só no OpenCV, mas também quando um ficheiro de imagem é carregado em Pillow e convertido num ndarray, o tamanho da imagem representada pelo ndarray é obtido utilizando a forma.

Para imagens a cores

No caso de imagens a cores, é utilizado o seguinte ndarray tridimensional.

  • Fila (altura)
  • Fila (largura)
  • Cor (3)

a forma é um tuple dos elementos acima referidos.

import cv2

im = cv2.imread('data/src/lena.jpg')

print(type(im))
# <class 'numpy.ndarray'>

print(im.shape)
print(type(im.shape))
# (225, 400, 3)
# <class 'tuple'>

Para atribuir cada valor a uma variável, desembalar o tuple como se segue.

h, w, c = im.shape
print('width:  ', w)
print('height: ', h)
print('channel:', c)
# width:   400
# height:  225
# channel: 3

_
Ao desempacotar um tuple, o acima referido pode ser convencionalmente atribuído como uma variável para valores que não serão utilizados posteriormente. Por exemplo, se o número de cores (número de canais) não for utilizado, é utilizado o seguinte.

h, w, _ = im.shape
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

Também pode ser utilizado como está, especificando-o por índice (index) sem o atribuir a uma variável.

print('width: ', im.shape[1])
print('height:', im.shape[0])
# width:  400
# height: 225

(width, height)
Se quiser obter este tuple, pode usar fatias e escrever o seguinte: cv2.resize(), etc. Se quiser especificar o argumento por tamanho, utilize este.

print(im.shape[1::-1])
# (400, 225)

Para imagens em escala de cinzentos (monocromáticas)

No caso de imagens em escala de cinzentos (monocromáticas), são utilizadas as seguintes imagens bidimensionais ndarray.

  • Fila (altura)
  • Fila (largura)

A forma será este tuple.

im_gray = cv2.imread('data/src/lena.jpg', cv2.IMREAD_GRAYSCALE)

print(im_gray.shape)
print(type(im_gray.shape))
# (225, 400)
# <class 'tuple'>

Basicamente o mesmo que para as imagens a cores.

h, w = im_gray.shape
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

print('width: ', im_gray.shape[1])
print('height:', im_gray.shape[0])
# width:  400
# height: 225

Se quiser atribuir a largura e altura a variáveis, pode fazê-lo da seguinte forma, quer a imagem seja a cores ou em escala de cinzentos.

h, w = im.shape[0], im.shape[1]
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

(width, height)
Se quiser obter este tuple, pode usar fatias e escrevê-lo da seguinte forma. O seguinte estilo de escrita pode ser usado quer a imagem seja a cores ou em escala de cinzentos.

print(im_gray.shape[::-1])
print(im_gray.shape[1::-1])
# (400, 225)
# (400, 225)

Pillow(PIL): size, width, height: Obter o tamanho da imagem (largura, altura)

O objecto de imagem obtido pela leitura de uma imagem com Pillow(PIL) tem os seguintes atributos.

  • size
  • width
  • height

O tamanho é o seguinte tuple.
(width, height)

from PIL import Image

im = Image.open('data/src/lena.jpg')

print(im.size)
print(type(im.size))
# (400, 225)
# <class 'tuple'>

w, h = im.size
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

Também se pode obter a largura e a altura, respectivamente, como atributos.
width, height

print('width: ', im.width)
print('height:', im.height)
# width:  400
# height: 225

O mesmo é válido para imagens em escala de cinzentos (monocromáticas).

im_gray = Image.open('data/src/lena.jpg').convert('L')

print(im.size)
print('width: ', im.width)
print('height:', im.height)
# (400, 225)
# width:  400
# height: 225
Copied title and URL