2016-10-23 18 views
2

画像の緑色のみを赤色に変換したいと思います。私は以下のコードを書いたが、それは動作しません正しく画像内のある色を別の色に変更する

rgbImage = imread('image.jpg'); 
    [rows columns numberOfColorBands] = size(rgbImage); 
    imshow(rgbImage, []); 
    title('Original Color Image'); 
    redChannel = rgbImage(:, :, 1); 
    greenChannel = rgbImage(:, :, 2); 
    blueChannel = rgbImage(:, :, 3); 
    rgbImage2 = cat(3, greenChannel, redChannel, blueChannel); 
    imshow(rgbImage2, []); 
    title('Green is now red'); 

答えて

2

あなたのコードスワップレッドカラーチャンネルと緑のカラーチャンネル。


緑の代わりに緑を、緑の代わりに赤(スワップチャンネル)を入れます。

以下を使用し、緑色と赤色(元の)不変の緑色チャネルを維持し、交換するために:
rgbImage2 = cat(3, greenChannel, greenChannel, blueChannel);

結果peppers.png画像用:

rgbImage = imread('peppers.png'); 
[rows columns numberOfColorBands] = size(rgbImage); 
imshow(rgbImage, []); 
title('Original Color Image'); 
redChannel = rgbImage(:, :, 1); 
greenChannel = rgbImage(:, :, 2); 
blueChannel = rgbImage(:, :, 3); 
rgbImage2 = cat(3, greenChannel, greenChannel, blueChannel); 
imshow(rgbImage2, []); 
title('Green is now red'); 

enter image description here

元画像:
enter image description here

+0

Funnily、その写真がそのまま見えます! –

1

Rotemが言ったように、赤と緑のチャンネルを入れ替えるだけです。スワッピングは緑の色の代わりに画像全体に影響を与えます。

緑色を最初にセグメント化して緑色を他の色に変更する必要があります。 examplesのペアは、Matlabのドキュメント自体にあります。

緑の色をセグメント化して変更しようとしましたが、下のコードが画像に反映されない可能性がありますが、まあまあ良い結果を得ることができます。赤い色に

rgbImage = imread('peppers.png'); 
figure, imshow(rgbImage); 
title('Original Image'); 

redChannel = rgbImage(:, :, 1); 
greenChannel = rgbImage(:, :, 2); 
blueChannel = rgbImage(:, :, 3); 

%% Now lets take the difference of each the channels. 
% these subtracted images will be used to mask the segmented area. 
% If you are curious, plot them and see how they look!! 
red_subtract_grn = redChannel-greenChannel; 
red_subtract_blue = redChannel-blueChannel; 
grn_subtract_blue = greenChannel - blueChannel; 
red_add_grn = double(redChannel)+double(greenChannel)+double(blueChannel); 

%% Lets segment the green color by filtering/thresholding technique, 
% we need to choose the index number according to rgbImage, one should tweak a bit to get better results. (These 
% numbers worked well for 'peppers.jpg' image.I have used indexing since its 
% very neat and faster, alternatively you can use find() also). 
try_mask = ones(size(rgbImage(:,:,1))); %Initialize mask image. 
try_mask(red_subtract_blue < 7) = 0; %remove background 
try_mask = medfilt2(try_mask,[4,4]); %Filter unwanted scattered pixels. 
try_mask(red_subtract_grn > 40) = 0; 
try_mask(red_add_grn > 500) = 0; 
try_mask(grn_subtract_blue < 20) = 0; 
try_mask(blueChannel > 80) = 0; 
try_mask = medfilt2(try_mask,[8,8]); 

%% Lets apply mask to remove green and blue pixels such that only red color will appear on the masked region. 
greenChannel(try_mask > 0) = 0; 
blueChannel(try_mask > 0) = 0; 
rgbImage2 = cat(3, redChannel, greenChannel, blueChannel); 

figure, imshow(rgbImage2); 
title('After changing green to red') 

緑色:

img

関連する問題