Win8 Metro(C#)數字圖像處理--2.71Sigma平滑濾波器

原文: Win8 Metro(C#)數字圖像處理--2.71Sigma平滑濾波器



[算法說明]php

  Sigma平滑濾波器是構造一個模板,好比3*3大小的模板,計算這個模板對應的像素的標準差d,而後根據統計學原理,獲得一個置信區間v,假設3*3模板中心像素爲p,則v大小範圍爲[p-d,p+d]html

咱們判斷3*3模板中對應像素是否落在置信區間v內,對於在v內的像素,咱們求取他們的均值,而後,當前模板對應的中心像素的濾波值就等於這個均值。算法

圖像表示以下:網站

/// <summary>
        /// Sigma filter.
        /// </summary>
        /// <param name="src">The source image.</param>
        /// <returns></returns>
        public static WriteableBitmap SigmaFilterProcess(WriteableBitmap src)////Sigma濾波器
        {
            if (src != null)
            {
                int w = src.PixelWidth;
                int h = src.PixelHeight;
                WriteableBitmap filterImage = new WriteableBitmap(w, h);
                byte[] temp = src.PixelBuffer.ToArray();
                byte[] tempMask = (byte[])temp.Clone();
                double[] Gray = new double[9];
                double variance = 0;
                int count = 0;
                for (int j = 1; j < h - 1; j++)
                {
                    for (int i = 1; i < w - 1; i++)
                    {
                        variance = 0;
                        count = 0;
                        int[] B = new int[9] { tempMask[i * 4 + j * w * 4], tempMask[(i - 1) * 4 + (j - 1) * w * 4], tempMask[i * 4 + (j - 1) * w * 4], tempMask[(i + 1) * 4 + (j - 1) * w * 4], tempMask[(i - 1) * 4 + j * w * 4], tempMask[(i + 1) * 4 + j * w * 4], tempMask[(i - 1) * 4 + (j + 1) * w * 4], tempMask[i * 4 + (j + 1) * w * 4], tempMask[(i + 1) * 4 + (j + 1) * w * 4] };
                        int[] G = new int[9] { tempMask[i * 4 + 1 + j * w * 4], tempMask[(i - 1) * 4 + 1 + (j - 1) * w * 4], tempMask[i * 4 + 1 + (j - 1) * w * 4], tempMask[(i + 1) * 4 + 1 + (j - 1) * w * 4], tempMask[(i - 1) * 4 + 1 + j * w * 4], tempMask[(i + 1) * 4 + 1 + j * w * 4], tempMask[(i - 1) * 4 + 1 + (j + 1) * w * 4], tempMask[i * 4 + 1 + (j + 1) * w * 4], tempMask[(i + 1) * 4 + 1 + (j + 1) * w * 4] };
                        int[] R = new int[9] { tempMask[i * 4 + 2 + j * w * 4], tempMask[(i - 1) * 4 + 2 + (j - 1) * w * 4], tempMask[i * 4 + 2 + (j - 1) * w * 4], tempMask[(i + 1) * 4 + 2 + (j - 1) * w * 4], tempMask[(i - 1) * 4 + 2 + j * w * 4], tempMask[(i + 1) * 4 + 2 + j * w * 4], tempMask[(i - 1) * 4 + 2 + (j + 1) * w * 4], tempMask[i * 4 + 2 + (j + 1) * w * 4], tempMask[(i + 1) * 4 + 2 + (j + 1) * w * 4] };
                        for (int n = 0; n < 9; n++)
                        {
                            Gray[n] = (double)B[n] * 0.114 + (double)G[n] * 0.587 + (double)R[n] * 0.299;
                        }
                        for (int m = 0; m < 9; m++)
                        {
                            variance += ((double)Gray[m] - Gray.Average()) * ((double)Gray[m] - Gray.Average()) / 9;
                        }
                        variance = Math.Sqrt(variance);
                        for (int m = 0; m < 9; m++)
                        {
                            if (Gray[m] < Gray[0]-variance && Gray[m] > variance + Gray[0])
                            {
                                R[m] = 0;
                                G[m] = 0;
                                B[m] = 0;
                            }
                            else count++;
                        }
                        temp[i * 4 + j * w * 4] = (byte)(B.Sum() / count);
                        temp[i * 4 + 1 + j * w * 4] = (byte)(G.Sum() /count);
                        temp[i * 4 + 2 + j * w * 4] = (byte)(R.Sum() / count);
                    }
                }
                Stream sTemp = filterImage.PixelBuffer.AsStream();
                sTemp.Seek(0, SeekOrigin.Begin);
                sTemp.Write(temp, 0, w * 4 * h);
                return filterImage;
            }
            else
            {
                return null;
            }
        }

最後,分享一個專業的圖像處理網站(微像素),裏面有不少源代碼下載:
相關文章
相關標籤/搜索