Correspondência de Modelos em Imagens com OpenCV e Python

Fundamentos da Correspondência de Modelos

A correspondência de modelos (template matching) é uma técnica essenical na visão computacional para localizar regiões dentro de uma imagem principal que apresentem alta similaridade com um padrão de referência. O processo utiliza uma janela deslizante que percorre a imagem de entrada, computando um índice de similaridade ou diferença para cada posição. A coordenada onde o índice atinge o extremo esperado (mínimo ou máximo, conforme o algoritmo) aponta para a localização mais provável do alvo.

Mecânica da Função cv2.matchTemplate

O OpenCV implementa essa operação via matchTemplate, que recebe a imagem base, o padrão de busca e um identificador que define a métrica matemática de comparação. A função retorna uma matriz de resposta com dimensões reduzidas, onde cada pixel representa o valor da métrica calculado naquela posição da varredura.

Os principais critérios de avaliação disponíveis alteram a interpretação dos valores extremos:

  • cv2.TM_SQDIFF e cv2.TM_SQDIFF_NORMED: Baseados na soma dos quadrados das diferenças. Valores趋近于 zero indicam ajuste perfeito.
  • cv2.TM_CCORR e cv2.TM_CCORR_NORMED: Utilizam correlação cruzada. Picos elevados representam maior correspondência.
  • cv2.TM_CCOEFF e cv2.TM_CCOEFF_NORMED: Computam o coeficiente de correlação de Pearson. Valores próximos de 1 refletem alta similaridade estrutural e robustez a variações de brilho.

Implementação Básica com Diferença Quadrática

O primeiro exemplo ilustra o fluxo completo: carregamento em escala de cinza, execução do algoritmo de diferença quadrática, extração do ponto de mínimo e delimitação visual da região encontrada.

import cv2
import numpy as np
import matplotlib.pyplot as plt

# Carregamento das matrizes de imagem
img_base = cv2.imread('referencia_512.png', cv2.IMREAD_GRAYSCALE)
padrao_ref = cv2.imread('segmento_alvo.png', cv2.IMREAD_GRAYSCALE)

alt_p, larg_p = padrao_ref.shape
matriz_saida = cv2.matchTemplate(img_base, padrao_ref, cv2.TM_SQDIFF)

# Extração das coordenadas de melhor casamento
_, _, local_min, _ = cv2.minMaxLoc(matriz_saida)
coord_inicial = local_min
coord_final = (local_min[0] + larg_p, local_min[1] + alt_p)

# Anotação da região detectada
cv2.rectangle(img_base, coord_inicial, coord_final, 255, 2)

# Renderização dos resultados
fig, eixos = plt.subplots(1, 2, figsize=(10, 5))
eixos[0].imshow(matriz_saida, cmap='gray')
eixos[0].set_title('Mapa de Resposta (SQDIFF)')
eixos[1].imshow(img_base, cmap='gray')
eixos[1].set_title('Região Identificada')
for ax in eixos:
    ax.axis('off')
plt.tight_layout()
plt.show()

Comparação Automatizada de Algoritmos

Para sleecionar o método mais adequado a diferentes condições de cena, é possível iterar sobre todos os critérios disponíveis. A função auxiliar abaixo encapsula a lógica de seleção de coordenadas e geração dos gráficos, facilitando a análise lado a lado.

import cv2
import matplotlib.pyplot as plt

def analisar_metodos(imagem, padrao, nome_metodo, id_metodo):
    copia_visual = imagem.copy()
    resposta = cv2.matchTemplate(imagem, padrao, id_metodo)
    _, _, idx_min, idx_max = cv2.minMaxLoc(resposta)
    h, w = padrao.shape

    # Definição dinâmica da origem baseada na métrica
    origem = idx_min if id_metodo in (cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED) else idx_max
    destino = (origem[0] + w, origem[1] + h)
    
    cv2.rectangle(copia_visual, origem, destino, 255, 2)
    
    plt.figure(figsize=(12, 5))
    plt.subplot(1, 2, 1)
    plt.imshow(copia_visual, cmap='gray')
    plt.title(f'Localização: {nome_metodo}')
    plt.axis('off')
    
    plt.subplot(1, 2, 2)
    plt.imshow(resposta, cmap='viridis')
    plt.title('Intensidade da Resposta')
    plt.axis('off')
    
    plt.tight_layout()
    plt.show()

# Configuração dos dados
caminho_fonte = 'alvo_completo.jpg'
caminho_modelo = 'modelo_busca.jpg'
img_processada = cv2.imread(caminho_fonte, cv2.IMREAD_GRAYSCALE)
padrao_modelo = cv2.imread(caminho_modelo, cv2.IMREAD_GRAYSCALE)

# Dicionário de mapeamento de estratégias
estrategias = {
    'TM_SQDIFF': cv2.TM_SQDIFF,
    'TM_SQDIFF_NORMED': cv2.TM_SQDIFF_NORMED,
    'TM_CCORR': cv2.TM_CCORR,
    'TM_CCORR_NORMED': cv2.TM_CCORR_NORMED,
    'TM_CCOEFF': cv2.TM_CCOEFF,
    'TM_CCOEFF_NORMED': cv2.TM_CCOEFF_NORMED
}

# Execução sequencial da avaliação
for nome, ident in estrategias.items():
    analisar_metodos(img_processada, padrao_modelo, nome, ident)

Tags: OpenCV Python Visão Computacional Template Matching Processamento de Imagem

Publicado em 8-28 11:26