我想在图像中将绿色转换为红色。我已经编写了下面的代码,但它无法正常工作
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');
答案 0 :(得分:2)
您的代码交换红色通道和绿色通道。
rgbImage2 = cat(3, greenChannel, redChannel, blueChannel);
将绿色代替红色,红色代替绿色(交换渠道)。
为了保持绿色通道不变,并用绿色替换(原始)红色,请使用以下内容:
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');
答案 1 :(得分:1)
正如Rotem所说,你只是在交换红色和绿色通道。交换影响整个图像而不仅仅是绿色。
首先必须将绿色分段以将绿色更改为任何其他颜色。您可以在Matlab文档中找到几个examples。
我尝试细分和更改绿色,下面的代码可能对您的图片无效,但我猜可能会得到不错的结果。
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')
绿色到红色: