user3748496
user3748496

Reputation: 13

How to remove gaussian noise?

I have to remove gaussian noise from this image (before, I had to filter it and add the noise). Then, I have to use function "o" and my grade is based on how low result of this function will be. I am trying and trying different things, but I can't remove this noise so I can get a good grade :/ any help please?

   img=imread('liftingbody.png');
   img=double(img)/255;
   maska1=[1 1 1; 1 5 1; 1 1 1]/13;
   odfiltrowany=imfilter(img,maska1);
   zaszumiony=imnoise(odfiltrowany,'gaussian');
   nowy=wiener2(zaszumiony);
   nowy4=medfilt2(nowy);

   o=1/512.*sqrt(sum(sum(img-nowy4).^2));

   subplot(311); imshow(img);
   subplot(312); imshow(zaszumiony);
   subplot(313); imshow(nowy);

Upvotes: 0

Views: 1305

Answers (2)

rayryeng
rayryeng

Reputation: 104464

Adding to @ALM865's answer, you can also use imfilter. In fact, this is the recommended function that you use for images as imfilter has optimizations in place specifically for images. conv2 is the more general function for any 2D signal.

I have also answered how to choose the standard deviation and ultimately the size of your a Gaussian filter / kernel here: By which measures should I set the size of my Gaussian filter in MATLAB?

In essence, once you choose which standard deviation you want, you find a floor(6*sigma) + 1 x floor(6*sigma) + 1 Gaussian kernel to use in your filtering operation. Assuming that sigma = 2, you would get a 13 x 13 kernel. As ALM865 has said, you can create a Gaussian kernel using fspecial. You specify the 'gaussian' flag, followed by the size of the kernel and the standard deviation after. As such:

sigma = 2;
width = 6*sigma + 1;
kernel = fspecial('gaussian', [width width], sigma);
out = imfilter(zaszumiony, kernel, 'replicate');

imfilter takes in the image you want to filter, the convolution kernel you want to use to filter the image, and an optional flag that specifies what happens along the image pixel borders when the kernel doesn't fit completely inside the image. 'replicate' means that it simply copies the pixels along the borders, thus replicating them. There are other options, such as padding with a value (usually zero), circular padding and symmetric padding.

Play around with the standard deviation until you get what you believe is a good result.

Upvotes: 1

ALM865
ALM865

Reputation: 1128

Try convoluting a Gaussian filter with your noisy image to remove Gaussian noise like below:

nowx=conv2(zaszumiony,fspecial('gaussian',[3 3],1.5),'same')/(sum(sum(fspecial('gaussian',[3 3],1.5))));

It should reduce your o function somewhat.

Try playing around with the strength of the filter (i.e. the 1.5 value) and the size of the kernel (i.e. [3 3] value) to reduce the noise to a minimum.

Upvotes: 1

Related Questions