EDI+VA · Esercizio di Programmazione

EP06_07 — 🟣 Pipeline di Ispezione Industriale: Registrazione per Traslazione e Sottrazione

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

  1. 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).
  2. 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).
  3. Registrazione per traslazione: Costruire l’immagine allineata alin applicando 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} \]
  4. 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).
  5. Differenza assoluta: Calcolare, pixel per pixel, \[ \text{diff}(i,j) = |\text{ref}(i,j) - \text{alin}(i,j)| \]
  6. Sogliatura: Definire \(\text{maschera}(i,j) = 1\) se \(\text{diff}(i,j) > T\); altrimenti, \(\text{maschera}(i,j) = 0\).
  7. 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.
🎮 Simulatore EP06_07: Registro a Traslazione + Sottrazione |ref − alin(dx,dy)| > T
Regola lo spostamento del nastro (dx) e la soglia T. Osserva come il bordo "fantasma" scompare quando dx = 0.
rif
alin (registrato)
maschera
–
Figura 6.27: Simulatore EP06_07: Pipeline di Ispezione — Registrazione per Traslazione e Sottrazione
%%writefile EP06_07.py
# Codice Python
Overwriting 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.