Fala galera! Vocês que curtem os conteúdos do Dados ao Cubo, se preparem que 2022 vai chegar com muita coisa boa. 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! E para começar, falaremos de análise de imagens.
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.
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.
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 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.
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.
- Como Criar um Chatbot com Rasa Open Source
- Analisando Dados do LinkedIn
- Velocidade da Internet com a Biblioteca SpeedTest Python
- Reconhecimento de Voz com a Biblioteca SpeechRecognition Python
- Analisando Dados do Brasileirão Série A
- Inserir Dados com Streamlit e o PostgreSQL
- Visualização de Dados com Altair Python
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.

Baiano, apaixonado por dados e tecnologia, amante das inovações tecnológicas que facilitam a vida humana! Formado em Engenharia da Computação e com MBA em Gestão da Informação e Business Intelligence e especialização em Data Science. Atualmente atua como Data Tech Lead na Lopes, além de Professor na área de dados e nas horas vagas cria uns modelos de Machine Learning com Python e soluções diversas com dados!