zoukankan      html  css  js  c++  java
  • [原创]中值滤波算法处理位图(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         }
  • 相关阅读:
    拉格朗日乘子法
    EM算法
    最大似然估计
    理解先验概率 后验概率 似然函数
    似然函数理解
    markdown 语法规则
    bash101总结
    hmm和Veterbi算法(一)
    Kaldi 安装
    通俗的解释交叉熵与相对熵
  • 原文地址:https://www.cnblogs.com/aaaSoft/p/1623628.html
Copyright © 2011-2022 走看看