天天看點

Win8Metro(C#)數字圖像處理--2.10圖像中值濾波



[函數名稱]

圖像中值濾波函數MedianFilterProcess(WriteableBitmap

src)

Win8Metro(C#)數字圖像處理--2.10圖像中值濾波

[函數代碼]

       ///<summary>

       ///

Median filter process.

       ///</summary>

       ///<param

name="src">Source image.</param>

       ///<returns></returns>

       publicstaticWriteableBitmap

MedianFilterProcess(WriteableBitmap src)////10中值濾波處理

       {

           if(src!=null

)

           {

           int

w = src.PixelWidth;

h = src.PixelHeight;

           WriteableBitmap

filterImage =newWriteableBitmap(w,

h);

           byte[]

temp = src.PixelBuffer.ToArray();

tempMask = (byte[])temp.Clone();

v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0, v7 = 0, v8 = 0, t = 0;

           for

(int j = 1; j < h - 1; j++)

               for

(int i = 4; i < w * 4 - 4; i += 4)

               {

                   v1 = (int)(temp[i

- 4 + (j - 1) * w * 4] * 0.114 + temp[i - 4 + 1 + (j - 1) * w * 4] * 0.587 + temp[i - 4 + 2 + (j - 1) * w * 4] * 0.299);

                   v2 = (int)(temp[i

+ (j - 1) * w * 4] * 0.114 + temp[i + 1 + (j - 1) * w * 4] * 0.587 + temp[i + 2 + (j - 1) * w * 4] * 0.299);

                   v3 = (int)(temp[i

+ 4 + (j - 1) * w * 4] * 0.114 + temp[i + 4 + 1 + (j - 1) * w * 4] * 0.587 + temp[i + 4 + 2 + (j - 1) * w * 4] * 0.299);

                   v4 = (int)(temp[i

- 4 + j * w * 4] * 0.114 + temp[i - 4 + 1 + j * w * 4] * 0.587 + temp[i - 4 + 2 + j * w * 4] * 0.299);

                   v5 = (int)(temp[i

+ 4 + j * w * 4] * 0.114 + temp[i + 4 + 1 + j * w * 4] * 0.587 + temp[i + 4 + 2 + j * w * 4] * 0.299);

                   v6 = (int)(temp[i

- 4 + (j + 1) * w * 4] * 0.114 + temp[i - 4 + 1 + (j + 1) *w * 4] * 0.587 + temp[i - 4 + 2 + (j + 1) * w * 4] * 0.299);

                   v7 = (int)(temp[i

+ (j + 1) * w * 4] * 0.114 + temp[i + 1 + (j + 1) * w * 4] * 0.587 + temp[i + 2 + (j + 1) * w * 4] * 0.299);

                   v8 = (int)(temp[i

+ 4 + (j + 1) * w * 4] * 0.114 + temp[i + 4 + 1 + (j + 1) * w * 4] * 0.587 + temp[i + 4 + 2 + (j + 1) * w * 4] * 0.299);

                   t = GetMedianValue(v1, v2, v3, v4, v5, v6, v7, v8);                 

                   if(t==v1)

                   {

                           temp[i + j * w * 4] = (byte)tempMask[i

- 4 + (j - 1) * w * 4];

                           temp[i + 1 + j * w * 4] = (byte)tempMask[i

- 4 + 1 + (j - 1) * w * 4];

                           temp[i + 2 + j * w* 4] = (byte)tempMask[i

- 4 + 2 + (j - 1) * w * 4];

                   }

                   elseif(t==v2)

+ (j - 1) * w * 4];

+ 1 + (j - 1) * w * 4];

                           temp[i + 2 + j * w * 4] = (byte)tempMask[i

+ 2 + (j - 1) * w * 4];

                   elseif(t==v3)

+ 4 + (j - 1) * w * 4];

+ 1 + 4 + (j - 1) * w * 4];

+ 2 + 4 + (j - 1) * w * 4];

                   elseif(t==v4)

- 4 + j * w * 4];

- 4 + 1 + j * w * 4];

- 4 + 2 + j * w * 4];

                   elseif(t==v5)

+ 4 + j * w * 4];

+ 4 + 1 + j * w * 4];

+ 4 + 2 + j * w * 4];

                   elseif(t==v6)

- 4 + (j + 1) * w * 4];

- 4 + 1 + (j + 1) * w * 4];

- 4 + 2 + (j + 1) * w * 4];

                   elseif

(t == v7)

                       temp[i + j * w * 4] = (byte)tempMask[i

+ (j + 1) * w * 4];

                       temp[i + 1 + j * w * 4] = (byte)tempMask[i

+ 1 + (j + 1) * w * 4];

                       temp[i + 2 + j * w * 4] = (byte)tempMask[i

+ 2 + (j + 1) * w * 4];

                   else

+ 4 + (j + 1) * w * 4];

+ 4 + 1 + (j + 1) * w * 4];

+ 4 + 2 + (j + 1) * w * 4];

                   v1 = 0; v2 = 0; v3 = 0; v4 = 0; v5 = 0; v6 = 0; v7 = 0; v8 = 0; t = 0;

               }

           }

           Stream

sTemp = filterImage.PixelBuffer.AsStream();

           sTemp.Seek(0,SeekOrigin.Begin);

           sTemp.Write(temp, 0, w * 4 * h);

           return

filterImage;

           else

               returnnull;

           }  

       }

       privatestaticint

GetMedianValue(paramsint[]

w = src.Length;

temp = src[0], m = 0;

(int i = 1; i < (int)(w

/ 2); i++)

               if

(src[i] < temp)

                   m = src[i];

                   src[i] = temp;

                   temp = m;

               else

                   continue;

(int)((src[(int)(w

/ 2)] + src[(int)(-1 + w / 2)]) / 2);

Win8Metro(C#)數字圖像處理--2.10圖像中值濾波

繼續閱讀