Sol atividade3
Objetivos da aula:
- Histograma e equalização de histograma
- Seguimentação com auxilio do histograma
- Webcam opencv
Histograma¶
Na ultima aula, tentamos fazer a segmentação de um objeto da imagem pelo metodo força bruta #GoHorse, pode ser que funcione mas não é a forma mais intessnte de ser feita. Um histograma pode nos ajudar, ele plota em um gráfico de frequência as componentes de cores (r,g,b ou gray) da imagem.
In [1]:
Copied!
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
print ("OpenCV Version : %s " % cv2.__version__)
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
print ("OpenCV Version : %s " % cv2.__version__)
OpenCV Version : 4.9.0
In [ ]:
Copied!
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab03/bola.png" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab03/bolinha.png" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab03/fuca.png" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab03/bola.png" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab03/bolinha.png" /content
!wget "https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab03/fuca.png" /content
In [2]:
Copied!
img = cv2.imread("fuca.png", cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap="Greys_r", vmin=0, vmax=255)
img = cv2.imread("fuca.png", cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap="Greys_r", vmin=0, vmax=255)
Out[2]:
<matplotlib.image.AxesImage at 0x15eff6460>
In [3]:
Copied!
plt.hist(img.ravel(),256,[0,256]); plt.show()
plt.hist(img.ravel(),256,[0,256]); plt.show()
In [4]:
Copied!
# normalização de histograma
img_eq = cv2.equalizeHist(img)
plt.imshow(3*img_eq, cmap="Greys_r", vmin=0, vmax=255)
# normalização de histograma
img_eq = cv2.equalizeHist(img)
plt.imshow(3*img_eq, cmap="Greys_r", vmin=0, vmax=255)
Out[4]:
<matplotlib.image.AxesImage at 0x15f9cf370>
In [5]:
Copied!
plt.hist(3*img_eq.ravel(),256,[0,256]); plt.show()
plt.hist(3*img_eq.ravel(),256,[0,256]); plt.show()
Podemos fazer o mesmo para uma imgem colorida
In [6]:
Copied!
imagem = cv2.imread("bola.png")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
plt.imshow(image, vmin=0, vmax=255); plt.show()
plt.hist(image.ravel(),256,[0,256]); plt.show()
imagem = cv2.imread("bola.png")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
plt.imshow(image, vmin=0, vmax=255); plt.show()
plt.hist(image.ravel(),256,[0,256]); plt.show()
In [7]:
Copied!
#histograma Vermelho
plt.imshow(image[:,:,0], cmap="gray", vmin=0, vmax=255); plt.show()
plt.hist(image[:,:,0].ravel(),256,[0,256]); plt.show()
#histograma Vermelho
plt.imshow(image[:,:,0], cmap="gray", vmin=0, vmax=255); plt.show()
plt.hist(image[:,:,0].ravel(),256,[0,256]); plt.show()
In [8]:
Copied!
# Histogrma Verde
plt.imshow(image[:,:,1], cmap="Greys_r", vmin=0, vmax=255); plt.show()
plt.hist(image[:,:,1].ravel(),256,[0,256]); plt.show()
# Histogrma Verde
plt.imshow(image[:,:,1], cmap="Greys_r", vmin=0, vmax=255); plt.show()
plt.hist(image[:,:,1].ravel(),256,[0,256]); plt.show()
In [9]:
Copied!
# Histograma Azul
plt.imshow(image[:,:,2], cmap="Greys_r", vmin=0, vmax=255); plt.show()
plt.hist(image[:,:,2].ravel(),256,[0,256]); plt.show()
# Histograma Azul
plt.imshow(image[:,:,2], cmap="Greys_r", vmin=0, vmax=255); plt.show()
plt.hist(image[:,:,2].ravel(),256,[0,256]); plt.show()
In [10]:
Copied!
image2 = image.copy()
gray_r = image2[:,:,0]
gray_g = image2[:,:,1]
gray_b = image2[:,:,2]
img_bola = image2.copy()
for y in range(0, image2.shape[0]):
for x in range(0, image2.shape[1]):
if gray_g[y][x] <= 230:
img_bola[y][x]= 0
if gray_b[y][x] >= 240:
img_bola[y][x]= 0
plt.imshow(img_bola, interpolation="none")
plt.show()
image2 = image.copy()
gray_r = image2[:,:,0]
gray_g = image2[:,:,1]
gray_b = image2[:,:,2]
img_bola = image2.copy()
for y in range(0, image2.shape[0]):
for x in range(0, image2.shape[1]):
if gray_g[y][x] <= 230:
img_bola[y][x]= 0
if gray_b[y][x] >= 240:
img_bola[y][x]= 0
plt.imshow(img_bola, interpolation="none")
plt.show()
Desafio 1¶
Faça a seguimentação da bolinha de cor laranja. Dica use 2 canais de cores para conseguir seguimentar.
In [13]:
Copied!
# Implemente seu código
# para encontrar a bolinha laranja na imagem, é necessário encontrar a cor laranja, que é uma mistura de vermelho e verde
# para isso, é necessário encontrar os valores de vermelho e verde que compõem a cor laranja
# não existe um valor exato para a cor laranja, então é necessário testar valores para encontrar a cor laranja
# no caso, o vermelho é menor que 240 e o verde é maior que 240 para a cor laranja da bolinha na imagem
img_bola_laranja = image.copy()
gray_r = image[:,:,0]
gray_g = image[:,:,1]
for y in range(0, image.shape[0]):
for x in range(0, image.shape[1]):
if gray_r[y][x] <= 240:
img_bola_laranja[y][x]= 0
if gray_g[y][x] >= 240:
img_bola_laranja[y][x]= 0
plt.imshow(img_bola_laranja)
plt.show()
# Implemente seu código
# para encontrar a bolinha laranja na imagem, é necessário encontrar a cor laranja, que é uma mistura de vermelho e verde
# para isso, é necessário encontrar os valores de vermelho e verde que compõem a cor laranja
# não existe um valor exato para a cor laranja, então é necessário testar valores para encontrar a cor laranja
# no caso, o vermelho é menor que 240 e o verde é maior que 240 para a cor laranja da bolinha na imagem
img_bola_laranja = image.copy()
gray_r = image[:,:,0]
gray_g = image[:,:,1]
for y in range(0, image.shape[0]):
for x in range(0, image.shape[1]):
if gray_r[y][x] <= 240:
img_bola_laranja[y][x]= 0
if gray_g[y][x] >= 240:
img_bola_laranja[y][x]= 0
plt.imshow(img_bola_laranja)
plt.show()
Desafio 2¶
Faça a seguimentação da bolinha para a imagem "bolinha.png".
In [14]:
Copied!
imagem = cv2.imread("bolinha.png")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
plt.imshow(image, vmin=0, vmax=255); plt.show()
imagem = cv2.imread("bolinha.png")
image = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
plt.imshow(image, vmin=0, vmax=255); plt.show()
In [30]:
Copied!
# Implemente seu código
# para encontrar a bolinha magenta na imagem, é necessário encontrar a cor magenta,
# que é uma mistura de vermelho e azul
img_entrada = cv2.imread("bolinha.png")
img_entrada = cv2.cvtColor(img_entrada, cv2.COLOR_BGR2RGB)
# Criando uma figura com subplots para exibir a imagem e o histograma
fig, axs = plt.subplots(2, 3, figsize=(10, 8))
nomes_canais = ["Vermelho", "Verde", "Azul"]
# Iterando sobre os canais de cores
for i, (canal, nome) in enumerate(zip([0, 1, 2], nomes_canais)):
# Exibindo o canal de cor
axs[0, i].imshow(img_entrada[:, :, canal], cmap="Greys_r", vmin=0, vmax=255)
axs[0, i].set_title(f"Canal {nome}")
# Exibindo o histograma do canal de cor
axs[1, i].hist(img_entrada[:, :, canal].ravel(), 256, [0, 256])
axs[1, i].set_title(f"Histograma {nome}")
# Exibindo a figura
plt.tight_layout()
plt.show()
# agora é analisar os valores de vermelho e azul para encontrar a cor magenta da bolinha na imagem
bolinha_magenta = image.copy()
gray_r = img_entrada[:,:,0]
gray_b = img_entrada[:,:,2]
for y in range(0, img_entrada.shape[0]):
for x in range(0, img_entrada.shape[1]):
if gray_r[y][x] <= 251:
bolinha_magenta[y][x]= 0
if gray_b[y][x] >= 252:
bolinha_magenta[y][x]= 0
plt.subplot(1,2,1), plt.imshow(img_entrada)
plt.subplot(1,2,2), plt.imshow(bolinha_magenta)
plt.show()
# Dificilmente encontraremos um valor exato para a cor magenta, mas com um pouco de paciência,
# é possível encontrar a cor magenta da bolinha na imagem
# Implemente seu código
# para encontrar a bolinha magenta na imagem, é necessário encontrar a cor magenta,
# que é uma mistura de vermelho e azul
img_entrada = cv2.imread("bolinha.png")
img_entrada = cv2.cvtColor(img_entrada, cv2.COLOR_BGR2RGB)
# Criando uma figura com subplots para exibir a imagem e o histograma
fig, axs = plt.subplots(2, 3, figsize=(10, 8))
nomes_canais = ["Vermelho", "Verde", "Azul"]
# Iterando sobre os canais de cores
for i, (canal, nome) in enumerate(zip([0, 1, 2], nomes_canais)):
# Exibindo o canal de cor
axs[0, i].imshow(img_entrada[:, :, canal], cmap="Greys_r", vmin=0, vmax=255)
axs[0, i].set_title(f"Canal {nome}")
# Exibindo o histograma do canal de cor
axs[1, i].hist(img_entrada[:, :, canal].ravel(), 256, [0, 256])
axs[1, i].set_title(f"Histograma {nome}")
# Exibindo a figura
plt.tight_layout()
plt.show()
# agora é analisar os valores de vermelho e azul para encontrar a cor magenta da bolinha na imagem
bolinha_magenta = image.copy()
gray_r = img_entrada[:,:,0]
gray_b = img_entrada[:,:,2]
for y in range(0, img_entrada.shape[0]):
for x in range(0, img_entrada.shape[1]):
if gray_r[y][x] <= 251:
bolinha_magenta[y][x]= 0
if gray_b[y][x] >= 252:
bolinha_magenta[y][x]= 0
plt.subplot(1,2,1), plt.imshow(img_entrada)
plt.subplot(1,2,2), plt.imshow(bolinha_magenta)
plt.show()
# Dificilmente encontraremos um valor exato para a cor magenta, mas com um pouco de paciência,
# é possível encontrar a cor magenta da bolinha na imagem
In [ ]:
Copied!
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
import time as t
print ("OpenCV Version : %s " % cv2.__version__)
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
import time as t
print ("OpenCV Version : %s " % cv2.__version__)
OpenCV Version : 4.5.5
In [ ]:
Copied!
webcam = cv2.VideoCapture(0) # pode acontecer do ID da camera não ser 0, ai precisa testar com outros numeros
webcam = cv2.VideoCapture(0) # pode acontecer do ID da camera não ser 0, ai precisa testar com outros numeros
In [ ]:
Copied!
t.sleep(3) # Espera a webcam ficar pronta
t.sleep(3) # Espera a webcam ficar pronta
In [ ]:
Copied!
val, image = webcam.read()
val, image = webcam.read()
In [ ]:
Copied!
val # Checa se um frame chegou
val # Checa se um frame chegou
Out[ ]:
True
In [ ]:
Copied!
webcam.release() # fecha a webcam
webcam.release() # fecha a webcam
In [ ]:
Copied!
plt.imshow(image)
plt.imshow(image)
Out[ ]:
<matplotlib.image.AxesImage at 0x252ed548df0>
Desafio 3¶
Faça uma foto sua.
In [ ]:
Copied!
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import time as t
## aqui não tem segredo, é copiar, colar e rodar o código dado no enunciado.
# Iniciando a captura de vídeo
webcam = cv2.VideoCapture(0)
# Aguardando 3 segundos para a câmera se ajustar
t.sleep(3)
# Capturando uma imagem
val, image = webcam.read()
# Liberando a câmera
webcam.release()
# Convertendo a imagem de BGR para RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Exibindo a imagem
plt.imshow(image_rgb)
plt.axis('off') # Ocultando os eixos
plt.show()
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import time as t
## aqui não tem segredo, é copiar, colar e rodar o código dado no enunciado.
# Iniciando a captura de vídeo
webcam = cv2.VideoCapture(0)
# Aguardando 3 segundos para a câmera se ajustar
t.sleep(3)
# Capturando uma imagem
val, image = webcam.read()
# Liberando a câmera
webcam.release()
# Convertendo a imagem de BGR para RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Exibindo a imagem
plt.imshow(image_rgb)
plt.axis('off') # Ocultando os eixos
plt.show()
In [ ]:
Copied!
## para captura um video, é necessário usar um loop para capturar os frames da câmera e exibir os frames capturados
## em tempo real na tela do computador
## faça o teste em seu computador, copie e cole o código abaixo e veja o que acontece
import cv2
# Iniciando a captura de vídeo
webcam = cv2.VideoCapture(0)
# Definindo o tamanho da janela
webcam.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
webcam.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# Loop para capturar e exibir os frames
while True:
# Capturando um frame
ret, frame = webcam.read()
# Verificando se o frame foi capturado corretamente
if not ret:
print("Falha ao capturar o frame. Saindo...")
break
# Exibindo o frame
cv2.imshow("Video da Webcam", frame)
# Aguardando por 1 milissegundo e verificando se a tecla 'q' foi pressionada
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Liberando a câmera e fechando todas as janelas
webcam.release()
cv2.destroyAllWindows()
## para captura um video, é necessário usar um loop para capturar os frames da câmera e exibir os frames capturados
## em tempo real na tela do computador
## faça o teste em seu computador, copie e cole o código abaixo e veja o que acontece
import cv2
# Iniciando a captura de vídeo
webcam = cv2.VideoCapture(0)
# Definindo o tamanho da janela
webcam.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
webcam.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# Loop para capturar e exibir os frames
while True:
# Capturando um frame
ret, frame = webcam.read()
# Verificando se o frame foi capturado corretamente
if not ret:
print("Falha ao capturar o frame. Saindo...")
break
# Exibindo o frame
cv2.imshow("Video da Webcam", frame)
# Aguardando por 1 milissegundo e verificando se a tecla 'q' foi pressionada
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Liberando a câmera e fechando todas as janelas
webcam.release()
cv2.destroyAllWindows()