J'essaye de créer un effet semblable à Sin City ou d'autres films où ils enlèvent toutes les couleurs sauf une d'une image.Comment puis-je convertir une image RVB en niveaux de gris mais conserver une couleur?
J'ai une image RVB que je veux convertir en niveaux de gris mais je veux garder une couleur.
Ceci est mon image:
Je veux garder la couleur rouge. Le reste devrait être en niveaux de gris.
C'est ce que mon code sorties à ce jour (vous pouvez voir que les zones sont correctes, je ne sais pas pourquoi ils sont blancs au lieu de rouge bien):
Voici mon code jusqu'à présent:
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 fournit une solution, mais il serait intéressant de voir un terrain de code de cette ... – gary