


The Art of Interface 
Article 5Mean filter, or average filterCategory. Digital signal and image processing (DSP and DIP) software development. Abstract. The article is a practical guide for mean filter, or average filter understanding and implementation. Article contains theory, C++ source code, programming instructions and sample application. Reference. Adaptive averaging technique: Diffusion filter. Download mean filter for Win32 (zip, 454 Kb) Download mean filter C++ source code (zip, 2 Kb)
1. Introduction to mean filter, or average filterMean filter, or average filter is windowed filter of linear class, that smoothes signal (image). The filter works as lowpass one. The basic idea behind filter is for any element of the signal (image) take an average across its neighborhood. To understand how that is made 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 mean filterNow let us see, how to “take an average across element's neighborhood”. The formula is simple — sum up elements and divide the sum by the number of elements. For instance, let us calculate an average for the case, depicted in fig. 7. Fig. 7. Taking an average.And that is all. Yes, we just have filtered 1D signal by mean filter! Let us make resume and write down stepbystep instructions for processing by mean filter. Mean filter, or average filter algorithm:
Now, when we have the algorithm, it is time to write some code — let us come down to programming. 4. 1D mean filter programmingIn this section we develop 1D mean 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 taking the average, ok:
Now, let us write down the 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 mean filter there is good idea to extend signal or image symmetrically, like this: Fig. 8. Signal extension.So, before passing signal to our mean 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 mean 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 mean filter programmingIn 2D case we have 2D signal, or image. The idea is the same, just now mean filter has 2D window. Window influences only the elements selection. The rest is the same: summing up the elements and dividing by their number. So, let us have a look at 2D mean filter programming. For 2D case we choose window of size 3×3.
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. Mean filter libraryNow we have four functions, two of them are for processing 1D signals by mean filter, and other two are for filtering 2D images. It is time to put everything together and create small mean 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 mean filter library source code here: Download mean filter C++ source code (zip, 2 Kb) Full listings of library files are available online as well:
And now — an application to play around! 9. Color mean filter: image smoothing, or blurringDownload mean filter for Win32 (zip, 454 Kb) We have created an application to demonstrate mean filter properties. The sample package includes 3 files — the application, sample image and description:
Be aware of the fact, that this sample uses OpenGL, so it should be installed on your computer. 10. How to useStart up smoother.exe application. Load the image. Fig. 10. Original image.Apply mean filter by choosing Set >> Filter or clicking Fbutton in toolbar. See the result. If necessary, filter the image one more time. Fig. 11. Image averaged by mean filter.
Write to the author of the article — Sergey Chernenko. 


