Próbuję stworzyć efekt podobny do Sin City lub innych filmów, w których usunięto wszystkie kolory poza jednym z obrazka.Jak przekonwertować obraz RGB na skalę szarości, ale zachować jeden kolor?
Mam obraz RGB, który chcę przekonwertować na skalę szarości, ale chcę zachować jeden kolor.
To jest mój obraz:
chcę zachować kolor czerwony. Reszta powinna być w skali szarości.
To właśnie mój kod wyprowadza tak daleko (widać, że obszary te są poprawne, nie wiem dlaczego oni są białe zamiast czerwonego choć):
Oto mój kod do tej pory:
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);
Wydaje Matlab jest dostarczenie rozwiązania, ale byłoby interesujące zobaczyć golf kod ... – gary