Suppongo che ci siano alcuni approcci diversi che potresti adottare a questo proposito. Una domanda che ho è: stai cercando un colore specifico (grigio, ad esempio) o stai cercando di vedere se per ogni dato pixel, il colore del pixel corrisponde (strettamente) ai pixel circostanti? Penso che tu stia chiedendo del primo scenario, cercando un colore "target". L'altra domanda è: cerchi sempre il grigio o il colore target cambierebbe. Il motivo per cui lo chiedo è perché il colore è composto da 3 componenti, rosso, verde e blu. Ma puoi convertire RGB in un'immagine in scala di grigi e quindi avresti solo un componente, il che renderebbe il codice più semplice. Presumo che tu stia lavorando con immagini a colori, cercando un colore non grigio. Se così non fosse, potresti semplificare il codice.
Ecco un approccio che penso funzionerebbe bene per te. Leggeremo la nostra immagine sorgente, creeremo un'immagine target che è il colore target che stai cercando, quindi ne sottraiamo l'uno dall'altro. Quindi possiamo esaminare il risultato cercando eventuali pixel che rientrano nella nostra tolleranza per "uguale".
Per prima cosa dovresti leggere l'immagine e ottenere i valori dei pixel come tre matrici (rosso, verde e blu).
imgSource = NewImage("$Sample_Images\black rhino foot.jpg");
{ rSource, gSource, bSource } = imgSource << getPixels("rgb");
win = newWindow("Immagine sorgente", imgSource);
Successivamente, definisci il colore target a cui stai cercando di abbinare. Creerò un colore grigio per questo esempio, ma potresti specificare qualsiasi valore (tra 0,0 e 1,0).
valorer = 0,5;
Valoreg = 0,5;
bValore = 0,5;
Ora creiamo nuove matrici che rappresenteranno la nostra immagine a colori target. Queste matrici dovrebbero avere le stesse dimensioni dell'immagine sorgente, con il colore target come valore.
{ wd, ht } = imgSource << getSize();
rTarget = J(ht, wd, rValue);
gTarget = J(ht, wd, gValue);
bDestinazione = J(ht, wd, bValore);
Ora sottraiamo l'uno dall'altro (per ciascun componente di colore).
rDiff = abs(rSource - rTarget);
gDiff = abs(gSource - gTarget);
bDiff = abs(bSorgente - bTarget);
Ora definiremmo qual è la nostra tolleranza. Questo è quanto consideriamo vicini "lo stesso". Diciamo che entro il 2% è abbastanza vicino alla stessa cosa.
tolleranza = 0,02;
Ora possiamo scorrere le matrici delle differenze cercando quali valori sono inferiori alla tolleranza. Ci sono due modi per farlo. Uno sarebbe quello di guardare r, g e b e vedere se tutti e tre i valori sono inferiori alla tolleranza. L'altro modo sarebbe quello di combinare le tre matrici di differenza in un'unica matrice di intensità (scala di grigi) e quindi osservare semplicemente il valore di intensità per pixel. Personalmente preferisco questo approccio. Quindi prima convertirò in una matrice in scala di grigi.
inten = 0,30*rDiff + 0,59*gDiff + 0,11*bDiff;
Ora scorrerò la mia matrice di intensità confrontando ciascun valore con la tolleranza.
per (y = 1, y <= ht, y++,
per (x = 1, x < wd, x++,
se (inten[y,x] < tolleranza,
// Trovato un pixel che è "lo stesso", rendiamolo "rosso" nell'originale in modo che venga visualizzato
rSorgente[y,x] = 1.0;
gSorgente[y,x] = 0,0;
bSorgente[y,x] = 0,0;
);
);
);
Ora reimpostiamo i nuovi valori sull'immagine originale in modo da poter vedere i pixel che abbiamo trovato
imgSource << setpixels("rgb", {rSource, gSource, bSource});
E questo è tutto!:)
Ancora una volta, se stai lavorando con immagini in scala di grigio, cercando valori di grigio, diventa più semplice perché lavoreremo solo con una matrice invece di 3 matrici, sia per l'origine che per la destinazione.
Potresti voler dare un'occhiata ad alcuni degli esempi di immagini che ho inserito nello scambio di file. I file, ImageExamples.jsl E ImageDiff.jsl potrebbe essere molto utile. Inoltre, ho alcuni post sul blog che parlano di come eseguire un'analisi del colore delle immagini, come ad esempio Analisi dell'immagine del piede di un elefante .
Spero che aiuti!
John