Sol atividade2
Objetivos da aula:
- Filtro negativo de imagem
- Recorte da imagem
- Seguimentação por pixel
%matplotlib inline
# Importando a biblioteca OpenCV
import cv2
#import a biblioteca Numpy
import numpy as np
from matplotlib import pyplot as plt
print ("OpenCV Versão : %s " % cv2.__version__)
OpenCV Versão : 4.9.0
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab02/cogumelo.png" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab02/droneinvertido.jpg" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab02/drone.jpg" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab02/droneinvertido.jpg" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab02/goku.jpg" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab02/gokuinvertido.jpg" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab02/cogumelo.png" /content
Filtro negativo (Inverte imagem)¶
Para aplicar um filtro negativo precisamos inverter os seus valores, ou seja, em uma imagem binária realizamos a troca de 0 pra 1 e de 1 para 0 para cada pixel da imagem.
import cv2
imagem = cv2.imread("cogumelo.png")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2GRAY)
plt.imshow(image, interpolation="none", cmap="gray")
plt.show()
import cv2
imagem = cv2.imread("cogumelo.png")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2GRAY)
for y in range(0, image.shape[0]):
for x in range(0, image.shape[1]):
##### aqui eu inverto o valor do pixel
if image[y, x] == 255:
image[y,x] = 0
else:
image[y,x] = 255
plt.imshow(image, interpolation="none", cmap="gray")
plt.show()
Desafio 1¶
Faça uma implementação que inverte as cores de uma imagem em escala de cinza, com valores que vão de 0 ate 255. dica: a forma explicita de fazer uma inversãão é: a = 255 - a
# implemente aqui sua solução
import cv2
imagem = cv2.imread("cogumelo.png")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2GRAY)
for y in range(0, image.shape[0]):
for x in range(0, image.shape[1]):
##### aqui eu inverto o valor do pixel
image[y, x] = 255 -image[y, x]
plt.imshow(image, interpolation="none", cmap="gray")
plt.show()
Desafio 2¶
Faça o mesmo par uma imagem colorida, realize a inversão de cores dos canais R, G e B.
o resultado deve ser parecido com a imagem abaixo:
# Implemente aqui sua solução
import cv2
imagem = cv2.imread("drone.jpg")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
for y in range(0, image.shape[0]):
for x in range(0, image.shape[1]):
##### aqui eu inverto o valor do pixel
image[y, x] = 255 -image[y, x]
plt.imshow(image, interpolation="none", cmap="gray")
plt.show()
Recorte da imagem (crop)¶
O recorte de uma parte da imagem, ou crop, consiste em extrair da imagem uma região de interresse (ROI).
import cv2
imagem = cv2.imread("drone.jpg")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
plt.imshow(image, interpolation="none")
plt.show()
image2 = image.copy()
#crop_img = img[y:y+h, x:x+w]
image2 = image[50:250,580:950]
plt.imshow(image2, interpolation="none", cmap="gray")
plt.show()
Desafio3¶
Ajude o nosso sayajin!!
A imagem foi dividida em 4 quadrantes aleatorios e precisamos organizar essa bagunça. Faça a reconstrução da imagem nas posições corretas.
Dica: Crie uma copia da imagem original (img2 = img.copy()), faça um crop da imagem 4 partes (crop1, crop2, crop3, crop4), junte as partes cortadas na ordem correta na img2. no final Salve a imagem (cv2.imwrite())
import cv2
imagem = cv2.imread("gokuinvertido.jpg")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
altura = image.shape[0]
largura = image.shape[1]
print("altura: {} largura: {}".format(altura, largura))
plt.imshow(image, interpolation="none")
plt.show()
# para salvar imagem
#cv2.imwrite("gokunormal.jpg", cv2.cvtColor(image2, cv2.COLOR_RGB2BGR))
altura: 720 largura: 1280
#implemente sua solução
import cv2
imagem = cv2.imread("gokuinvertido.jpg")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
altura_metade = image.shape[0]//2
largura_metade = image.shape[1]//2
#crop_img = img[y:y+h, x:x+w] em 4 partes
crop1 = image[0:altura_metade,0:largura_metade]
crop2 = image[0:altura_metade,largura_metade:largura_metade*2]
crop3 = image[altura_metade:altura_metade*2,0:largura_metade]
crop4 = image[altura_metade:altura_metade*2,largura_metade:largura_metade*2]
# copia da imagem original
image2 = image.copy()
# coloca os crops da imagem nas posições corretas, por exemplo: crop1 na parte inferior direita
image2[0:altura_metade,0:largura_metade] = crop4
image2[0:altura_metade,largura_metade:largura_metade*2] = crop3
image2[altura_metade:altura_metade*2,0:largura_metade] = crop2
image2[altura_metade:altura_metade*2,largura_metade:largura_metade*2] = crop1
plt.imshow(image2, interpolation="none")
plt.show()
Seguimentação de imagens¶
Agora que sabemos como manipular pixel e como alterar seu valor e sua posição. Podemos fazer atividades mais complexas como conseguir reaalizar a seguimentação de algum objeto ou item da imagem (video), Como na imagem abaixo.
Desafio 4¶
De forma intuitiva realize algumas mudanças no código e veja o efeito que causa na imagem. Este exercio é apenas um aperitivo de algumas tecnicas que vamos estudar na proxima aula.
# Entenda o codigo e faça as alterações que achar necessárias
import cv2
imagem = cv2.imread("drone.jpg")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
print(image.shape)
for y in range(0, image.shape[0]):
for x in range(0, image.shape[1]):
if image[y,x,1] > 170 :
image[y,x]= (255,255,255)
plt.imshow(image, interpolation="none")
plt.show()
(420, 1120, 3)
Desafio 5¶
Vamos tentar fazer o contrario, vamos tentar filtar o fundo da imagem sem o drone
# Implemente seu código aqui
import cv2
imagem = cv2.imread("drone.jpg")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
print(image.shape)
for y in range(0, image.shape[0]):
for x in range(0, image.shape[1]):
if image[y,x,0] < 70 :
image[y,x]= (255,255,255)
plt.imshow(image, interpolation="none")
plt.show()
(420, 1120, 3)