[原创]中值滤波算法处理位图(C#实现)

  1         //===================
  2         //作者:aaaSoft
  3         //日期:2009年12月11日
  4         //论坛:http://www.scbeta.com/bbs
  5         //说明:原创文章,转载请注明出处并保留作者信息
  6         //===================
  7 
  8         /// <summary>
  9         /// 中值滤波算法处理
 10         /// </summary>
 11         /// <param name="bmp">原始图片</param>
 12         /// <param name="bmp">是否是彩色位图</param>
 13         /// <param name="windowRadius">过滤半径</param>
 14         public Bitmap ColorfulBitmapMedianFilterFunction(Bitmap srcBmp, int windowRadius, bool IsColorfulBitmap)
 15         {
 16             if (windowRadius < 1)
 17             {
 18                 throw new Exception("过滤半径小于1没有意义");
 19             }
 20             //创建一个新的位图对象
 21             Bitmap bmp = new Bitmap(srcBmp.Width, srcBmp.Height);
 22 
 23             //存储该图片所有点的RGB值
 24             byte[,] mR,mG,mB;
 25             mR = new byte[srcBmp.Width, srcBmp.Height];
 26             if (IsColorfulBitmap)
 27             {
 28                 mG = new byte[srcBmp.Width, srcBmp.Height];
 29                 mB = new byte[srcBmp.Width, srcBmp.Height];
 30             }
 31             else
 32             {
 33                 mG = mR;
 34                 mB = mR;
 35             }
 36 
 37             for (int i = 0; i <= srcBmp.Width - 1; i++)
 38             {
 39                 for (int j = 0; j <= srcBmp.Height - 1; j++)
 40                 {
 41                     mR[i, j] = srcBmp.GetPixel(i, j).R;
 42                     if (IsColorfulBitmap)
 43                     {
 44                         mG[i, j] = srcBmp.GetPixel(i, j).G;
 45                         mB[i, j] = srcBmp.GetPixel(i, j).B;
 46                     }
 47                 }
 48             }
 49 
 50             mR = MedianFilterFunction(mR, windowRadius);
 51             if (IsColorfulBitmap)
 52             {
 53                 mG = MedianFilterFunction(mG, windowRadius);
 54                 mB = MedianFilterFunction(mB, windowRadius);
 55             }
 56             else
 57             {
 58                 mG = mR;
 59                 mB = mR;
 60             }
 61             for (int i = 0; i <= bmp.Width - 1; i++)
 62             {
 63                 for (int j = 0; j <= bmp.Height - 1; j++)
 64                 {
 65                     bmp.SetPixel(i, j, Color.FromArgb(mR[i, j], mG[i, j], mB[i, j]));
 66                 }
 67             }
 68             return bmp;
 69         }
 70 
 71         /// <summary>
 72         /// 对矩阵M进行中值滤波
 73         /// </summary>
 74         /// <param name="m">矩阵M</param>
 75         /// <param name="windowRadius">过滤半径</param>
 76         /// <returns>结果矩阵</returns>
 77         private byte[,] MedianFilterFunction(byte[,] m, int windowRadius)
 78         {
 79             int width = m.GetLength(0);
 80             int height = m.GetLength(1);
 81 
 82             byte[,] lightArray = new byte[width, height];
 83 
 84             //开始滤波
 85             for (int i = 0; i <= width - 1; i++)
 86             {
 87                 for (int j = 0; j <= height - 1; j++)
 88                 {
 89                     //得到过滤窗口矩形
 90                     Rectangle rectWindow = new Rectangle(i - windowRadius, j - windowRadius, 2 * windowRadius + 12 * windowRadius + 1);
 91                     if (rectWindow.Left < 0) rectWindow.X = 0;
 92                     if (rectWindow.Top < 0) rectWindow.Y = 0;
 93                     if (rectWindow.Right > width - 1) rectWindow.Width = width - 1 - rectWindow.Left;
 94                     if (rectWindow.Bottom > height - 1) rectWindow.Height = height - 1 - rectWindow.Top;
 95                     //将窗口中的颜色取到列表中
 96                     List<byte> windowPixelColorList = new List<byte>();
 97                     for (int oi = rectWindow.Left; oi <= rectWindow.Right - 1; oi++)
 98                     {
 99                         for (int oj = rectWindow.Top; oj <= rectWindow.Bottom - 1; oj++)
100                         {
101                             windowPixelColorList.Add(m[oi, oj]);
102                         }
103                     }
104                     //排序
105                     windowPixelColorList.Sort();
106                     //取中值
107                     byte middleValue = 0;
108                     if ((windowRadius * windowRadius) % 2 == 0)
109                     {
110                         //如果是偶数
111                         middleValue = Convert.ToByte((windowPixelColorList[windowPixelColorList.Count / 2+ windowPixelColorList[windowPixelColorList.Count / 2 - 1]) / 2);
112                     }
113                     else
114                     {
115                         //如果是奇数
116                         middleValue = windowPixelColorList[(windowPixelColorList.Count - 1/ 2];
117                     }
118                     //设置为中值
119                     lightArray[i, j] = middleValue;
120                 }
121             }
122             return lightArray;
123         }
原文地址:https://www.cnblogs.com/aaaSoft/p/1623628.html