median blur

(December 2010)


The median average of a set of numbers is the number in the middle, so that half of the set is lesser than (or equal to) the median.

To calculate the median of a list, sort the list and pick the number in the middle.

1 1 2
4 5 99

The median of a list with an even number of elements is the average of the two middle elements.

2D median blur

Consider an input image with noise added:

    img[:, :] = 100
    for y in range(HEIGHT):
        for x in range(WIDTH):
            if random.randint(0,100) < percent:
                img[y][x] = random.randint(0,255)

For every pixel in the output image, we take the corresponding pixel from the input image, and all surrounding pixels within a specified radius, and calculate the median of their values.

Here's what this looks like for different amounts of noise:

Noise Input Output Radius
10% 3px
50% 3px

Note that the median is statistically robust as long as 50% of your data isn't noise. Once the majority of your samples are wrong, your outputs will also be wrong: you can see a few flecks above where we got unlucky with random clustering.

Here's what median blur of white noise looks like at different radii:

Noise Input Output Radius
100% 3px
100% 10px

noise reduction in photos

Here are crops of two (out of a series of three) photos of the same scene:

The images are aligned (registered) but have differing noise. This is the normalized difference between them:

Stack the images up, and for every pixel, take the average of the matching pixel in each source image:

mean median

2D median blur of the first image alone, compared to a median blur that uses data from all three images:

1 image 3 images