image_denoise, a MATLAB code which uses the median filter to try to remove noise from an image.

In MATLAB, a black and white or gray scale image can be represented using a 2D array of nonnegative integers over some range 0 to GMAX. The value 0 indicates black, and GMAX white. Intermediate values represent shades of gray in a natural way. Note, however, that the eye has a nonlinear response to intensity, so that the value GMAX/2 will not be perceived as halfway between 0 and GMAX. That is a separate issue.

A color image can be represented using a set of three 2D arrays, which can be thought of as R, G, and B, and which represent the intensity of the red, green and blue signals that combine to form the color image. A common maximum value is assumed, RGBMAX.

An image can be read into MATLAB using the imread function in the Image Processing Toolbox.

A good image is damaged by the addition of "salt and pepper" noise; that is, a scattering of individual pixels have been randomly reset to the lowest or highest possible values. In a gray scale picture, such noise looks as though salt and pepper were added to the picture.

Since an image is fairly "smooth", each good pixel should actually be fairly close to the values of good pixels nearby, while this will not be true for the salt and pepper pixels. So one way to make the noise go away, at the cost of some minor blurring, is to replace each pixel by the median value of itself and its neighbors.

MATLAB provides a command medfilt2 which will do this, with the user allowed to specify the shape of a rectangular neighborhood about each pixel. However, in this example, we go through some of the lower level details "by hand", using finally the median command to get what we want.

Along the way, it should become clear how to deal with grayscale and RGB images. Moreover, some other issues arise, such as ensuring that the processed data retains the "unsigned 8-bit integer" property of the original data.

The functions image_denoise_gray_news and image_denoise_rgb_news use the central pixel and its north, east, west and south neighbors.

The functions image_denoise_gray_3x3 and image_denoise_rgb_3x3 use the central pixel and the entire layer of 8 pixels that lie at most one pixel away in the north/south and east/west directions.


The computer code and data files described and made available on this web page are distributed under the MIT license


image_denoise is available in a C version and a C++ version and a FORTRAN90 version and a MATLAB version.

Related Data and Programs:

image_boundary, a MATLAB code which reports the pixels which form the boundary between the black and white regions of a simple image.

image_components, a MATLAB code which seeks the connected "nonzero" or "nonblack" components of an image or integer vector, array or 3D block.

image_contrast, a MATLAB code which applies image processing techniques to increase the contrast in an image.

image_decimate, a MATLAB code which compresses an image by dropping the even rows and columns of data.


image_diffuse, a MATLAB code which uses diffusion to smooth out an image.

image_double, a MATLAB code which doubles the height and width of an image by repeating each row and column.

image_edge, a MATLAB code which demonstrates a simple procedure for edge detection in images.

image_noise, MATLAB codes which add noise to an image.

image_quantization, a MATLAB code which demonstrates how the KMEANS algorithm can be used to reduce the number of colors or shades of gray in an image.

image_rgb_to_gray, MATLAB codes which makes a grayscale version of an RGB image.

image_threshold, MATLAB codes which make a black and white version of a grayscale image by setting all pixels below or above a threshold value to black or white.


MathWorks documentation for the Image Processing Toolbox is available at

Source Code:

Last revised on 03 February 2019.