code does not seem to work but is not giving any errors

I=imread('phonebox2_noisy.bmp');
a=I;
[row, col, channel]=size(a);
red=a(:,:,1);
green=a(:,:,2);
blue=a(:,:,3);
a1 = red;
a2 = green;
a3 = blue;
for i=2:1:row-1
for j = 2:1:col-1
a1(i,j)= (red(i-1,j-1)+red(i-1,j)+red(i-1,j+1)+red(i,j-1)+red(i,j)+red(i,j+1)+...
red(i+1,j-1)+red(i+1,j)+red(i+1,j+1));
a1=sort(a1);
red(i,j)= a1(5);
a2(i,j)= (green(i-1,j-1)+green(i-1,j)+green(i-1,j+1)+green(i,j-1)+green(i,j)+green(i,j+1)+...
green(i+1,j-1)+green(i+1,j)+green(i+1,j+1));
a2=sort(a2);
green(i,j)= a2(5);
a3(i,j)= (blue(i-1,j-1)+blue(i-1,j)+blue(i-1,j+1)+blue(i,j-1)+blue(i,j)+blue(i,j+1)+...
blue(i+1,j-1)+blue(i+1,j)+blue(i+1,j+1));
a3=sort(a3);
blue(i,j)= a3(5);
end
end
final=cat(3,red,green,blue);
figure;
imshow(a);
title('latte noisy');
figure;
imshow(final);
title('latte');

1 Kommentar

Can you post your bitmap? It runs on the coloredChips.png sample image that comes with MATLAB, though I don't know what the output is supposed to look like. Sometimes bitmaps are not 24 bit color, try using imfinfo on your image.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Walter Roberson
Walter Roberson am 26 Jan. 2022
a1(i,j)= (red(i-1,j-1)+red(i-1,j)+red(i-1,j+1)+red(i,j-1)+red(i,j)+red(i,j+1)+...
red(i+1,j-1)+red(i+1,j)+red(i+1,j+1));
As written, that is a problem because red is going to be an integer data type such as uint8, and adding uint8 gives you a uint8 -- which will very likely overflow.
a1=sort(a1);
You are doing that within the loop. So you are replacing one element of a1 at a time, and sorting the entire a1 array.
red(i,j)= a1(5);
a1 is a 2D array the same size as red so a1(5) is likely to be the same as a1(5,1)
I get the impression that your code is attempting to do a median filter. To do a median filter "by hand" (instead of using medfilt2() ) you should not add those elements of red, you should extract them. For example,
a1 = red(i-1:i+1, j-1:j+1);
a1 = sort(a1(:));

3 Kommentare

yes I'm trying to create a median algorithm. I need to include all the i,j values as it required for a paper I'm writing. Could you recommend another way, similar to the way I'm currently writing it ?
thanks
I would recommend just using medfilt2() .
If for some reason you can't use that, then
a1 = red(i-1:i+1, j-1:j+1);
red(i,j) = median(a1(:));
and if you are not even permitted to use median() then
a1 = red(i-1:i+1, j-1:j+1);
a1 = sort(a1(:));
red(i,j) = a1(5);
thank you

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by