The median filter is a well-known image processing filter. It provides a very nice way to smooth an image while preserving edges. The median filter replaces each pixel in the image with the median value of its neighboring pixels. A similar non-linear filter with slightly different properties is the mode filter which replaces each pixel with the mode of its neighboring pixels. I additionally make a slight modification so that “bad” pixels are ignored entirely in the computation of the mode.
This idea arose when I was trying to de-noise some images as well as do some in-painting of “bad” pixels (that have no value). Consider the image below. The darkest-blue areas are bad pixels. We have no information for those pixels. The other pixels are colored to show how far that pixel is from the camera. (see the post on Stereo Vision) However, some of the good pixels still have the wrong value. These are the noise pixels.
In the rest this post I talk about how we use a selective mode filter to convert the above image into the one below. (There’s also download-able Matlab/C++ code)
[Final Result of Selective Mode Filter]
First, we compare a standard median filter along-side a standard mode filter. We see that the two results are very similar. I deem the mode filter to be slightly better, but this is pretty subjective. As you can see, both methods do a good job of eliminating noise although neither filter removes the bad pixels.
[Standard Median Filter, Standard Mode Filter]
The solution is to ignore bad pixels so that they can not contribute to the computation of the median or mode (depending on which filter you use). In my example, bad pixels are value ‘0’ while all the other pixels are positive and non-zero. Therefore, I re-wrote the mode filter to ignore pixels under a threshold when computing the local mode around each pixel. The result is very nice. Some of the fine-scale features are lost, but overall, the number of noise pixels and bad pixels are greatly reduced.
Conclusion & Download
This is a simple idea, but it had very nice results. A good next step would be to create a selective median filter. I implemented this in mex so the operation is very quick. In the demo below I include binaries for most platforms, but if doesn’t work on your computer you may need to re-compile.