P.D.I. em PYthon


Processamento digital de imagens
A Imagem Digital


Exercício 01 - Primeiros passos

Bem-vindo Nesta disciplina vamos trabalhar dentro do ambiente GOOGLE COLAB para escrever pequenos programas em PYTHON destinados a manipular imagens. PYTHON é uma linguagem de programação, como C++, que tem várias bibliotecas que devem ser incluídas para determinadas finalidades. Fazendo uma analogia, é equivalente a incluir bibliotecas em C++ com o comando "include"

A seguir tem um trecho de programa que inclui algumas bibliotecas básicas que usaremos no curso. Isto é feito usando o comando import. ex:

import numpy
Inclui a biblioteca básica de processamento de dados científicos. Esta biblioteca tem funções matemáticas muito úteis, como trigonométricas, logaritmos, ou operação de matrizes. Vale a pena dar uma olhada na descrição. Consulte "https://numpy.org/doc/stable/user/whatisnumpy.html" Você também pode usar a opção: import numpy as np Neste caso, você importa a biblioteca numpy mas, em lugar de chamar os comando usando o nome numpy você pode usar um nome mais curto, como np. Isto faz sentido se o nome da biblioteca for muito extenso.

import matplotlib.pylab as plt
inclui uma biblioteca que permite plotar figuras e imagens na tela. É muito útil para nossa disciplina. Para rodar este trecho de programa use a tecla play (triângulo). Após uns segundos aparece um sinal verde mostrando que deu certo. SE ocorreu um erro, um texto em vermelho aparece a seguir. import numpy as np
import matplotlib.pylab as plt
Agora, vamos criar dois vetores de 100 elementos. Para isto usamos uma função de numpy, a função zeros. Esta função cria dois arrays de tamanho 100, com elementos todos nulos. Podemos pedir para ver alguma variável usando print. Por exemplo, a variável que descreve o tamanho do array (tam) ou um dos arrays. tam=100
X=np.zeros(tam,dtype = float)
Y=np.zeros(tam,dtype = float)
print(tam)
print(X)

Podemos também usar ul LOOP, usando o comando for, para repetir alguma série de comandos. A sintaxe é:
for i in range(tam):
isto cria um loop variando a variável "i" de 0 até tam-1. Em nosso caso 0-99. Vamos ver se funciona? Não esqueça do : (dois pontods) no final desta linha. Tudo o que for repetido neste loop deve ser deslocado para direita (TAB) para mostrar o escopo do loop. for i in range(tam):
     print(i)
Agora vamos gerar duas séries para X e Y:

  1. X=i*i (quadrado) e
  2. Y=1/(i+1)

Finalmente, plotamos estes pontos. Para isto usamos a biblioteca matplotlib, que nós importamos como plt. Esta biblioteca oferece o comando plot(). Mas, em PYTHON você constrói primeiro o gráfico e depois pede para mostrar. for i in range(tam):
     X[i]=i*i
     Y[i]=1/(i+1)
plt.plot(X,Y )
plt.show()

Podemos juntar tudo em um unico script e incluir uns comentarios com #: import numpy as np
import matplotlib.pylab as plt
tam=100 # definir o tamanho das series
X=np.zeros(tam,dtype = float)
Y=np.zeros(tam,dtype = float)
print(tam)
# criar os valores
for i in range(tam):
     X[i]=i*i
     Y[i]=1/(i+1)
# plotar resultado
plt.plot(X,Y )
plt.show()

parte 2

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 imshow(). Em um novo programa import numpy as np
import matplotlib.pylab as plt
tam=100 # definir o tamanho da grade
X=np.zeros([10,10],dtype = float)
X[2,2]=255
X[5,5]=255
X[4, 8]=255
print(X)
# mostrar como imagem
plt.imshow(X)
plt.show()

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 3: ler uma imagem da WEB

Aqui voce aprende:

  1. ler uma imagem de um endereço da WEB
  2. recuperar o número de bandas, linhas e colunas da imagem (seutamanho)
  3. 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)

como sempre, importe as bibliotecas básicas. A função io da biblioteca skimage permite ler uma imagem da WEB, especificando o endereço. Você pode tentar depois com outras imagens. Agora, se concentre neste exemplo. from skimage import io
import cv2 as cv
import numpy as np
from google.colab.patches import cv2_imshow

Ler a imagem
Após ler a imagem, podemos ler seu tamanho usando o comando SHAPE.
Finalmente, podemos visualizar a imagem usando o comando imshow da biblioteca CV2. # abrir imagem
url="https://docs.ufpr.br/~centeno/m_pdi/exepy/imagens/crops_RGB.tif"
I = io.imread(url)
nl,nc, nb= I.shape
print(nl, nc, 'numero de bandas',nb)
cv2_imshow(I)

Agora, criamos uma imagem vazia com o mesmo tamanho da anteriormente lida, porém com apenas uma banda.

OBS: como para calcular a media devemos somar os valores dos pixels em três bandas, a soma pode eventualmente ser maior que 255 (o máximo para 8 bits UINT8) por isso, vamos trabalhar com a imagem em float.

calcular a média de cada pixel considerando as três bandas: media =1/3 *( I[:,:,1]+ I[:,:,2]+ I[:,:,2]) Para calcular a imagem em preto e branco: vamos varrer a imagem, linha por linha, coluna por coluna e calcular a média... S=np.zeros((nl,nc),dtype = np.uint8 ) # criamos uma variavel vazia em uint8 for i in range(nl):
   for j in range( nc):
     b1=float(I[i,j,0])
     b2=float(I[i,j,1])
     b3=float(I[i,j,2])
     S[i,j]= np.uint8 ( (b1+b2+b3)/3 )
cv2_imshow(S)

parte 4: usar o drive

Finalmente, você pode usar o Google Drive para ler e armazenar imagens. para isto, crie uma pasta "fotos" no seu google drive e armazene nela uma imagem colorida de sua preferência.

Para ler a imagem, deve usar uma biblioteca específica para ler e salvar no drive. A biblioteca google.colab DRIVE.

Depois, monte o drive como uma pasta, com MOUNT import numpy as np
import matplotlib.pylab as plt
from google.colab.patches import cv2_imshow # para mostrar a imagem
from skimage import io
    
# para salvar no drive
from google.colab import drive
    
drive.mount('/content/gdrive')
O programa pode ler imagem da pasta "fotos" ou listar seu conteúdo... !ls "/content/drive/My Drive/fotos" # lista conteúdo de pasta
nome="/content/drive/My Drive/fotos/test.jpw" # le uma das imagens com nome test.img. Cuidado,com o uso de maiúsculas.
imgRGB = cv2.imread(nome) # ler imagem deste endereço
# salvar como nova imagem
io.imsave('/content/gdrive/My Drive/fotos/saida.tif', imgRGB)