median blur
(December 2010)
median
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 |