Comment puis-je convertir une image RVB en niveaux de gris, mais en garder une seule couleur?

Je suis en train de créer un effet similaire à Sin City ou d'autres films où ils enlèvent toutes les couleurs, sauf un, à partir d'une image.

J'ai une image RVB qui je veux convertir en niveaux de gris, mais je veux garder une couleur.

C'est ma photo:

Comment puis-je convertir une image RVB en niveaux de gris, mais en garder une seule couleur?

Je veux garder la couleur rouge. Le reste doit être en niveaux de gris.

C'est ce que mon code de sorties jusqu'à présent (vous pouvez voir que les zones sont corrects, je ne sais pas pourquoi ils sont blanc au lieu de rouge tout de même):

Comment puis-je convertir une image RVB en niveaux de gris, mais en garder une seule couleur?

Voici mon code pour l'instant:

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);
  • Il semble Matlab est de fournir une solution, mais il serait intéressant de voir un code de golf de cette...
InformationsquelleAutor Richard Knop | 2010-10-31