PDI+VC · Exercício de Programação

EP06_07 — 🟣 Pipeline de Inspeção Industrial: Registro por Translação e Subtração

6.14.7 EP06_07 🟣 Pipeline de Inspeção Industrial: Registro por Translação e Subtração

Em uma linha de produção, uma câmera fixa fotografa cada peça que passa pela esteira, comparando-a a uma imagem de referência sem defeitos. O problema: pequenas vibrações da esteira deslocam a peça em relação à posição de referência a cada captura. Se a subtração de imagens for aplicada diretamente, sem correção, o deslocamento por si só já gera diferenças enormes — falsos positivos que mascaram os defeitos reais.

Este é o exercício mais completo do capítulo: você deve primeiro registrar (alinhar geometricamente) a imagem capturada usando um deslocamento conhecido \((dx, dy)\), fornecido por um sensor de posição da esteira, e só então aplicar a subtração com limiarização, exatamente como descrito na seção de inspeção industrial.

6.14.7.1 📋 Diretrizes de Implementação

  1. Dimensões e parâmetros: Ler \(L\), \(C\) (dimensões das imagens), o deslocamento inteiro conhecido \(dx, dy\) (podendo ser negativos) e o limiar de detecção \(T\) (inteiro).
  2. Imagens: Ler a matriz de referência (ref, \(L\times C\), sem defeitos) e a matriz capturada (cap, \(L\times C\), possivelmente deslocada e com defeito).
  3. Registro por translação: Construir a imagem alinhada alin aplicando o deslocamento \((dx,dy)\) recebido: \[ \text{alin}(i,j) = \begin{cases} \text{cap}(i+dy,\; j+dx), & \text{se } (i+dy,\ j+dx) \in [0,L)\times[0,C) \\ 0, & \text{caso contrário} \end{cases} \]
  4. Preenchimento de borda: As posições que “saem” da imagem capturada após o deslocamento recebem o valor 0 (zero-padding — fora do campo de visão da câmera; note que este exercício usa zero, diferente da replicação de borda do EP06_06).
  5. Diferença absoluta: Calcular, pixel a pixel, \[ \text{diff}(i,j) = |\text{ref}(i,j) - \text{alin}(i,j)| \]
  6. Limiarização: Definir \(\text{máscara}(i,j) = 1\) se \(\text{diff}(i,j) > T\); caso contrário, \(\text{máscara}(i,j) = 0\).
  7. Saída: Nesta ordem — (a) a matriz alin (\(L\times C\)); (b) a máscara de defeito (\(L\times C\)); (c) uma última linha com o total de pixels classificados como defeituosos.

6.14.7.2 📌 Restrições Computacionais

  • Zero-padding, não replicação: posições fora dos limites da imagem capturada, após o deslocamento, valem exatamente 0 — este é o ponto que mais diferencia este exercício do EP06_06.
  • Comparação estrita: \(\text{diff}(i,j) > T\).
  • Sinal de \((dx,dy)\): o deslocamento pode ser positivo ou negativo; a fórmula do passo 3 deve ser aplicada literalmente, sem inverter os sinais.
  • Todos os valores são inteiros: não há arredondamento nesta etapa.

6.14.7.3 🧠 Fundamentação Teórica

Etapa omitida Consequência
Pular o registro geométrico A borda inteira da imagem (introduzida pelo deslocamento) é marcada como “defeito” — falso positivo sistemático
Registro com \((dx,dy)\) incorreto Peça e referência ficam desalinhadas; a subtração detecta contornos deslocados, não defeitos reais
Limiar \(T\) muito baixo Ruído de captura (variações de 1–2 níveis de cinza) é confundido com defeito
Limiar \(T\) muito alto Defeitos sutis deixam de ser detectados

O registro geométrico e a subtração são etapas complementares: o primeiro garante que ambas as imagens representem exatamente a mesma cena no mesmo referencial espacial; o segundo isola o que realmente mudou entre elas — idealmente, apenas os defeitos.

6.14.7.4 📦 Especificação de Entrada e Saída (VPL)

Entrada:

  • Linha 1: Inteiro \(L\).
  • Linha 2: Inteiro \(C\).
  • Linha 3: Dois inteiros \(dx\) e \(dy\), separados por espaço.
  • Linha 4: Inteiro \(T\).
  • Próximas \(L\) linhas: elementos inteiros da matriz ref.
  • Próximas \(L\) linhas: elementos inteiros da matriz cap.

Saída:

  • \(L\) linhas com a matriz alin.
  • \(L\) linhas com a máscara de defeito (0/1).
  • Última linha: Total de pixels defeituosos: X.

6.14.7.5 📌 Exemplos

Entrada Saída Observação
3
3
1 0
30
50 50 50
50 50 50
50 50 50
0 50 50
0 50 90
0 50 50
50 50 0
50 90 0
50 50 0
0 0 1
0 1 1
0 0 1
Total de pixels defeituosos: 4
\(dx=1\) desloca a leitura uma coluna à direita; a última coluna de alin fica sem correspondência
(vira 0) e é sistematicamente marcada; o defeito real (90) também é detectado.
2
2
0 0
20
10 10
10 10
10 10
10 60
10 10
10 60
0 0
0 1
Total de pixels defeituosos: 1
Sem deslocamento (\(dx=dy=0\)): alin é idêntica a cap; apenas o defeito real (60) é detectado.
🎮 Simulador EP06_07: Registro por Translação + Subtração |ref − alin(dx,dy)| > T
Ajuste o deslocamento da esteira (dx) e o limiar T. Observe como a borda "fantasma" desaparece quando dx = 0.
ref
alin (registrada)
máscara
–
Figura 6.27: Simulador EP06_07: Pipeline de Inspeção — Registro por Translação e Subtração
%%writefile EP06_07.py
# Código Python
Writing EP06_07.py
TestSuite("EP06_07.py").run()
✔️ EP06_07.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP06_07.cases

🔍 Testando Python: EP06_07.py
⚠️ EP06_07.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.