Home | Contents | << Prev. | >> Next |
You can download the complete source codes of the Silverlight solution directories of this chapter. |
is the most popular and simple nonlinear lowpass filter.
It
reduces noise without blurring.
The pixels inside the MxN-kernel are sorted according
to intensity in ascending order and arranged into an 1D-array of length M*N
and the the value at the mid of the range at position M*N/2 = median is elected. |
The filtering has the classical form with 4 nested for-loops. The usual division is replaced by a quick sort algorithm. The algorithm accepts any quadratic filter sizes NxN where N must be a positive odd integer N < b0.Width, N < b0.Height. Time depends on ImageSize*FilterSize = Image.Width*Image.Height*N*N.
******************************************************************************************************
Experiments:
******************************************************************************************************
1. Try out different filter sizes between 1 and 61.
2. Observe the loss of fine lines and sharp edges.
3. Choose FilterWidth=3 and FilterHeight=1. Observe the vertical fine lines on the left.
The leftmost and the rightmost lines are lost and the remaining lines are inverted black <-> white.
With FilterWidth=1 and FilterHeight=3, the same phenomenon occurs with the horizontal lines.
4. Observe the dependency between filter size and time consumption caused by sorting.
5. Try out other and noisy images.
6. Caution: In case of big images, the filter can take several minutes.
******************************************************************************************************
The following median filter algorithm incorporates border handling.
C#-Code of the MedianFilter subroutine:
//global variables WriteableBitmap img0, img1; //input and output images Int32 kw, hkw; //kernel width and half kernel width, kw uneven and hkw even Int32 kh, hkh; //kernel height and half kernel height, kh uneven and hkh even Int32 xSize, ySize; //image width and height Byte[ySize,xSize] R0, G0, B0; //the three color layers of the input image private void MedianFilter() { int R, G, B, no, noh, x, xx, xxx, y, yy, yyy, startOfYRow; Byte[] RR = new Byte[kw*kh]; //linear red array to be sorted Byte[] GG = new Byte[kw*kh]; //linear green array to be sorted Byte[] BB = new Byte[kw*kh]; //linear blue array to be sorted for ( y=0; y < ySize; y++ ) //================== { startOfYRow = y*xSize; for ( x=0; x < xSize; x++ ) //=============== { no=0; for ( yy=-hkh; yy <= hkh; yy++ ) //============= { yyy = y + yy; if ( yyy < 0 | yyy >= ySize ) continue; //beyond border for ( xx=-hkw; xx <= hkw; xx++ )//======== { xxx = x + xx; if ( xxx < 0 | xxx >= xSize ) continue; //beyond border RR[no] = R0[yyy,xxx]; //copy into the linear array to be sorted GG[no] = G0[yyy,xxx]; BB[no] = B0[yyy,xxx]; no++; } //====== end for (int xx... ================ } //======== end for (int yy... ================ Array.Sort( RR, 0, no ); //sorting Array.Sort( GG, 0, no ); //sorting Array.Sort( BB, 0, no ); //sorting noh = no/2; //index in the mid R=RR[noh]; //elected red G=GG[noh]; //elected green B=BB[noh]; //elected blue unchecked { img1.Pixels[startOfYRow+x] = (Int32)0xff000000 | R | (G << 8) | (B << 16); } } //============ end for (int x... ===================== } //============== end for (int y... ===================== }
******************************************************************************************************
Q: The main idea of the Median filter ? Advantage ? Disadvantages ?
A: The pixels inside the kernel are sorted according to intensity in ascending order and arranged into an 1D-array.
The value at the mid of the range at position M*N/2 = median is elected.
Adv: No blurring.
Disadv:
1. Produces unexpected artefacts.
2. Destruction of fine lines.
3. Erosion of sharp edges.
4. Sorting is slow.
******************************************************************************************************
Q: Compare the Median filter with the Average, Fog and Gauss filters !
A:
Average+Fog+Gauss: Smooth any sharp border and blur the image.
Median: No blurring but unexpected artefacts.
Median is much slower than fast Average+Fog+Gauss.
******************************************************************************************************
Q: Compare the Median filter with the Sigma filter !
A: Sigma is the better alternative.
It's more complicated but it can preserve fine lines and sharp edges.
Both filters are slow.
Home | Contents | << Prev. | >> Next |