Experimentando leitura de imagens com matplotlib

importando


In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

Leitura usando matplotlib native e com PIL

O matplotlib possui a leitura nativa de imagens no formato png. Quando este formato é lido, a imagem é automaticamente mapeada da faixa 0 a 255 contido no pixel uint8 da imagem para float 0 a 1 no pixel do array lido

Já se o formato for outro, se o PIL estiver instalado, a leitura é feita pelo PIL e neste caso o tipo do pixel é mantido em uint8, de 0 a 255. Veja no exemplo a seguir

Leitura de imagem em níveis de cinza de imagem TIFF:

Como a imagem lida é TIFF, o array lido fica no tipo uint8, com valores de 0 a 255


In [2]:
f = mpimg.imread('../data/cameraman.tif')
print(f.dtype,f.shape,f.max(),f.min())


uint8 (256, 256) 251 0

Leitura de imagem colorida formato TIFF

Quando a imagem é colorida e não está no formato png, matplotlib utiliza PIL para leitura. O array terá o tipo uint8 e o shape do array é organizado em (H, W, 3).


In [3]:
fcor = mpimg.imread('../data/boat.tif')
print(fcor.dtype,fcor.shape,fcor.max(),fcor.min())


uint8 (257, 256, 3) 218 0

Leitura de imagem colorida formato png

Se a imagem está no formato png, o matplotlib mapeia os pixels de 0 a 255 para float de 0 a 1.0


In [4]:
fcor2 = mpimg.imread('../figures/capa_IA898.png')
print(fcor2.dtype, fcor2.shape, fcor2.max(), fcor2.min())


float32 (1753, 1240, 4) 1.0 0.0

Mostrando as imagens lidas


In [6]:
%matplotlib inline
plt.imshow(f, cmap='gray')
plt.colorbar()


Out[6]:
<matplotlib.colorbar.Colorbar at 0x10f0cafd0>

In [7]:
plt.imshow(fcor)
plt.colorbar()


Out[7]:
<matplotlib.colorbar.Colorbar at 0x1124e9828>

In [8]:
plt.imshow(fcor2)
plt.colorbar()


Out[8]:
<matplotlib.colorbar.Colorbar at 0x112a332e8>

Observe que o display mostra apenas a última chamada do imshow


In [10]:
plt.imshow(fcor2)
plt.imshow(fcor)
plt.imshow(f, cmap='gray')


Out[10]:
<matplotlib.image.AxesImage at 0x112d2e908>

Lendo com nbread (PIL)


In [2]:
import numpy as np
import sys,os
ia898path = os.path.abspath('../../')
if ia898path not in sys.path:
    sys.path.append(ia898path)
import ia898.src as ia

In [3]:
f = ia.nbread('../figures/capa_IA898.png')
print(f.shape)


(1753, 1240, 4)

In [8]:
plt.imshow(f)


Out[8]:
<matplotlib.image.AxesImage at 0x11d53b5c0>

In [4]:
f = ia.nbread('../../ia636/ia636/images/wheel.png')
print(f.shape)
plt.imshow(f,cmap='gray')


(189, 250)
Out[4]:
<matplotlib.image.AxesImage at 0x11712cc18>

In [3]:
f = ia.nbread('../../ia636/ia636/images/blobs.pbm')
print(f.shape,f.dtype)
plt.imshow(f,cmap='gray')


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-795d180a40b5> in <module>()
----> 1 f = ia.nbread('../../ia636/ia636/images/blobs.pbm')
      2 print(f.shape,f.dtype)
      3 plt.imshow(f,cmap='gray')

/Users/robertoalotufo/mylocalprojects/ia898/src/nbpil.py in nbread(imagefile)
     82             im_arr = im_arr.reshape((image.size[1], image.size[0], 4))
     83         elif image.mode == 'L' or image.mode == '1':
---> 84             im_arr = im_arr.reshape((image.size[1], image.size[0]))
     85         else:
     86             im_arr = im_arr.reshape((image.size[1], image.size[0], 3))

ValueError: total size of new array must be unchanged

In [14]:
import PIL
from PIL import Image

image_path = '../../ia636/ia636/images/blobs.pbm'
with Image.open(image_path) as image:
    im_arr = np.fromstring(image.tobytes(), dtype=np.uint8)
    print(im_arr.shape)
    print(image.size)
    print(image.mode)
    #print(image.)


(2048,)
(128, 128)
1

In [ ]: