truecolor error in changing RGB of pixels
1 次查看(过去 30 天)
显示 更早的评论
Hi, Ive been trying to change the pixels of an image but I get an error everytime I try to change something other than red. For example, red=20, blue=0, green=0 works. However, red=10 blue=10 green=50 doesnt work. The error I get is
Error using image
TrueColor CData contains element out of range 0.0 <= value <= 1.0
Error in changeRGB (line 19)
image(pic) %show image
This is the code
name= input('Enter name of file: \n', 's'); %file name
format= input ('Enter format of file: \n', 's');%file format
redchange = input('Change in percent of red: \n');%red change
bluechange = input ('Change in percent of blue: \n');%blue change
greenchange = input ('Change in percent of green: \n');%green change
pic= imread(name, format); %reading image
pic= double(pic); %converting to doubles
pic=pic/255; %scaling everything by dividing by 255.
pic(:,:,1)= redchange*pic(:,:,1); %multiply the values by percentage
pic(pic(:,:,1)>1)=1; %changing all values over 1 equal to one
pic(:,:,2)= greenchange*pic(:,:,2); %multiply the values by percentage
pic(pic(:,:,2)>1)=1; %changing all values over 1 equal to one
pic(:,:,3)= bluechange*pic(:,:,3); %multiply the values by percentage
pic(pic(:,:,3)>1)=1; %changing all values over 1 equal to one
image(pic) %show image
axis off %no axis
0 个评论
采纳的回答
Mohammad Abouali
2014-10-19
编辑:Mohammad Abouali
2014-10-19
pic(pic(:,:,2)>1)=1
and
pic(pic(:,:,3)>1)=1
These are not doing what you think they should do.
The best is to change the last part of your code like this
pic(:,:,1)= redchange*pic(:,:,1); %multiply the values by percentage
pic(:,:,2)= greenchange*pic(:,:,2); %multiply the values by percentage
pic(:,:,3)= bluechange*pic(:,:,3); %multiply the values by percentage
pic(pic>1)=1;
pic(pic<0)=0;
so remove all three pic(pic(:,:,1)>1)=1, pic(pic(:,:,2)>1)=1, and pic(pic(:,:,3)>1)=1 and just before image(pic) replace them with pic(pic>1)=1; and pic(pic<0)=0;
2 个评论
Image Analyst
2014-10-19
Please mark the answer as accepted since you said it works. It's because you used logical indexing wrong. You got a logical index based on just one color channel. Then you used that it index into a 3D array. Since your logical index will have only rows*columns elements, it will change ONLY those. Since it does not have rows*columns*numberOfColorChannels, it will clip only a third of the pixels, not all of them. To get all of the logical indexes that cover all three color channels, do what Mohammad showed you.
Alternatively do it a 2D image at a time
greenChannel = pic(:, :, 2);
greenChannel(greenChannel>1)=1;
In the above case both the logical index vector greenChannel>1, and the greenChannel itself have the same number of elements so all elements will get checked instead of just some of them.