Noise removal
Understanding
Sources of Noise in Digital Images
Digital images are prone to
a variety of types of noise. Noise is the result of errors in the image
acquisition process that result in pixel values that do not reflect the true
intensities of the real scene. There are several ways that noise can be
introduced into an image, depending on how the image is created. For example:
§ If the
image is scanned from a photograph made on film, the film grain is a source of
noise. Noise can also be the result of damage to the film, or be introduced by
the scanner itself.
§ If the
image is acquired directly in a digital format, the mechanism for gathering the
data (such as a CCD detector) can introduce noise.
§ Electronic
transmission of image data can introduce noise.
To simulate the effects of some of the problems listed above, the
toolbox provides the imnoise function,
which you can use to add various
types of noise to an image. The examples in this section use this function.
Removing
Noise By Linear Filtering
You can use linear
filtering to remove certain types of noise. Certain filters, such as averaging
or Gaussian filters, are appropriate for this purpose. For example, an
averaging filter is useful for removing grain noise from a photograph. Because
each pixel gets set to the average of the pixels in its neighborhood, local
variations caused by grain are reduced.
See Designing and Implementing Linear Filters in the Spatial Domain for more information about linear filtering using imfilter.
Removing
Noise By Median Filtering
Median
filtering is similar to using an averaging filter, in that each output pixel is
set to an average of the pixel values in the neighborhood of the corresponding
input pixel. However, with median filtering, the value of an output pixel is
determined by the median of the
neighborhood pixels, rather than the mean. The median is much less sensitive
than the mean to extreme values (called outliers). Median
filtering is therefore better able to remove these outliers without reducing
the sharpness of the image. The medfilt2 function
implements median filtering.
Note Median
filtering is a specific case of order-statistic
filtering,
also known as rank filtering. For information
about order-statistic filtering, see the reference page for the ordfilt2 function.
|
The following example compares using an averaging filter and medfilt2 to remove salt and pepper noise.
This type of noise consists of random pixels' being set to black or white (the
extremes of the data range). In both cases the size of the neighborhood used
for filtering is 3-by-3.
2.
I = imread('eight.tif');
imshow(I)
figure, imshow(J)
figure, imshow(K)
7. Now use a
median filter to filter the noisy image and display the results. Notice that medfilt2 does a better job of removing noise, with less blurring of edges.
figure, imshow(L)
Removing
Noise By Adaptive Filtering
The wiener2 function
applies a Wiener filter (a type of linear filter) to an image adaptively, tailoring itself to the
local image variance. Where the variance is large,wiener2 performs little smoothing. Where the variance is small, wiener2 performs more smoothing.
This approach often produces better results than linear filtering.
The adaptive filter is more selective than a comparable linear filter,
preserving edges and other high-frequency parts of an image. In addition, there
are no design tasks; the wiener2 function handles all preliminary computations and implements the
filter for an input image. wiener2,
however, does require more computation time than linear filtering.
wiener2 works best when the noise is constant-power ("white")
additive noise, such as Gaussian noise. The example below applies wiener2 to an image of Saturn that has had Gaussian noise added.
2.
RGB =
imread('saturn.png');
I = rgb2gray(RGB);
3.
The example then add Gaussian noise to the image and then displays
the image. Because the image is quite large, the figure only shows a portion of
the image.
4.
J = imnoise(I,'gaussian',0,0.025);
imshow(J)
5. Remove
the noise, using the wiener2 function. Again, the figure only shows a portion of the image
6.
K = wiener2(J,[5 5]);
figure, imshow(K)