Costura de Imagem Panorâmica com Correspondência de Blocos

Costura de Imagem Panorâmica com Correspondência de Blocos A costura de imagem panorâmica baseada em correspondência de blocos é uma técnica comum de processamento de imagens que gera uma imagem panorâmica contínua através da divisão das imagens em pequenos segmentos, com correspnodência e fusão na área de sobreposição.

  1. Pré-processamento da Imagem Antes da costura, as imagens passam por pré-processamento para melhorar os resultados. Etapas comuns incluem conversão para escala de cinza e remoção de ruído.
import cv2
import numpy as np

# Carregar imagens
imagem1 = cv2.imread('imagem1.jpg')
imagem2 = cv2.imread('imagem2.jpg')

# Converter para escala de cinza
cinza1 = cv2.cvtColor(imagem1, cv2.COLOR_BGR2GRAY)
cinza2 = cv2.cvtColor(imagem2, cv2.COLOR_BGR2GRAY)

# Aplicar filtro de mediana para remoção de ruído
cinza1 = cv2.medianBlur(cinza1, 5)
cinza2 = cv2.medianBlur(cinza2, 5)

  1. Algoritmo de Correspondência de Blocos Este algoritmo seleciona um modelo na área de sobreposição e procura o bloco mais semelhante na outra imagem. Métricas comuns de similaridade incluem a Soma das Diferenças Absolutas (SAD) e a Correlação Cruzada Normalizada (NCC).
# Definir tamanho do bloco
tamanho_bloco = 32

# Inicializar matrizes de deslocamento
deslocamento_y = np.zeros_like(cinza1, dtype=np.float32)
deslocamento_x = np.zeros_like(cinza1, dtype=np.float32)

# Realizar correspondência por blocos
for linha in range(0, cinza1.shape[0] - tamanho_bloco, tamanho_bloco):
    for coluna in range(0, cinza1.shape[1] - tamanho_bloco, tamanho_bloco):
        # Extrair bloco da primeira imagem
        bloco = cinza1[linha:linha+tamanho_bloco, coluna:coluna+tamanho_bloco]
        
        # Calcular erro quadrático para toda a segunda imagem (implementação simplificada)
        erro = cv2.matchTemplate(cinza2, bloco, cv2.TM_SQDIFF_NORMED)
        _, _, min_loc, _ = cv2.minMaxLoc(erro)
        
        # Armazenar o deslocamento correspondente
        deslocamento_y[linha:linha+tamanho_bloco, coluna:coluna+tamanho_bloco] = min_loc[1] - linha
        deslocamento_x[linha:linha+tamanho_bloco, coluna:coluna+tamanho_bloco] = min_loc[0] - coluna

  1. Fusão das Imagens Após a correspondência, a área de sobreposição é fundida para criar uma imagem panorâmica suave. Métodos comuns incluem média ponderada e fusão multibandas.
# Criar imagem panorâmica com largura combinada
largura_total = cinza1.shape[1] + cinza2.shape[1]
altura_max = max(cinza1.shape[0], cinza2.shape[0])
panoramica = np.zeros((altura_max, largura_total), dtype=np.uint8)

# Posicionar a primeira imagem
panoramica[:cinza1.shape[0], :cinza1.shape[1]] = cinza1

# Aplicar fusão suavizada na sobreposição
for i in range(cinza2.shape[0]):
    for j in range(cinza2.shape[1]):
        idx_x = j + cinza1.shape[1]
        idx_y = i
        
        # Calcular peso gaussiano para transição suave
        distancia = np.sqrt((i - (idx_y - deslocamento_y[i, j % cinza1.shape[1]]))**2 + 
                           (j - (j - deslocamento_x[i, j % cinza1.shape[1]]))**2)
        peso = np.exp(-distancia**2 / (2 * (tamanho_bloco * 0.5)**2))
        
        # Verificar limites e aplicar fusão
        if idx_x < largura_total and idx_y < altura_max:
            panoramica[idx_y, idx_x] = np.uint8(peso * cinza2[i, j] + 
                                                 (1 - peso) * panoramica[idx_y, idx_x])

# Exibir resultado
cv2.imshow('Panoramica', panoramica)
cv2.waitKey(0)
cv2.destroyAllWindows()

  1. Otimizações e Melhorias
  • Extração e Correspondência de Características: Combinar com algoritmos como SIFT ou ORB para aumentar a precisão do alinhamento.
  • Fusão Multibandas: Utilizar decomposição em pirâmides para eliminar costuras visíveis e artefatos de fantasma.
  • Desempenho em Tempo Real: Reduzir o tamanho do bloco e otimizar a janela de busca para aplicações que requerem processamento rápido.

Tags: processamento de imagens Visão Computacional Python OpenCV imagem panorâmica

Publicado em 6-7 16:09 por Thomas