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"
- cachorrinho
- lago
- igreja
Pronto! vamos ao trabalho no Google Colab.
Nesta aula vamos aprender:
- Criar uma imagem a mão .
- Criar uma imagem colorida .
- Ler uma imagem da WEB .
- Usar o drive como banco de imagens.
- 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:
- - Definir tamanho da matriz (quadrada).
- - Criar um arranjo de 3 matrizes.
- - Mudar o arranjo para o formato unint8 (8 bits).
- - Preencher algumas regiões com valores máximos 255.
- - Mostrar o resultado.
As alterações devem ser:
- * na matriz=0, todas as colunas entre as linhas 0 e 200 devem receber valor 255.
- * todas as colunas entre 0 e 200 devem receber valor 255 na segunda matriz.
- * 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:
- * Importar as bibliotecas necessárias.
- * 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.
- * Ler a imagem do endereço da WEB (URL - Uniform Resource Locator)
- * Recuperar o número de bandas, linhas e colunas da imagem (seu tamanho) usando o comando SHAPE.
- * 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)
- * Para armazenar o resultado criamremos uma imagem vazia com o mesmo tamanho da imagem lida, porém com apenas uma banda, variável S.
- * 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:
- * Carregar a biblioteca drive
- * Montar o drive como disco virtual usando o comando mount
- * Listar o conteúdo da pasta (opcional)
- * Ler a imagem "lago.jpg"
- * 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:
- - Crie uma matriz 20x20 e escreva a inicial do seu nome, conforme indicado
na Parte 1;
- - Leia uma imagem da pasta do Drive, exibindo seu tamanho (número de
linhas e colunas) e o número de bandas;
- - Leia uma imagem de ima URL da internet e visualize ela em tons de cinza.