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
- 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).
- 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). - Registro por translação: Construir a imagem alinhada
alinaplicando 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} \] - 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).
- Diferença absoluta: Calcular, pixel a pixel, \[ \text{diff}(i,j) = |\text{ref}(i,j) - \text{alin}(i,j)| \]
- Limiarização: Definir \(\text{máscara}(i,j) = 1\) se \(\text{diff}(i,j) > T\); caso contrário, \(\text{máscara}(i,j) = 0\).
- 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. |
%%writefile EP06_07.py
# Código PythonWriting 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.