L'image d'exemple que vous avez publiée a une perspective relativement forte (elle n'est pas imagée directement dans la direction de la surface normale), ce qui peut entraîner des problèmes avec les techniques de correspondance de modèles qui utilisent le traitement par blocs. Je suppose que vous devez prendre l'image avec une perspective forte, donc la première chose que nous voulons faire est d'estimer la transformation de l'image qui supprimera la projection en perspective et donnera une image rectifiée ("image droite").
Correction de la projection en perspective lorsque la forme est connue
Le but ultime du prétraitement est de trouver les coins de ce rectangle gris qui est l'arrière-plan du nuancier. J'ai commencé par seuiller simplement avec une valeur constante. La littérature / le Web contient de nombreuses informations sur la façon de définir un seuil lorsque l'image présente un éclairage inégal, mais si vous le pouvez, essayez de corriger la configuration de l'imagerie de sorte que l'éclairage soit relativement uniforme.
J'ai supposé que le nuancier occupait une grande partie de l'écran, il s'agit donc probablement de la plus grande zone continue de l'image. Il existe de nombreuses fonctions d'étiquetage noir et blanc (MATLABs bwlabel, IPPs LabelMarkers, OpenCV a une bibliothèque externe cvblob) qui donnera à chaque région connectée distincte son propre index. Après l'étiquetage, vous pouvez calculer les zones des composants connectés à l'aide d'un histogramme, puis choisir le composant avec la plus grande zone.
Il est généralement conseillé de remplir les composants de sorte que le composant ne comporte pas de trous, ce qui réduit le nombre de pixels de bord.
Maintenant, nous pouvons utiliser des opérateurs de recherche de bord (j'ai utilisé la méthode basée sur le gradient, mais vous pouvez également tracer le bord en suivant les pixels blancs connectés aux pixels noirs) pour obtenir des pixels appartenant au pensionnaire.
Comme l'objet qui nous intéresse est le rectangle, j'ai ajusté quatre lignes aux pixels de bord en utilisant un ajustement de ligne robuste (RANSAC). Après avoir trouvé une nouvelle ligne, j'ai supprimé tous les points qui étaient proches de la ligne trouvée, ce qui force les opérations d'ajustement suivantes à renvoyer d'autres bords de l'objet. Enfin, lorsque toutes les arêtes ont été trouvées, j'ai calculé toutes les intersections possibles entre l'ensemble des lignes. De l'ensemble des points résultants, j'ai supprimé tous les points en dehors de l'image.
Nous avons maintenant les coins du nuancier et comme nous connaissons les dimensions du nuancier, nous pouvons calculer la matrice de transformation (homographie, projection entre deux plans. Utiliser la transformation linéaire directe (DLT) pour résoudre ) entre les coordonnées millimétriques et les coordonnées des pixels.HHH
x=HX
Cette matrice de transformation peut ensuite être utilisée pour transformer l'image d'origine de telle sorte que le nuancier est imaginé directement à partir de la direction de la normale de surface.
Comme on peut le voir, seule la distorsion radiale reste. Lorsque nous avons utilisé la transformation pour la transformation d'image (interpolation 2D), nous avons choisi les coordonnées d'interpolation telles que nous connaissons la résolution précise de l'image, ce qui signifie que nous connaissons maintenant par exemple la taille des lettres.H
Si nous voulons toujours faire une correspondance de modèle, nous pouvons utiliser n'importe quelle méthode de correspondance de modèle décente. Il n'est pas nécessaire que la méthode soit invariante en rotation / échelle car l'image est déjà rectifiée.