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
- 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).
- 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). - Enregistrement par translation : Construire l’image alignée
alinen 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} \] - 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).
- Différence absolue : Calculer, pixel par pixel, \[ \text{diff}(i,j) = |\text{ref}(i,j) - \text{alin}(i,j)| \]
- Seuillage : Définir \(\text{masque}(i,j) = 1\) si \(\text{diff}(i,j) > T\) ; sinon, \(\text{masque}(i,j) = 0\).
- 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é. |
%%writefile EP06_07.py
# Code PythonOverwriting 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.