6.14.7 EP06_07 🟣 Pipeline di Ispezione Industriale: Registrazione per Traslazione e Sottrazione
In una linea di produzione, una telecamera fissa fotografa ogni pezzo che passa sul nastro trasportatore, confrontandolo con un’immagine di riferimento priva di difetti. Il problema: piccole vibrazioni del nastro spostano il pezzo rispetto alla posizione di riferimento a ogni acquisizione. Se la sottrazione di immagini viene applicata direttamente, senza correzione, lo spostamento di per sé genera già differenze enormi — falsi positivi che mascherano i difetti reali.
Questo è l’esercizio più completo del capitolo: devi prima registrare (allineare geometricamente) l’immagine acquisita usando uno spostamento noto \((dx, dy)\), fornito da un sensore di posizione del nastro, e solo successivamente applicare la sottrazione con sogliatura, esattamente come descritto nella sezione sull’ispezione industriale.
6.14.7.1 📋 Linee Guida di Implementazione
- Dimensioni e parametri: Leggere \(L\), \(C\) (dimensioni delle immagini), lo spostamento intero noto \(dx, dy\) (che può essere negativo) e la soglia di rilevamento \(T\) (intero).
- Immagini: Leggere la matrice di riferimento (
ref, \(L\times C\), senza difetti) e la matrice acquisita (cap, \(L\times C\), possibilmente spostata e con difetti). - Registrazione per traslazione: Costruire l’immagine allineata
alinapplicando lo spostamento \((dx,dy)\) ricevuto: \[ \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{altrimenti} \end{cases} \] - Riempimento dei bordi: Le posizioni che “escono” dall’immagine acquisita dopo lo spostamento ricevono il valore 0 (zero-padding — al di fuori del campo visivo della telecamera; nota che questo esercizio usa zero, diversamente dalla replicazione dei bordi dell’EP06_06).
- Differenza assoluta: Calcolare, pixel per pixel, \[ \text{diff}(i,j) = |\text{ref}(i,j) - \text{alin}(i,j)| \]
- Sogliatura: Definire \(\text{maschera}(i,j) = 1\) se \(\text{diff}(i,j) > T\); altrimenti, \(\text{maschera}(i,j) = 0\).
- Output: In questo ordine — (a) la matrice
alin(\(L\times C\)); (b) la maschera dei difetti (\(L\times C\)); (c) un’ultima riga con il totale dei pixel classificati come difettosi.
6.14.7.2 📌 Vincoli Computazionali
- Zero-padding, non replicazione: le posizioni al di fuori dei limiti dell’immagine acquisita, dopo lo spostamento, valgono esattamente 0 — questo è il punto che differenzia maggiormente questo esercizio dall’EP06_06.
- Confronto stretto: \(\text{diff}(i,j) > T\).
- Segno di \((dx,dy)\): lo spostamento può essere positivo o negativo; la formula del passo 3 deve essere applicata letteralmente, senza invertire i segni.
- Tutti i valori sono interi: non c’è arrotondamento in questa fase.
6.14.7.3 🧠 Fondamentazione Teorica
| Fase omessa | Conseguenza |
|---|---|
| Saltare la registrazione geometrica | L’intero bordo dell’immagine (introdotto dallo spostamento) viene marcato come “difetto” — falso positivo sistematico |
| Registrazione con \((dx,dy)\) errato | Il pezzo e il riferimento rimangono disallineati; la sottrazione rileva contorni spostati, non difetti reali |
| Soglia \(T\) troppo bassa | Il rumore di acquisizione (variazioni di 1–2 livelli di grigio) viene confuso con un difetto |
| Soglia \(T\) troppo alta | I difetti sottili non vengono rilevati |
La registrazione geometrica e la sottrazione sono fasi complementari: la prima garantisce che entrambe le immagini rappresentino esattamente la stessa scena nello stesso riferimento spaziale; la seconda isola ciò che è realmente cambiato tra di esse — idealmente, solo i difetti.
6.14.7.4 📦 Specifica di Input e Output (VPL)
Input:
- Riga 1: Intero \(L\).
- Riga 2: Intero \(C\).
- Riga 3: Due interi \(dx\) e \(dy\), separati da uno spazio.
- Riga 4: Intero \(T\).
- Prossime \(L\) righe: elementi interi della matrice
ref. - Prossime \(L\) righe: elementi interi della matrice
cap.
Output:
- \(L\) righe con la matrice
alin. - \(L\) righe con la maschera dei difetti (0/1).
- Ultima riga:
Totale di pixel difettosi: X.
6.14.7.5 📌 Esempi
| Input | Output | Osservazione |
|---|---|---|
| 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 Totale di pixel difettosi: 4 |
\(dx=1\) sposta la lettura di una colonna verso destra; l’ultima colonna di alin rimane senza corrispondenza (diventa 0) e viene sistematicamente marcata; anche il difetto reale (90) viene rilevato. |
| 2 2 0 0 20 10 10 10 10 10 10 10 60 |
10 10 10 60 0 0 0 1 Totale di pixel difettosi: 1 |
Senza spostamento (\(dx=dy=0\)): alin è identica a cap; solo il difetto reale (60) viene rilevato. |
%%writefile EP06_07.py
# Codice PythonOverwriting EP06_07.py
TestSuite("EP06_07.py").run()✔️ EP06_07.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP06_07.cases
🔍 Test di Python: EP06_07.py
⚠️ EP06_07.py: file vuoto (meno di 3 righe). Test saltati.