How can I smooth out the colour of a image?
11 次查看(过去 30 天)
显示 更早的评论
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 个评论
KALYAN ACHARJYA
2018-7-31
What you exactly want? Share the test image? What is wrong? Have you applied any image smoothing filters?
回答(1 个)
DGM
2022-11-27
编辑:DGM
2022-11-27
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 个评论
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!