Ich nehme an, es gibt ein paar verschiedene Ansätze, die Sie hierfür verfolgen könnten. Eine Frage, die ich habe, ist: Suchen Sie nach einer bestimmten Farbe (z. B. Grau) oder möchten Sie herausfinden, ob die Pixelfarbe eines bestimmten Pixels (nahezu) mit den umgebenden Pixeln übereinstimmt? Ich denke, Sie fragen nach dem ersten Szenario, bei dem nach einer „Zielfarbe“ gesucht wird. Die andere Frage ist, suchen Sie immer nach Grau oder würde sich die Zielfarbe ändern? Der Grund, warum ich frage, ist, dass Farbe aus drei Komponenten besteht: Rot, Grün und Blau. Aber man kann RGB in ein Graustufenbild umwandeln und hätte dann nur eine Komponente, was den Code einfacher machen würde. Ich gehe davon aus, dass Sie mit Farbbildern arbeiten und nach einer nicht grauen Farbe suchen. Wenn das nicht der Fall ist, können Sie den Code vereinfachen.
Hier ist ein Ansatz, von dem ich denke, dass er für Sie gut funktionieren würde. Wir lesen unser Quellbild ein, erstellen ein Zielbild mit der von Ihnen gesuchten Zielfarbe und subtrahieren dann die Farben voneinander. Dann können wir das Ergebnis durchsehen und nach Pixeln suchen, die innerhalb unserer Toleranz für „gleich“ liegen.
Zuerst möchten Sie das Bild einlesen und die Pixelwerte als drei (rote, grüne und blaue) Matrizen erhalten.
imgSource = NewImage("$Sample_Images\black rhinofootprint.jpg");
{ rSource, gSource, bSource } = imgSource << getPixels("rgb");
win = newWindow("Quellbild", imgSource);
Definieren Sie als Nächstes die Zielfarbe, die Sie angleichen möchten. Ich werde für dieses Beispiel eine graue Farbe erstellen, Sie können jedoch beliebige Werte angeben (zwischen 0,0 und 1,0).
rWert = 0,5;
gWert = 0,5;
bWert = 0,5;
Jetzt erstellen wir neue Matrizen, die unser Zielfarbbild darstellen. Diese Matrizen sollten die gleiche Größe wie das Quellbild haben, wobei die Zielfarbe der Wert ist.
{ wd, ht } = imgSource << getSize();
rTarget = J(ht, wd, rValue);
gTarget = J(ht, wd, gValue);
bTarget = J(ht, wd, bValue);
Subtrahieren wir nun das eine vom anderen (für jede Farbkomponente).
rDiff = abs(rSource - rTarget);
gDiff = abs(gSource - gTarget);
bDiff = abs(bSource – bTarget);
Jetzt würden wir definieren, was unsere Toleranz ist. So nahe kommen wir uns „gleich“ vor. Nehmen wir an, eine Abweichung von weniger als 2 % ist nahe genug am Gleichen.
Toleranz = 0,02;
Jetzt können wir die Diff-Matrizen durchlaufen und nach Werten suchen, die unter der Toleranz liegen. Es gibt zwei Möglichkeiten, dies zu tun. Eine Möglichkeit besteht darin, sich r, g und b anzusehen und zu prüfen, ob alle drei Werte unter der Toleranz liegen. Die andere Möglichkeit wäre, die drei Diff-Matrizen zu einer Intensitätsmatrix (Graustufenmatrix) zu kombinieren und dann nur den einen Intensitätswert pro Pixel zu betrachten. Persönlich gefällt mir dieser Ansatz besser. Daher werde ich zunächst in eine Graustufenmatrix konvertieren.
inten = 0,30*rDiff + 0,59*gDiff + 0,11*bDiff;
Jetzt durchlaufe ich meine Intensitätsmatrix und vergleiche jeden Wert mit der Toleranz.
für (y = 1, y <= ht, y++,
für (x = 1, x < wd, x++,
if (inten[y,x] < Toleranz,
// Ein Pixel gefunden, das „gleich“ ist. Machen wir es im Original „rot“, damit es angezeigt wird
rSource[y,x] = 1.0;
gQuelle[y,x] = 0,0;
bQuelle[y,x] = 0,0;
);
);
);
Setzen wir nun die neuen Werte auf das Originalbild zurück, damit wir die gefundenen Pixel sehen können
imgSource << setpixels("rgb", {rSource, gSource, bSource});
Und das ist alles!:) 
Auch hier gilt: Wenn Sie mit Graustufenbildern arbeiten und nach Grauwerten suchen, wird es einfacher, da wir nur mit einer Matrix statt mit drei Matrizen arbeiten würden, sowohl für die Quelle als auch für das Ziel.
Vielleicht möchten Sie sich einige der Bildbeispiele ansehen, die ich im Dateiaustausch bereitgestellt habe. Die Dateien, ImageExamples.jsl Und ImageDiff.jsl kann am nützlichsten sein. Außerdem habe ich einige Blog-Beiträge, in denen es um die Durchführung einer Farbanalyse von Bildern geht, z Bildanalyse eines Elefantenfußes .
Ich hoffe das hilft!
John