P.D.I. em PYthon


Processamento digital de imagens
A Imagem Digital


Ambiente COLAB - lidando com imagens

Carregue umas imagens para as aulas práticas. Para isto, entre na sua conta de Google, abra seu drive e copie umas imagens para as aulas práticas.

Para isto, navege no browser até seu drive no Google (Google drive) e crie um diretorio (pasta) "fotos"

Copie as seguintes imagens na pasta "fotos"

  1. cachorrinho
  2. lago
  3. igreja

Pronto! vamos ao trabalho no Google Colab.


Nesta aula vamos aprender:

  1. Criar uma imagem a mão .
  2. Criar uma imagem colorida .
  3. Ler uma imagem da WEB .
  4. Usar o drive como banco de imagens.
  5. Sugestões de atividades práticas para os alunos.

Parte 1 - criar imagem

Bem-vindo!

Uma imagem é uma matriz, geramente armazenada em formato uint8 de 8 bits. Então, alterar valores de pixels corresponde a alterar valores de células na matriz.

Para visualizar a matriz como imagem, deveos incluir uma função específica: from google.colab.patches import cv2_imshow

esta função mostra a matrz em tons de cinxa na tela do computador.

Para começar, Vamos criar uma matriz 10x10 cheia de zeros e alterar o valor de algumas células para 255. Como uma imagem é uma matriz, então, podemos ver a matriz como imagem usando a função cv2_imshow() . Em um novo programa import numpy as np
from google.colab.patches import cv2_imshow
tam=100 # definir o tamanho da grade
# Criar uma matriz 10x10 preenchida com zeros, do tipo float
# Os elementos de uma matriz ou vetor são sempre iniciados a partir de zero, no caso a matriz X varia de X[0,0] a X[9,9]
X=np.zeros([10,10],dtype = float)

# Definir alguns pontos específicos na matriz X como 255 (branco)
X[2,2]=255 # Ponto (2, 2) na matriz
X[5,5]=255 # Ponto (2, 2) na matriz
X[4, 8]=255 # Ponto (2, 2) na matriz


# mostrar como imagem
cv2_imshow(X)

Agora, você pode desenhar uma carinha sorridente e mostrar como imagem?

Pode começar criando uma matriz vazia.

Depois, altere o valor de alguns pixels para fazer a "arte"

PARTE 2: criar uma imagem colorida

Uma imagem colorida é a compisição de 3 matrizes, por isso, a imagem colorida tem dimensão Imagem[Nlinhas, Ncolunas, Nbandas].

Neste exercício vamos criar uma matriz de 3 bandas com cores diferentes. Para isto devemos:

  1. - Definir tamanho da matriz (quadrada).
  2. - Criar um arranjo de 3 matrizes.
  3. - Mudar o arranjo para o formato unint8 (8 bits).
  4. - Preencher algumas regiões com valores máximos 255.
  5. - Mostrar o resultado.

As alterações devem ser:

  1. * na matriz=0, todas as colunas entre as linhas 0 e 200 devem receber valor 255.
  2. * todas as colunas entre 0 e 200 devem receber valor 255 na segunda matriz.
  3. * uma região da terceira matriz (entre linhas '100-300 e colunas 100-300) deve ser igual a 255.
import numpy as np
from google.colab.patches import cv2_imshow
tam=512 # definir o tamanho da grade

X=np.zeros([tam, tam,3],dtype = float) # Criar uma imagem composta por 3 matrizes tam x tam preenchida com zeros, do tipo float
I=np.uint8(X) # Mdar seu formato para uint8
# Alterar regiões de cada banda de cor para 255, em bandas separadas (terceira coordenada)
I[0:200, :, 0]=255 # linhas de 0 a 200, todas as colunas, na primeira banda (matriz 0)
I[:, 0:200, 1]=255 # todas as linha, nas colunas 0 a 200 da segunda banda (matriz 1)
I[100:300, 100:300,2]=255 # regiao (linhas=0-300, colunas 9-300) da terceira banda (matriz 2) se tornam claras

cv2_imshow(I) # mostrar como imagem

Com base no seu conhecimento de cores, como explica as cores produzidas?

Tarefa
Reproduza as cores das bandeiras de Alemanha, Romenia e Bolívia.

PARTE 3: ler uma imagem da WEB e criar uma imagem cinza

O objetivo deste exercício é ler uma imagem RGB (3 bandas) da internet e produzir, a partir dela, uma imagem de uma única banda em níveis de cinza contendo os valores médios das três bandas em cada pixel.

Para isto vamos seguir os seguintes passos:

  1. * Importar as bibliotecas necessárias.
  2. * Importar a função io da biblioteca skimage que permite ler uma imagem da WEB, especificando o endereço. Por agora vamos usar a imagem "https://docs.ufpr.br/~centeno/m_pdi/exepy/imagens/crops_RGB.tif". Você pode tentar depois com outras imagens.
  3. * Ler a imagem do endereço da WEB (URL - Uniform Resource Locator)
  4. * Recuperar o número de bandas, linhas e colunas da imagem (seu tamanho) usando o comando SHAPE.
  5. * Combinar as bandas RGB originais para produzir uma imagem com uma única banda igual à média dos valores dos pixels. (muda de colorida a gray)
  6. * Para armazenar o resultado criamremos uma imagem vazia com o mesmo tamanho da imagem lida, porém com apenas uma banda, variável S.
  7. * Para calcular a imagem em preto e branco: varrer a imagem, linha por linha, coluna por coluna e calcular a média somando os valores em cada banda e dividindo por 3. Observe que, para o cálculo da média, primeiro mudamos os valores ao tipo float para que a variável da soma s possoa armazenar valores acima de 255. Por esse motivo, devemos transformar a uint8 para salvar como imagem
. from skimage import io
import cv2 as cv
import numpy as np
from google.colab.patches import cv2_imshow

url="https://docs.ufpr.br/~centeno/m_pdi/exepy/imagens/crops_RGB.tif" # especifica o endereço da imagem>
I = io.imread(url) # Ler a imagem
nl,nc, nb= I.shape # Recupera o tamanho da imagem
print(nl, nc, 'numero de bandas',nb) # conferir se tem bandas
cv2_imshow(I) # visualizar

# Criando uma imagem vazia (toda preenchida com zeros) com o mesmo número de linhas e colunas da imagem original
# O tipo de dado é uint8 (inteiro sem sinal de 8 bits), que é o formato comum para imagens em tons de cinza

S=np.zeros((nl,nc),dtype = np.uint8 ) # matriz nl por nc vazia em uint8
for i in range(nl):
   for j in range( nc):
     b1=float(I[i,j,0]) # mudar o valor de uint8 para float
     b2=float(I[i,j,1])
     b3=float(I[i,j,2])
     S[i,j]= np.uint8 ( (b1+b2+b3)/3 ) # calcula a média do pixel
cv2_imshow(S)

com CV

A mesma tarefa pode ser executada usando uma função pronta de OpenCV, a função cvtColor, cujos parametros de entrada são a imagem RGB original, e a transformação. S = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY).

Existem muitas transformações possíveis, mas neste caso a transformação RGB-to-GRAY é apropriada. from skimage import io
import cv2 as cv
import numpy as np
from google.colab.patches import cv2_imshow

url="https://docs.ufpr.br/~centeno/m_pdi/exepy/imagens/crops_RGB.tif" # especifica o endereço da imagem>
I = io.imread(url) # Ler a imagem
nl,nc, nb= I.shape # Recupera o tamanho da imagem
print(nl, nc, 'numero de bandas',nb) # conferir se tem bandas
cv2_imshow(I) # visualizar RGB

S = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY) # transforma imagem RGB para imagem cinza usando openCV
cv2_imshow(S)

Parte 4: usar o drive

Finalmente, você pode usar o Google Drive para ler e armazenar imagens. Para isto, vamos usar a pasta "fotos" criada anteriormente no seu google drive.

Para ler/salvar uma imagem do drive, devemos usar a biblioteca drive.

Os passos são:

  1. * Carregar a biblioteca drive
  2. * Montar o drive como disco virtual usando o comando mount
  3. * Listar o conteúdo da pasta (opcional)
  4. * Ler a imagem "lago.jpg"
  5. * salvar como nova imagem
import cv2
from google.colab.patches import cv2_imshow # para mostrar a imagem
from google.colab import drive # para salvar/ler imagens do drive
drive.mount('/content/drive') # monta drive como disco virtual

!ls "/content/drive/My Drive/fotos" # lista conteúdo da pasta (opcional)
# Ler a imagem com uma função de OpenCV
nome='/content/drive/My Drive/fotos/lago.jpg'
imgRGB = cv2.imread(nome) # ler imagem RGB deste endereço

cv2_imshow(imgRGB)
cv2.imwrite('saida.tif', imgRGB) # salvar com um nome ex:saida.tif

Tarefa:
leia a imagem "lago" e calcule a média de cada pixel para produzir uma nova imagem em níbel de cinza. Salve o resultado no drive.
Cuidado! formato das imagens é sempre uint8, as a soma de valores de pixel pode superar 255.

Exercícios


Agora, tente você mesmo. A seguir algumas sugestões:

  1. - Crie uma matriz 20x20 e escreva a inicial do seu nome, conforme indicado na Parte 1;
  2. - Leia uma imagem da pasta do Drive, exibindo seu tamanho (número de linhas e colunas) e o número de bandas;
  3. - Leia uma imagem de ima URL da internet e visualize ela em tons de cinza.