Indisciplinarité

Reconnaissance d’images #01

Toujours dans la série « germes de code », un petit exposé introductif à l’analyse et au traitement des images à des fins artichtiques. Dans l’article précédent, j’ai parlé de « donner la vue à l’image ». Cette idée suit son cours; aujourd’hui, on essaye de donner les moyens à l’ordinateur de reconnaitre une image dans un espace simple, statique. Bien qu’il existe des librairies de vision par ordinateur, tout ceci est fait pour la beauté (ou le plaisir) du geste. Cela nous permettra également d’avoir un tout petit aperçu des problèmes algorithmiques fort passionnants qui se poseront à propos de la vision par ordinateur.

Épisode 1: Reconnaissance stricte d’une image avec Processing

Nous voulons comparer deux images. La première est un modèle de référence, la seconde est donc l’image que l’on veut comparer.

Pour essayer l’algorithme de détection d’une image avec l’autre, nous allons commencer par programmer dans un espace statique, ou les différents espaces (taille de l’image 1, de l’image 2, et l’espace de calcul) sont strictement équivalents. Ainsi la taille du canevas est égal à l’image un qui est égale à l’image 2. Le programme n’effectuera qu’un unique tour de boucle. Nous voulons également retourner le taux de correspondance des deux images en pourcentage.

Pour la démonstration, nous allons utiliser tester l’algo avec différentes images.
1. L’image de référence dégradée légèrement avec du bruit
2. L’image de référence dégradée
3. L’image de référence très dégradée
4. L’image identique à l’image de référence
5. et évidemment l’image de référence que nous utiliserons à chaque fois.

bruite degrade degrade2 identique original

Comme nous ne comparerons seulement deux images à la fois (l’image référence et une image de test) nous n’allons déclarer que deux variables image (ou un tableau d’images, à votre guise). Nous commencerons par comparer l’image de référence avec son identique. Pour la comparaison, nous allons procéder de la façon suivante, très basiquement: nous allons comparer le premier pixel de la première image avec le premier pixel de la seconde image, puis le deuxième pixel de la première image avec le deuxième pixel de la seconde image et ainsi de suite… Si les deux valeurs correspondent, alors on ajoute 1 à une variable M, sinon tant pis. La variable N elle renvoie le nombre de pixels d’une image (les images ayant toutes la même résolution). Donc plus la valeur M se rapprochera de N, plus l’image de test ressemblera à notre image de référence.

Capture d’écran 2015-12-23 à 17.22.17

Ensuite, nous allons charger en mémoire tous les pixels de nos deux images, et comparer à chaque tour de boucle les pixels entre eux. Pour l’instant on vérifie si les couleurs des deux images sont strictement identiques.

Capture d’écran 2015-12-23 à 17.27.13

Ensuite, une petite règle de trois histoire de renvoyer le nombre de pixels en pourcentage ayant correspondu :

Capture d’écran 2015-12-23 à 17.29.51

Si on lance le programme on obtient en console un magnifique 100% si nos deux images sont identiques. Pour vérifier ça, on pourra pour chacune de nos deux variables PImage charger la même image.

Si on s’amuse à modifier (même un tout petit peu) l’image comparée (en modifiant un toutpetipetipeu la teinte par exemple), le programme retourne un violent 0%. Eh oui, ici, le programme juge de façon trop sévère, et si on voudra pousser le programmer plus loin (par exemple reconnaissance des images en passant par un système d’acquisition vidéo) eh bien on l’aura dans le baba.

Capture d’écran 2015-12-23 à 17.37.49

Jugez par vous-même: ces deux images vous semblent identiques? D’un certain point de vue elle le sont… Mais pour l’ordinateur, que dalle! En modifiant la teinte d’un rien (+2 sur GIMP) notre programme trouve encore à redire.

Pour rendre notre programme plus tolérant, on va dire qu’on ne s’intéressera seulement aux nuances, et plus aux couleurs qui ne font qu’ajouter des informations à contrôler.

FA_image_00027768

Ci-dessus, une image issue de la série « La Quatrième Dimension ». C’est en noir et blanc, et pourtant, on peut très bien distinguer les personnages, leur environnement et le notable tigre de Sibérie blanc sur le crâne d’un martien gris foncé en arrière-plan. Ceci est un argument pour souligner le fait que les informations colorimétriques ne sont forcément pas importantes pour distinguer des objets; j’espère que vous êtes convaincus.

Bien alors on ne va contrôler que la luminosité de nos pixels, on va juste ajuster la fonction brightness() lors dans la condition:

Capture d’écran 2015-12-23 à 17.49.47

Et là… Stupeur ! Ma console me dit que les couples de pixels correspondent à environ à 50%! On a laissé du mou, mais mon programme n’est pas encore au point. À ce stade, je pourrais à la louche espérer avoir un taux de correspondance proche de 100%. Et pourtant diantre. Alors on pourrait bidouiller un petit truc pas très élégant en laissant un seuil de jugement:

Capture d’écran 2015-12-23 à 17.55.41

Ici, j’ai ajouté une condition supplémentaire et un seuil de tolérance qui vaut 1 (j’ai donc déclaré plus haut dans mon programme une variable seuil valant 1) … Et ma console me dit effectivement que les images se ressemblent à 100%. Bon. Pas mal.

On a réussit à résoudre dans un premier temps un problème, mais ici, l’algorithme n’est pas assez costaud, on a vu que le moindre changement colorimétrique n’est pas considéré de façon raisonnable. Si on essaye le programme avec les autres images (voir plus haut), nous avons des résultats déplorables (j’ai 16% avec l’image légèrement bruité… Insuffisant). Dans la perspective de la création d’un détecteur d’image via un système d’acquisition vidéo, il nous faut une intelligence plus décontractée qui peut passer outre les déformations liées à la perspective, la différence colorimétrique, les interférences avec d’autres objets, la tolérance au bruit d’image, etc… Pour l’instant on est assez loin d’un algorithme ayant une « intelligence » satisfaisante, mais faisons les choses petit à petit. Allez, à bientôt pour l’épisode 2.

Ho, et sinon, il n’y avait donc pas de tigre de Sibérie sur la photo. Je suis un grand blagueur que voulez-vous. On est comme on est.