TNI+VO · Exercice de Programmation

EP06_07 — 🟣 Pipeline d’inspection industrielle : enregistrement par translation et soustraction

6.14.7 EP06_07 🟣 Pipeline d’inspection industrielle : enregistrement par translation et soustraction

Sur une chaîne de production, une caméra fixe photographie chaque pièce passant sur le tapis roulant, en la comparant à une image de référence sans défauts. Le problème : de petites vibrations du tapis déplacent la pièce par rapport à la position de référence à chaque capture. Si la soustraction d’images est appliquée directement, sans correction, le déplacement en lui-même génère déjà d’énormes différences — faux positifs qui masquent les défauts réels.

Cet exercice est le plus complet du chapitre : vous devez d’abord enregistrer (aligner géométriquement) l’image capturée en utilisant un déplacement connu \((dx, dy)\), fourni par un capteur de position du tapis, et seulement ensuite appliquer la soustraction avec seuillage, exactement comme décrit dans la section sur l’inspection industrielle.

6.14.7.1 📋 Directives d’implémentation

  1. Dimensions et paramètres : Lire \(L\), \(C\) (dimensions des images), le déplacement entier connu \(dx, dy\) (pouvant être négatifs) et le seuil de détection \(T\) (entier).
  2. Images : Lire la matrice de référence (ref, \(L\times C\), sans défauts) et la matrice capturée (cap, \(L\times C\), éventuellement déplacée et avec défaut).
  3. Enregistrement par translation : Construire l’image alignée alin en appliquant le déplacement \((dx,dy)\) reçu : \[ \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{sinon} \end{cases} \]
  4. Remplissage des bords : Les positions qui « sortent » de l’image capturée après le déplacement reçoivent la valeur 0 (zero-padding — hors du champ de vision de la caméra ; notez que cet exercice utilise zéro, contrairement à la réplication des bords de l’EP06_06).
  5. Différence absolue : Calculer, pixel par pixel, \[ \text{diff}(i,j) = |\text{ref}(i,j) - \text{alin}(i,j)| \]
  6. Seuillage : Définir \(\text{masque}(i,j) = 1\) si \(\text{diff}(i,j) > T\) ; sinon, \(\text{masque}(i,j) = 0\).
  7. Sortie : Dans cet ordre — (a) la matrice alin (\(L\times C\)) ; (b) le masque de défaut (\(L\times C\)) ; (c) une dernière ligne avec le nombre total de pixels classés comme défectueux.

6.14.7.2 📌 Contraintes computationnelles

  • Zero-padding, pas de réplication : les positions hors des limites de l’image capturée, après le déplacement, valent exactement 0 — c’est le point qui différencie le plus cet exercice de l’EP06_06.
  • Comparaison stricte : \(\text{diff}(i,j) > T\).
  • Signe de \((dx,dy)\) : le déplacement peut être positif ou négatif ; la formule de l’étape 3 doit être appliquée littéralement, sans inverser les signes.
  • Toutes les valeurs sont des entiers : aucun arrondi n’est effectué à cette étape.

6.14.7.3 🧠 Fondement théorique

Étape omise Conséquence
Sauter l’enregistrement géométrique Le bord entier de l’image (introduit par le déplacement) est marqué comme « défaut » — faux positif systématique
Enregistrement avec \((dx,dy)\) incorrect La pièce et la référence restent désalignées ; la soustraction détecte des contours déplacés, pas de véritables défauts
Seuil \(T\) trop bas Le bruit de capture (variations de 1 à 2 niveaux de gris) est confondu avec un défaut
Seuil \(T\) trop élevé Les défauts subtils ne sont plus détectés

L’enregistrement géométrique et la soustraction sont des étapes complémentaires : le premier garantit que les deux images représentent exactement la même scène dans le même référentiel spatial ; la seconde isole ce qui a réellement changé entre elles — idéalement, uniquement les défauts.

6.14.7.4 📦 Spécification d’entrée et de sortie (VPL)

Entrée :

  • Ligne 1 : Entier \(L\).
  • Ligne 2 : Entier \(C\).
  • Ligne 3 : Deux entiers \(dx\) et \(dy\), séparés par un espace.
  • Ligne 4 : Entier \(T\).
  • Les \(L\) lignes suivantes : éléments entiers de la matrice ref.
  • Les \(L\) lignes suivantes : éléments entiers de la matrice cap.

Sortie :

  • \(L\) lignes avec la matrice alin.
  • \(L\) lignes avec le masque de défaut (0/1).
  • Dernière ligne : Total de pixels défectueux : X.

6.14.7.5 📌 Exemples

Entrée Sortie Observation
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 défectueux : 4
\(dx=1\) décale la lecture d’une colonne vers la droite ; la dernière colonne de alin n’a pas de correspondance
(devient 0) et est systématiquement marquée ; le défaut réel (90) est également détecté.
2
2
0 0
20
10 10
10 10
10 10
10 60
10 10
10 60
0 0
0 1
Total de pixels défectueux : 1
Sans déplacement (\(dx=dy=0\)) : alin est identique à cap ; seul le défaut réel (60) est détecté.
🎮 Simulateur EP06_07 : Registre par Translation + Soustraction |ref − alin(dx,dy)| > T
Ajustez le déplacement du tapis (dx) et le seuil T. Observez comment le bord « fantôme » disparaît lorsque dx = 0.
ref
alin (enregistré)
masque
–
Figure 6.27: Simulateur EP06_07 : Pipeline d’inspection — Enregistrement par translation et soustraction
%%writefile EP06_07.py
# Code Python
Overwriting EP06_07.py
TestSuite("EP06_07.py").run()
✔️ EP06_07.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP06_07.cases

🔍 Test de Python : EP06_07.py
⚠️ EP06_07.py : fichier vide (moins de 3 lignes). Tests ignorés.