


The Art of Interface 
Article 1Median filterCategory. Digital signal and image processing (DSP and DIP) software development. Abstract. The article is a practical guide for median filter understanding and implementation. Article contains theory, C++ source code, programming instructions and sample applications. Reference. Case study: 3D median filter — ultrasound image despeckling.
1. Introduction to median filterMedian filter is windowed filter of nonlinear class, which easily removes destructive noise while preserving edges. The basic idea behind filter is for any element of the signal (image) look at its neighborhood and pick up the element most similar to others. Median filter in its properties resembles mean filter, or average filter, but much better in treating “salt and pepper” noise and edge preserving. On the other hand median filter is often used for speckle noise reduction but there are more effective techniques like diffusion filter though more complicated. To understand how to implement median filter in practice, let us start with window idea. 2. Filter window or maskLet us imagine, you should read a letter and what you see in text restricted by hole in special stencil like this. Fig. 1. First stencil.So, the result of reading is sound [t]. Ok, let us read the letter again, but with the help of another stencil: Fig. 2. Second stencil.Now the result of reading t is sound [ð]. Let us make the third try: Fig. 3. Third stencil.Now you are reading letter t as sound [θ]. What happens here? To say that in mathematical language, you are making an operation (reading) over element (letter t). And the result (sound) depends on the element neighborhood (letters next to t). And that stencil, which helps to pick up element neighborhood, is window! Yes, window is just a stencil or pattern, by means of which you are selecting the element neighborhood — a set of elements around the given one — to help you make decision. Another name for filter window is mask — mask is a stencil, which hides elements we are not paying attention to. In our example the element we are operating on positioned at leftmost of the window, in practice however its usual position is the center of the window. Let us see some window examples. In one dimension. Fig. 4. Window or mask of size 5 in 1D.In two dimensions. Fig. 5. Window or mask of size 3×3 in 2D.In three dimensions... Think about building. And now — about room in that building. The room is like 3D window, which cuts out some subspace from the entire space of the building. You can find 3D window in volume (voxel) image processing. Fig. 6. Window or mask of size 3×3×3 in 3D.3. Understanding median filterNow let us see, how to “pick up element most similar to others”. The basic idea is simple — order elements and take the middle one. For instance, let us find the median for the case, depicted in fig. 7. Fig. 7. Taking the median.And that is all. Yes, we just have filtered 1D signal by median filter! Let us make resume and write down stepbystep instructions for processing by median filter. Median filter algorithm:
Now, when we have the algorithm, it is time to write some code — let us come down to programming. 4. 1D median filter programmingIn this section we develop 1D median filter with window of size 5. Let us have 1D signal of length N as input. The first step is window placing — we do that by changing index of the leading element:
Pay attention, that we are starting with the third element and finishing with the last but two. The problem is we cannot start with the first element, because in this case the left part of the filter window is empty. We will discuss below, how to solve that problem. The second step is picking up elements around, ok:
The third step is putting window elements in order. But we will use a code optimization trick here. Everything we need is middle element. So, it is enough to order just a half of elements. Great:
The final step — take the middle:
At last, let us write down the entire algorithm as function:
Type
5. Treating edgesFor all window filters there is some problem. That is edge treating. If you place window over first (last) element, the left (right) part of the window will be empty. To fill the gap, signal should be extended. For median filter there is good idea to extend signal or image symmetrically, like this: Fig. 8. Signal extension.So, before passing signal to our median filter function the signal should be extended. Let us write down the wrapper, which makes all preparations.
As you can see, our code takes into account some practical issues. First of all we check our input parameters — signal should not be NULL, and signal length should be positive:
Second step — we check case N=1. This case is special one, because to build extension we need at least two elements. For the signal of 1 element length the result is the signal itself.
As well pay attention, our median filter works inplace, if output parameter
Now let us allocate memory for signal extension.
And check memory allocation.
Now we are building extension.
Finally, everything is ready — filtering!
And to complete the job — free memory.
Since we are using memory management function from standard library, we should include its header.
6. 2D median filter programmingIn 2D case we have 2D signal, or image. The idea is the same, just now median filter has 2D window. Window influences only the elements selection. All the rest is the same: ordering elements and picking up the middle one. So, let us have a look at 2D median filter programming. For 2D case we choose window of 3×3 size.
7. Treating edges in 2D caseAs in 1D case in 2D case we should extend our input image as well. To do that we are to add lines at the top and at the bottom of the image and add columns to the left and to the right. Fig. 9. Image extension.Here is our wrapper function, which does that job.
8. Median filter libraryNow we have four functions, two of them are for processing 1D signals by median filter, and other two are for filtering 2D images. It is time to put everything together and create small median filter library. Let us write code for header file.
Our library is ready. The code we have written is good both for Linux/Unix and Windows platforms. You can download full median filter library source code here:
Full listings of library files are available online as well:
And now — a couple of applications to play around! 9. Color median filter: image restoration
We have created a couple of applications to show median filter capabilities in restoration images corrupted by destructive noise. The sample package includes 4 files — two applications, sample image and description:
Be aware of the fact, that this sample uses OpenGL, so it should be installed on your computer. 10. Step 1: prepare corrupted imageTo prepare corrupted image you have two choices. First choice is you can corrupt the image with destructive noise. Start up corrupter.exe application and load image to be corrupted. Choose Set >> Corruption... or click N button in toolbar and set noise level at 5–15%. Click OK. Then save corrupted image. Fig. 10. Corruption by destructive noise.Median filter can filter out not only destructive noise but scratches as well. This is the second choice. Open MS Paint: Start >> Programs >> Accessories >> Paint, load some .bmp file. Pick up pencil, choose white color and scratch the image. Save corrupted image. Fig. 11. Corruption by scratches.11. Step 2: restore corrupted imageStart up restorer.exe application. Load the saved corrupted image. Apply median filter by choosing Set >> Filter or clicking Fbutton in toolbar. See the result. If necessary, filter the image once more. Fig. 12. Image restored by median filter.


