How can I smooth out the colour of a image?
17 views (last 30 days)
Show older comments
Hi everyone. I want to smooth out little differences in a image of a green wall. It would be ideal if in the end there is in every value of the pixels the same colour value. It's a image of a green wall with two red points in it.
Below I tried to lay a filter for every colourbase (red, green and blue) to smoothen out the differences. But in the end there is in every value of every colourbase the value 32. Just at the rimvalues there are the original values.
Can somebody tell me, why my code isnt working? thank you for your help in advance and sorry for my english.
Best regards Lorenz
pixel = 10;
while loop
picture = camera.snapshot;
picture = imresize(picture,[pixel,pixel]);
FilterRed = picture(:,:,1);
for r = 2:(pixel-1)
for c = 2:(pixel-1)
FilterRed(r,c) = (1/8)*(picture(r-1,c)+picture(r-1,c+1)+...
picture(r,c+1)+picture(r+1,c+1)+picture(r+1,c)+...
picture(r+1,c-1)+picture(r,c-1)+picture(r-1,c-1));
end
end
FilterGreen = picture(:,:,2);
for r = 2:(pixel-1)
for c = 2:(pixel-1)
FilterGreen(r,c) = (1/8)*(picture(r-1,c)+picture(r-1,c+1)+...
picture(r,c+1)+picture(r+1,c+1)+picture(r+1,c)+...
picture(r+1,c-1)+picture(r,c-1)+picture(r-1,c-1));
end
end
FilterBlue = picture(:,:,3);
for r = 2:(pixel-1)
for c = 2:(pixel-1)
FilterBlue(r,c) = (1/8)*(picture(r-1,c)+picture(r-1,c+1)+...
picture(r,c+1)+picture(r+1,c+1)+picture(r+1,c)+...
picture(r+1,c-1)+picture(r,c-1)+picture(r-1,c-1));
end
end
Filter = zeros(pixel,pixel,3,'uint8');
Filter(:,:,1) = FilterRed;
Filter(:,:,2) = FilterGreen;
Filter(:,:,3) = FilterBlue;
image(Filter);
truesize([530 530]);
end
2 Comments
KALYAN ACHARJYA
on 31 Jul 2018
What you exactly want? Share the test image? What is wrong? Have you applied any image smoothing filters?
Answers (1)
DGM
on 27 Nov 2022
Edited: DGM
on 27 Nov 2022
There are a number of things going wrong, but the reason why it's black is simple.
FilterRed = picture(:,:,1); % this is uint8
for r = 2:(pixel-1) % avoiding the edges by 1px
for c = 2:(pixel-1)
% there are 9px in a 3x3 neighborhood, but you're only sampling 8
% the RHS always samples from picture(:,:,1), not from FilterRed
% the sum of the neighborhood will be truncated due to its class
FilterRed(r,c) = (1/8)*(picture(r-1,c)+picture(r-1,c+1)+...
picture(r,c+1)+picture(r+1,c+1)+picture(r+1,c)+...
picture(r+1,c-1)+picture(r,c-1)+picture(r-1,c-1));
end
end
The only reason why there is a 1px ring around the image is because those pixels are never filtered due to the indexing limits. Sampling from the wrong channel is going to be a problem as well.
The fact that you're operating in uint8 means that you'll end up truncating everything when you take the sum. The maximal value you can represent in uint8 is 255. For most image regions, 9x the average intensity exceeds 255, so the sum will always be clipped to 255. You then take the clipped sum and divide by 8, resulting in 32. That's why everything is 32.
In the end, none of this is necessary.
inpict = imread('peppers.png');
% filter the image
fk = fspecial('average',[5 5]); % using 5x5 so it's easier to see here
outpict = imfilter(inpict,fk); % no loops, no splitting
imshow(outpict)
As to what the giant red circle with a transparent border is about, I have no idea. Be aware that transparent regions have color too. They might not have the color you think they do, so if you go blurring them, you might end up with problems. In this case, the transparent regions are black, not red.
0 Comments
See Also
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!