Je suppose que vous pouvez adopter différentes approches pour résoudre ce problème. Une question que je me pose est la suivante : recherchez-vous une couleur spécifique (gris, par exemple) ou cherchez-vous à voir si, pour un pixel donné, la couleur du pixel correspond-elle (étroitement) aux pixels environnants ? Je pense que vous posez des questions sur le premier scénario, à la recherche d'une couleur "cible". L'autre question est de savoir si vous recherchez toujours du gris ou si la couleur cible changerait. La raison pour laquelle je pose la question est que la couleur est composée de 3 composants : le rouge, le vert et le bleu. Mais vous pouvez convertir RVB en une image en niveaux de gris et vous n'aurez alors qu'un seul composant, ce qui simplifierait le code. Je suppose que vous travaillez avec des images couleur et recherchez une couleur non grise. Si ce n'est pas le cas, vous pouvez simplifier le code.
Voici une approche qui, je pense, fonctionnerait bien pour vous. Nous allons lire notre image source, créer une image cible qui est la couleur cible que vous recherchez, puis nous soustrairons l'une de l'autre. Ensuite, nous pouvons parcourir le résultat à la recherche de tous les pixels qui se trouvent dans notre tolérance pour « identique ».
Vous voudriez d’abord lire l’image et obtenir les valeurs des pixels sous forme de trois matrices (rouge, verte et bleue).
imgSource = NewImage("$Sample_Images\empreinte du rhinocéros noir.jpg");
{ rSource, gSource, bSource } = imgSource << getPixels("rgb");
win = newWindow("Image source", imgSource);
Ensuite, définissez la couleur cible à laquelle vous essayez de faire correspondre. Je vais créer une couleur grise pour cet exemple, mais vous pouvez spécifier n'importe quelle valeur (entre 0,0 et 1,0).
rValeur = 0,5 ;
gValeur = 0,5 ;
bValeur = 0,5 ;
Créons maintenant de nouvelles matrices qui représenteront notre image couleur cible. Ces matrices doivent avoir la même taille que l'image source, avec la couleur cible comme valeur.
{ wd, ht } = imgSource << getSize();
rCible = J(ht, wd, rValue);
gTarget = J(ht, wd, gValue);
bCible = J(ht, wd, bValue);
Soustrayons maintenant l’un de l’autre (pour chaque composant de couleur).
rDiff = abs(rSource - rTarget);
gDiff = abs(gSource - gTarget);
bDiff = abs(bSource - bTarget);
Maintenant, nous définirions quelle est notre tolérance. C'est à quel point nous considérons que c'est « la même chose ». Disons que 2 % est assez proche de la même chose.
tolérance = 0,02 ;
Nous pouvons maintenant parcourir les matrices de comparaison pour rechercher quelles valeurs sont inférieures à la tolérance. Il y a deux façons de faire ça. La première consisterait à examiner r, g et b et à voir si les trois valeurs sont inférieures à la tolérance. L'autre façon serait de combiner les trois matrices de différence en une seule matrice d'intensité (échelle de gris), puis de simplement regarder la valeur d'intensité par pixel. Personnellement, je préfère cette approche. Je vais donc d'abord convertir en une matrice en niveaux de gris.
inten = 0,30*rDiff + 0,59*gDiff + 0,11*bDiff ;
Je vais maintenant parcourir ma matrice d'intensité en comparant chaque valeur à la tolérance.
pour (y = 1, y <= ht, y++,
pour (x = 1, x < wd, x++,
si (inten[y,x] < tolérance,
// J'ai trouvé un pixel qui est "le même", rendons-le "rouge" dans l'original pour qu'il apparaisse
rSource[y,x] = 1,0 ;
gSource[y,x] = 0,0 ;
bSource[y,x] = 0,0 ;
);
);
);
Maintenant, rétablissons les nouvelles valeurs sur l'image d'origine afin que nous puissions voir les pixels que nous avons trouvés.
imgSource << setpixels("rgb", {rSource, gSource, bSource});
Et c'est tout ce qu'il y a à faire !:)
Encore une fois, si vous travaillez avec des images en niveaux de gris et recherchez des valeurs de gris, cela devient plus facile car nous travaillerions simplement avec une seule matrice au lieu de 3 matrices, à la fois pour la source et la cible.
Vous voudrez peut-être regarder certains des échantillons d'images que j'ai mis sur l'échange de fichiers. Les fichiers, ImageExamples.jsl et ImageDiff.jsl peut être très utile. De plus, j'ai quelques articles de blog qui parlent de faire une analyse des couleurs des images, comme Analyse d'image d'une patte d'éléphant .
J'espère que ça aide!
John