Reconhecimento de padrões em visão computacional via Template Matching

Reconhecimento de padrões em visão computacional via Template Matching

Ao longo dos anos, a visão passou a ser o sentido mais avançado do ser humano, fazendo com que as imagens passassem a desempenhar uma função importante na percepção humana.

No campo da Ciência da Computação, encontramos a área da Visão Computacional, que trata do processamento de imagens por um computador digital - embora não haja um consenso em relação ao ponto em que o processamento de imagens termina e a visão computacional se inicia.

Uma imagem digital é constituída de um dado numérico de informação contendo uma localização e um valor atribuído. Esta imagem digital pode ser capturada de diversas fontes, como computadores, notebooks, smartphones, drones, aparelhos de ultrassom, microscopia eletrônica, entre outros.

Todos os dados coletados no processamento digital de uma imagem são conhecidos como elementos pictóricos, elementos de imagem, pels e pixels, sendo este último o mais empregado para constituir as informações de uma imagem digital.

Um dos passos essenciais no processamento de imagens digitais está na manipulação desses registros, de maneira que o resultado pretendido seja ainda melhor que a amostra original, atendendo assim ao requesito de uma aplicação específica. Entretanto, o observador deve ser o árbitro final do trabalho esperado no uso de cada técnica.

Exemplos de aplicações

Um problema bem conhecido e bem estudado na área de processamento de imagens digitais é a remoção de ruído da mesma, a partir da minimização da média do erro quadrado (MSE). Quando os níveis de ruídos são severos, usamos o MSE Mínimo (MMSE) para chegar na imagem de saída desejada.

Uma outra área bem conhecida de aplicação em processamento de imagens digitais está na restauração das mesmas. Podemos aplicar técnicas avançadas para isso, como usar o Operador Laplaciano, capaz de converter uma imagem representada por três matrizes de cor em aplicações de imagens monocromáticas.

A visão computacional também é aplicada na indústria bélica, para criação de sistemas avançados capazes de enviar mísseis para uma área ou alvo específico. Veículos autônomos da NASA, como a Mars Exploration Rover, se valem da visão computacional para navegação em Marte, com produção de mapas do ambiente local e detecção de obstáculos.

Template matching

A técnica que este artigo apresenta é a do "casamento de templates" (template matching) amplamente usada para localizar padrões em imagens digitais. O casamento pode ser feito de duas maneiras: baseado em características do template T ou baseado em toda a região do template T para encontrar as correspondências em uma imagem analisada A. Em ambos os casos, alguma medida de similaridade precisa ser empregada.

Algumas medidas comumente usadas são: soma das diferenças quadradas, soma das diferenças absolutas, correlação e correlação cruzada normalizada (normalized cross-correlation − NCC). Este modelo, tipicamente usado na indústria, pode auxiliar empresas a identificarem a forma de aparição de suas marcas em determinado lugar para avaliar a experiência do usuário.

Declarando as bibliotecas que vamos usar no Pyhton

# Import da biblioteca NumPy
import numpy as np

# Import da biblioteca OpenCV
import cv2 as cv

# Import da biblioteca Matplotlib para criação de gráficos e visualizações de dados
from matplotlib import pyplot as plot

# Import da biblioteca do Google Colab para visualização de imagens
from google.colab.patches import cv2_imshow

Leitura da imagem a ser comparada

# Lendo imagem de modelo (template) compartilhada no Google Drive
url_dados = "https://drive.google.com/file/d/1S3alnwlH0cCfnUaI0DdvOHjy81vVYaZF/view?usp=sharing"
lista_de_dados = [url_dados]

for url in lista_de_dados:
  a = url.find ('/d/')
  b = url.find ('/view?usp=sharing')

  id_file = url[a+3:b]
  print (id_file)
  !gdown --id $id_file
1S3alnwlH0cCfnUaI0DdvOHjy81vVYaZF
Downloading...
From: https://drive.google.com/uc?id=1S3alnwlH0cCfnUaI0DdvOHjy81vVYaZF
To: /content/A_mac_11.jpg
100% 125k/125k [00:00<00:00, 57.4MB/s]

Lendo a imagem a ser comparada via biblioteca OpenCV para ser impressa

A = cv.imread("A_mac_11.jpg")

Impressão da imagem a ser comparada

cv2_imshow(A)

Leitura da imagem de template

# Lendo imagem de modelo (template) compartilhada no Google Drive
url_dados = "https://drive.google.com/file/d/1fouJfd44MTjwy87fsWDdTtX6AYwULMWd/view?usp=sharing"
lista_de_dados = [url_dados]

for url in lista_de_dados:
  a = url.find ('/d/')
  b = url.find ('/view?usp=sharing')

  id_file = url[a+3:b]
  print (id_file)
  !gdown --id $id_file
1fouJfd44MTjwy87fsWDdTtX6AYwULMWd
Downloading...
From: https://drive.google.com/uc?id=1fouJfd44MTjwy87fsWDdTtX6AYwULMWd
To: /content/T_mac2.jpg
100% 4.40k/4.40k [00:00<00:00, 5.94MB/s]

Lendo a imagem modelo (template) via biblioteca OpenCV para ser impressa

T = cv.imread("T_mac2.jpg")

Impressão da imagem template

cv2_imshow(T)

Listando métodos de similaridade existentes de Template Matching

  • cv.TM_CCOEFF
  • cv.TM_CCOEFF_NORMED
  • cv2.TM_CCORR
  • cv2.TM_CCORR_NORMED
  • cv2.TM_SQDIFF
  • cv2.TM_SQDIFF_NORMED

Modelo matemático do método TM_CCOEFF_NORMED usando neste algoritmo:

Fluxograma do reconhecimento de padrão de imagem

Detecção dos símbolos MC'Donalds no template e imprimindo na imagem a ser comparada

# Lendo a imagem a ser analisada e o template
A = cv.cvtColor(A,cv.COLOR_BGR2RGB)
T = cv.cvtColor(T,cv.COLOR_BGR2RGB)

# Redimensionando (escalonar) o template
h = int(T.shape[0]/1.3)
w = int(T.shape[1]/1.3)
dim = (w,h)
T = cv.resize(T, dim, interpolation = cv.INTER_CUBIC)

# Aplicando template matching usando o modelo matemático TM_CCOEFF_NORMED (Coeficiente de Correlação Normatizado)
res = cv.matchTemplate(A,T,cv.TM_CCORR_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)

# Assinalando os símbolos na imagem
threshold = 0.83
loc = np.where(res >= threshold)

top_left_ant = (0, 0)
cont=1
for i in range (len(loc[0])):
  top_left = (loc[1][i], loc[0][i])
  bottom_right = (top_left[0] + w, top_left[1] + h)
  if top_left[0] > top_left_ant[0] + w or top_left[1] > top_left_ant[1] + h :
    cv.rectangle(A,top_left, bottom_right, (0,255,0), 2)
    cv.putText(A,str(cont), bottom_right,1,2,(0,255,0),3,1)
    top_left_ant = top_left
    cont = cont +1

plot.imshow(T,cmap = 'gray')
plot.show()
plot.imshow(A,cmap = 'gray')
plot.show()
# plot.imshow(res,cmap = 'gray')

Conclusão

Um trabalho de processamento de imagens digitais abrange uma área muito ampla, com diversas técnicas que podem ser utilizadas de acordo com cada resultado esperado. Muitas vezes os conceitos matemáticos utilizados devem ser bem separados para que haja uma compreensão melhor da solução.

Contudo, para o melhor processamento das imagens, o observador é quem realizará os experimentos com as técnicas mais apropriadas de correlação, filtragem e máscaras. Ao final de cada trabalho, ao utilizar os métodos de processamento de imagens digitais, o resultado esperado deverá inferir informações de maior qualidade para a leitura por humanos.


Referências

FORSYTH, D. F. e PONCE, J. Computer Vision — A Modern Approach. Upper Saddle River: Prentice Hall, 2002.

GONZALEZ, Rafael C.; WOODS, Richard E. Processamento Digital de Imagens. 3a Edição. São Paulo: Pearson, 2010.

GOUTSIAS, J.; VINCENT, L. e BLOOMBERG, D. S. Mathematical Morphology and Its Applications to Image and Signal Processing. Boston: Kluwer Academic Publishers, 2000.