6.14.7 EP06_07 🟣 Pipeline de Inspección Industrial: Registro por Traslación y Sustracción
En una línea de producción, una cámara fija fotografía cada pieza que pasa por la cinta transportadora, comparándola con una imagen de referencia sin defectos. El problema: pequeñas vibraciones de la cinta desplazan la pieza en relación con la posición de referencia en cada captura. Si la sustracción de imágenes se aplica directamente, sin corrección, el desplazamiento por sí solo ya genera diferencias enormes — falsos positivos que enmascaran los defectos reales.
Este es el ejercicio más completo del capítulo: debes primero registrar (alinear geométricamente) la imagen capturada usando un desplazamiento conocido \((dx, dy)\), proporcionado por un sensor de posición de la cinta, y solo entonces aplicar la sustracción con umbralización, exactamente como se describe en la sección de inspección industrial.
6.14.7.1 📋 Directrices de Implementación
- Dimensiones y parámetros: Leer \(L\), \(C\) (dimensiones de las imágenes), el desplazamiento entero conocido \(dx, dy\) (pudiendo ser negativos) y el umbral de detección \(T\) (entero).
- Imágenes: Leer la matriz de referencia (
ref, \(L\times C\), sin defectos) y la matriz capturada (cap, \(L\times C\), posiblemente desplazada y con defecto). - Registro por traslación: Construir la imagen alineada
alinaplicando el desplazamiento \((dx,dy)\) recibido: \[ \text{alin}(i,j) = \begin{cases} \text{cap}(i+dy,\; j+dx), & \text{si } (i+dy,\ j+dx) \in [0,L)\times[0,C) \\ 0, & \text{en caso contrario} \end{cases} \] - Relleno de borde: Las posiciones que “salen” de la imagen capturada después del desplazamiento reciben el valor 0 (zero-padding — fuera del campo de visión de la cámara; nota que este ejercicio usa cero, diferente de la replicación de borde del EP06_06).
- Diferencia absoluta: Calcular, píxel a píxel, \[ \text{diff}(i,j) = |\text{ref}(i,j) - \text{alin}(i,j)| \]
- Umbralización: Definir \(\text{máscara}(i,j) = 1\) si \(\text{diff}(i,j) > T\); en caso contrario, \(\text{máscara}(i,j) = 0\).
- Salida: En este orden — (a) la matriz
alin(\(L\times C\)); (b) la máscara de defecto (\(L\times C\)); (c) una última línea con el total de píxeles clasificados como defectuosos.
6.14.7.2 📌 Restricciones Computacionales
- Zero-padding, no replicación: posiciones fuera de los límites de la imagen capturada, después del desplazamiento, valen exactamente 0 — este es el punto que más diferencia este ejercicio del EP06_06.
- Comparación estricta: \(\text{diff}(i,j) > T\).
- Signo de \((dx,dy)\): el desplazamiento puede ser positivo o negativo; la fórmula del paso 3 debe aplicarse literalmente, sin invertir los signos.
- Todos los valores son enteros: no hay redondeo en esta etapa.
6.14.7.3 🧠 Fundamentación Teórica
| Etapa omitida | Consecuencia |
|---|---|
| Omitir el registro geométrico | Todo el borde de la imagen (introducido por el desplazamiento) se marca como “defecto” — falso positivo sistemático |
| Registro con \((dx,dy)\) incorrecto | Pieza y referencia quedan desalineadas; la sustracción detecta contornos desplazados, no defectos reales |
| Umbral \(T\) demasiado bajo | Ruido de captura (variaciones de 1–2 niveles de gris) se confunde con defecto |
| Umbral \(T\) demasiado alto | Defectos sutiles dejan de ser detectados |
El registro geométrico y la sustracción son etapas complementarias: el primero garantiza que ambas imágenes representen exactamente la misma escena en el mismo referencial espacial; la segunda aísla lo que realmente cambió entre ellas — idealmente, solo los defectos.
6.14.7.4 📦 Especificación de Entrada y Salida (VPL)
Entrada:
- Línea 1: Entero \(L\).
- Línea 2: Entero \(C\).
- Línea 3: Dos enteros \(dx\) y \(dy\), separados por espacio.
- Línea 4: Entero \(T\).
- Siguientes \(L\) líneas: elementos enteros de la matriz
ref. - Siguientes \(L\) líneas: elementos enteros de la matriz
cap.
Salida:
- \(L\) líneas con la matriz
alin. - \(L\) líneas con la máscara de defecto (0/1).
- Última línea:
Total de píxeles defectuosos: X.
6.14.7.5 📌 Ejemplos
| Entrada | Salida | Observación |
|---|---|---|
| 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 píxeles defectuosos: 4 |
\(dx=1\) desplaza la lectura una columna a la derecha; la última columna de alin queda sin correspondencia (se convierte en 0) y se marca sistemáticamente; el defecto real (90) también se detecta. |
| 2 2 0 0 20 10 10 10 10 10 10 10 60 |
10 10 10 60 0 0 0 1 Total de píxeles defectuosos: 1 |
Sin desplazamiento (\(dx=dy=0\)): alin es idéntica a cap; solo el defecto real (60) se detecta. |
%%writefile EP06_07.py
# Código PythonOverwriting EP06_07.py
TestSuite("EP06_07.py").run()✔️ EP06_07.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP06_07.cases
🔍 Probando Python: EP06_07.py
⚠️ EP06_07.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.