Data Science Machine Learning Python

Análise de Imagens com OpenCV

Fala galera do mundo dos dados! Vocês que curtem os conteúdos do Dados ao Cubo, se preparem que vai chegar com muita coisa boa de OpenCV para reconhecimento de imagem com Python. Então, começamos desejando que esse ano seja repleto de muita coisa boa para todos nós. Principalmente muito conteúdo no mundo dos dados sobre análise de imagem! E para começar, falaremos de análise de imagens com Python utilizando a biblioteca OpenCV.

Se tratando de imagens no mundo da inteligência artificial, temos um verdadeiro parque de diversões. O que separamos por aqui hoje, foi como fazer a comparação de imagens utilizando a biblioteca OpenCV com Python. Então, vamos aos detalhes teóricos com exemplos de como utilizar OpenCV para reconhecimento de imagem.

Análise de Imagens

Quando você olha para uma imagem, talvez nem imagine que por trás ela está dividida em muitos pixels. E que cada pixel é baseado nas três cores básicas: vermelho, verde e azul. Cada cor possui 256 tonalidades, o que proporciona até 16 milhões de combinações de cores diferentes. São muitos números né? Se o entendimento pode ser complexo, imagina fazer uma comparação entre imagens? Ou algum reconhecimento de uma imagem? Para auxiliar nessas tarefas temos a biblioteca OpenCV com Python.

Biblioteca OpenCV

OpenCV (Open Source Computer Vision Library), se traduzirmos significa algo como biblioteca de visão computacional de código aberto. Foi desenvolvida pela Intel, é uma biblioteca multiplataforma, código aberto, para o desenvolvimento de aplicativos na área de visão computacional, podendo ser utilizada bastando seguir o modelo de licença BSD Intel.

Entre as mais diversas funcionalidades, vamos explorar aqui a análise de imagens, mas especificamente, fazer comparação entre duas imagens. Então, partiu código de análise de imagem ao Cubo!

OpenCV ao Cubo

Primeiramente vamos importar as bibliotecas para o código que vamos construir. 

# Importando bibliotecas
import cv2 as cv
from google.colab.patches import cv2_imshow

A biblioteca cv2 é o pacote opencv para python e contém tudo o que precisamos. A função cv2_imshow também está disponível no cv2 (imshow), mas vamos utilizar um complemento do pacote google.colab.patches para exibição das imagens no colab.

Importando as imagens

Selecionar as duas imagens para comparação, no exemplo aqui a comparação vai ser com duas frutas, uma laranja e uma maçã. A função imread faz a leitura das imagens.

# Selecionando imagens
img1 = cv.imread("/content/opencv/orange.png")
img2 = cv.imread("/content/opencv/apple.png")
 
# Juntando as duas imagens lado a lado
final_image = cv.hconcat((img1, img2))
 
# Exibindo a imagem no colab
cv2_imshow(final_image)

Já a função hconcat faz a concatenação de imagens. A sua utilização aqui é apenas para exibir as duas imagens juntas, mas não vai interferir na comparação. Por fim, usamos a função cv2_imshow para plotar a imagem abaixo.

Verificando estrutura da imagem

Agora, o nosso trabalho é analisar a estrutura da imagem. Então usaremos as funções dtype e shape para obter alguns números das imagens.

# Verificando o tipo de dados da matriz da imagem
print('Dtype da imagem1 é {} e o Dtype da imagem2 é {}'
     .format(img1.dtype,img2.dtype))
# Verificando a altura da imagem
print('A altura da imagem1 é {} e a altura da imagem2 é {}'
     .format(img1.shape[0],img2.shape[0]))
# Verificando a largura da imagem
print('A largura da imagem1 é {} e a largura da imagem2 é {}'
     .format(img1.shape[1],img2.shape[1]))
# Verificando o número de canais da imagem
print('O número de canais da imagem1 é {} e o número de canais da imagem2 é {}'
     .format(img1.shape[2],img2.shape[2]))
 
Dtype da imagem1 é uint8 e o Dtype da imagem2 é uint8
A altura da imagem1 é 600 e a altura da imagem2 é 600
A largura da imagem1 é 600 e a largura da imagem2 é 600
O número de canais da imagem1 é 3 e o número de canais da imagem2 é 3

Podemos ver que a estrutura das imagens são idênticas, tanto no tipo de dados, quanto nos tamanhos de altura, largura e quantidade de canais. Então, seguimos a comparação.

Verificando cores da imagem

Agora, uma checagem das cores das imagens. A função split, vai auxiliar na separação das matrizes RGB, assim podemos fazer uma comparação bem básica, comparar a quantidade de elementos diferente de zeros nas matrizes das duas imagens.

b1, g1, r1 = cv.split(img1)
b2, g2, r2 = cv.split(img2)
# Verificando a cor b da imagem
print('Elementos diferente de zero na imagem1 é de {} e na imagem2 é de {}'
     .format(cv.countNonZero(b1),cv.countNonZero(b2)))
# Verificando a cor g da imagem
print('Elementos diferente de zero na imagem1 é de {} e na imagem2 é de {}'
     .format(cv.countNonZero(g1),cv.countNonZero(g2)))
# Verificando a cor r da imagem
print('Elementos diferente de zero na imagem1 é de {} e na imagem2 é de {}'
     .format(cv.countNonZero(r1),cv.countNonZero(r2)))
     
Elementos diferente de zero na matriz da imagem1 é de 330443 e na imagem2 é de 360000
Elementos diferente de zero na matriz da imagem1 é de 360000 e na imagem2 é de 360000
Elementos diferente de zero na matriz da imagem1 é de 360000 e na imagem2 é de 360000

Com essa simples análise já podemos notar uma diferença, em um dos elementos RGB, e assim, já podemos afirmar que são imagens diferentes, apesar de terem uma estrutura idêntica. Com isso, vamos compilar essas regras para identificar a diferença entre imagens de uma forma mais dinâmica.

Identificando diferença de imagens

Então, foi criada a função image_difference para fazer essa atividade. Ela possui dois testes, um para comparar a estrutura das imagens e outro para comparar as cores das imagens.

def image_difference(image_1, image_2):
  # Salva o shape das imagens
  img1_shape = image_1.shape[:2]
  img2_shape = image_2.shape[:2]
  # TESTE 1: Compara a estrutura das imagens
  if img1_shape == img2_shape:
    print("O tamanho das imagens são os mesmos")
    # Extrai a diferença de cor entre duas imagens
    difference = cv.subtract(image_1, image_2)
    # Separa as três cores da imagem
    b, g, r = cv.split(difference)
    # TESTE 2: Compara as cores das imagens
    if cv.countNonZero(b) == 0 and cv.countNonZero(g) == 0 and cv.countNonZero(r) == 0:
      print("As cores das imagens são iguais")
    else:
      print('As cores das imagens são diferentes')
  else:
    print("As imagens tem tamanhos diferentes")
    # Gera uma imagem com a diferença das imagens
  return cv2_imshow(difference)

O primeiro teste vai comparar as duas estruturas através da função shape, se mesmos shapes, então tamanhos iguais. O segundo teste vai comparar as cores, para isso, vamos verificar a diferença entre as imagens com a função subtract, em seguida, com a função split vamos separar os elementos RGB e por fim a função countNonZero vai verificar se todos os elementos RBG estão zerados, se sim, as cores são iguais. 

Para o nosso exemplo, teremos o seguinte resultado: O tamanho das imagens são os mesmos, mas as cores das imagens são diferentes.

E para finalizar, exibimos a imagem resultado da diferença entre as imagens comparadas, como podemos ver na imagem abaixo:

Essa foi a Análise de Imagens com OpenCV do Dados ao Cubo, espero que vocês tenham curtido. Todo o código demonstrado aqui, você pode encontrar no nosso GitHub. Um forte abraço e até a próxima.

Análise de Imagens com Python ao Cubo

Portanto, hoje vimos como fazer uma análise de imagem com OpenCV, possibilitando o reconhecimento de imagem com Python e todos os seus detalhes como cor e tamanho. Construimos um exemplo com Python para comparar das imagens e entender as sus diferenças. Assim finalizamos mias um conteúdo top aqui no Dados ao Cubo!

Conteúdos ao Cubo

Por fim, deixo algumas sugestões de conteúdos que você pode encontrar no Dados ao Cubo, sempre falando sobre o mundo dos dados.

Finalizo com um convite para você ser Parceiro de Publicação Dados ao Cubo e escrever o próximo artigo, compartilhando conhecimento para toda a comunidade de dados. Não esqueça de assinar a nossa Newsletter para ficar por dentro de todas as novidades. 

Gostou? Compartilhe!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *