Estoy intentando crear un efecto similar al Sin City u otras películas en las que se eliminan todos los colores excepto uno de una imagen.¿Cómo puedo convertir una imagen RGB a escala de grises pero mantener un solo color?
que tienen una imagen RGB que quiero convertir a escala de grises, pero quiero guardar un color.
Esta es mi foto:
Quiero mantener el color rojo. El resto debe ser en escala de grises.
Esto es lo que da salida a mi código hasta el momento (se puede ver que las áreas son correctos, no sé por qué ellos son de color blanco en lugar de rojo, aunque):
Aquí está mi código hasta el momento:
filename = 'roses.jpg';
[cdata,map] = imread(filename);
% convert to RGB if it is indexed image
if ~isempty(map)
cdata = idx2rgb(cdata, map);
end
%imtool('roses.jpg');
imWidth = 685;
imHeight = 428;
% RGB ranges of a color we want to keep
redRange = [140 255];
greenRange = [0 40];
blueRange = [0 40];
% RGB values we don't want to convert to grayscale
redToKeep = zeros(imHeight, imWidth);
greenToKeep = zeros(imHeight, imWidth);
blueToKeep = zeros(imHeight, imWidth);
for x=1:imWidth
for y=1:imHeight
red = cdata(y, x, 1);
green = cdata(y, x, 2);
blue = cdata(y, x, 3);
if (red >= redRange(1) && red <= redRange(2) && green >= greenRange(1) && green <= greenRange(2) && blue >= blueRange(1) && blue <= blueRange(2))
redToKeep(y, x) = red;
greenToKeep(y, x) = green;
blueToKeep(y, x) = blue;
else
redToKeep(y, x) = 999;
greenToKeep(y, x) = 999;
blueToKeep(y, x) = 999;
end
end
end
im = rgb2gray(cdata);
[X, map] = gray2ind(im);
im = ind2rgb(X, map);
for x=1:imWidth
for y=1:imHeight
if (redToKeep(y, x) < 999)
im(y, x, 1) = 240;
end
if (greenToKeep(y, x) < 999)
im(y, x, 2) = greenToKeep(y, x);
end
if (blueToKeep(y, x) < 999)
im(y, x, 3) = blueToKeep(y, x);
end
end
end
imshow(im);
Parece Matlab está proporcionando una solución, pero sería interesante ver un campo de código de este ... Gracias – gary