Supongo que hay algunos enfoques diferentes que podrías adoptar para esto. Una pregunta que tengo es: ¿está buscando un color específico (gris, por ejemplo) o está buscando ver si, para un píxel determinado, el color del píxel coincide (cercamente) con los píxeles circundantes? Creo que estás preguntando sobre el primer escenario, buscar un color "objetivo". La otra pregunta es: ¿siempre buscas gris o cambiaría el color objetivo? La razón por la que pregunto es porque el color se compone de 3 componentes, rojo, verde y azul. Pero puedes convertir rgb a una imagen en escala de grises y entonces solo tendrías un componente, lo que simplificaría el código. Asumiré que está trabajando con imágenes en color y buscando un color que no sea gris. Si ese no es el caso, puedes simplificar el código.
Aquí hay un enfoque que creo que funcionaría bien para usted. Vamos a leer nuestra imagen de origen, crearemos una imagen de destino que sea el color de destino que estás buscando y luego restaremos una de la otra. Luego podemos revisar el resultado buscando cualquier píxel que esté dentro de nuestra tolerancia para "igual".
Primero, querrá leer la imagen y obtener los valores de píxeles como tres matrices (roja, verde y azul).
imgSource = NewImage("$Sample_Images\huella de rinoceronte negro.jpg");
{ rSource, gSource, bSource } = imgSource << getPixels("rgb");
win = newWindow("Imagen de origen", imgSource);
A continuación, defina el color objetivo con el que intenta hacer coincidir. Crearé un color gris para este ejemplo, pero puedes especificar cualquier valor (entre 0,0 y 1,0).
rValor = 0,5;
gValor = 0,5;
bValor = 0,5;
Ahora creemos nuevas matrices que representarán nuestra imagen de color de destino. Estas matrices deben tener el mismo tamaño que la imagen de origen, con el color de destino como valor.
{ wd, ht } = imgSource << getSize();
rObjetivo = J(ht, wd, rValue);
gObjetivo = J(ht, wd, gValue);
bObjetivo = J(ht, wd, bValor);
Ahora restemos uno del otro (para cada componente de color).
rDiff = abs(rFuente - rDestino);
gDiff = abs(gFuente - gDestino);
bDiff = abs(bFuente - bDestino);
Ahora definiríamos cuál es nuestra tolerancia. Así de cerca consideramos que es "lo mismo". Digamos que dentro del 2% está bastante cerca de lo mismo.
tolerancia = 0,02;
Ahora podemos recorrer las matrices de diferencias buscando qué valores son menores que la tolerancia. Hay dos maneras de hacer esto. Una sería observar r, gyb y ver si los tres valores son menores que la tolerancia. La otra forma sería combinar las tres matrices de diferencias en una matriz de intensidad (escala de grises) y luego simplemente observar el valor de intensidad por píxel. Personalmente me gusta más ese enfoque. Así que primero voy a convertir a una matriz en escala de grises.
intención = 0,30*rDiff + 0,59*gDiff + 0,11*bDiff;
Ahora recorreré mi matriz de intensidad comparando cada valor con la tolerancia.
para (y = 1, y <= ht, y++,
para (x = 1, x < wd, x++,
si (inten[y,x] < tolerancia,
// Encontré un píxel que es "igual", pongámoslo "rojo" en el original para que aparezca
rFuente[y,x] = 1,0;
gFuente[y,x] = 0,0;
bFuente[y,x] = 0,0;
);
);
);
Ahora restablezcamos los nuevos valores a la imagen original para que podamos ver los píxeles que encontramos.
imgSource << setpixels("rgb", {rSource, gSource, bSource});
¡Y eso es todo!:)
Nuevamente, si está trabajando con imágenes en escala de grises y buscando valores de grises, se vuelve más fácil porque solo estaríamos trabajando con una matriz en lugar de 3 matrices, tanto para el origen como para el destino.
Quizás quieras ver algunas de las muestras de imágenes que puse en el intercambio de archivos. Los archivos, Ejemplos de imágenes.jsl y ImagenDiff.jsl puede ser de gran utilidad. Además, tengo algunas publicaciones de blog que hablan sobre cómo hacer un análisis de color de imágenes, como Análisis de imágenes de la pata de un elefante .
¡Espero que esto ayude!
John