.net版高斯模糊算法

最近挺多人找高斯算法,本人贴上一个高斯模糊算法类,希望可以帮助到大家。算法的效率还是可以接受的。

  1 #region 高斯模糊算法
  2 /// <summary>
  3 /// 高斯模糊算法
  4 /// </summary>
  5 using System ;
  6 using System .Drawing ;
  7 public class Gaussian
  8 {
  9     public static double[,] Calculate1DSampleKernel(double deviation, int size)
 10     {
 11         double[,] ret = new double[size, 1];
 12         double sum = 0;
 13         int half = size / 2;
 14         for (int i = 0; i < size; i++)
 15         {
 16             ret[i, 0] = 1 / (Math.Sqrt(2 * Math.PI) * deviation) * Math.Exp(-(i - half) * (i - half) / (2 * deviation * deviation));
 17             sum += ret[i, 0];
 18         }
 19         return ret;
 20     }
 21     public static double[,] Calculate1DSampleKernel(double deviation)
 22     {
 23         int size = (int)Math.Ceiling(deviation * 3) * 2 + 1;
 24         return Calculate1DSampleKernel(deviation, size);
 25     }
 26     public static double[,] CalculateNormalized1DSampleKernel(double deviation)
 27     {
 28         return NormalizeMatrix(Calculate1DSampleKernel(deviation));
 29     }
 30     public static double[,] NormalizeMatrix(double[,] matrix)
 31     {
 32         double[,] ret = new double[matrix.GetLength(0), matrix.GetLength(1)];
 33         double sum = 0;
 34         for (int i = 0; i < ret.GetLength(0); i++)
 35         {
 36             for (int j = 0; j < ret.GetLength(1); j++)
 37                 sum += matrix[i, j];
 38         }
 39         if (sum != 0)
 40         {
 41             for (int i = 0; i < ret.GetLength(0); i++)
 42             {
 43                 for (int j = 0; j < ret.GetLength(1); j++)
 44                     ret[i, j] = matrix[i, j] / sum;
 45             }
 46         }
 47         return ret;
 48     }
 49     public static double[,] GaussianConvolution(double[,] matrix, double deviation)
 50     {
 51         double[,] kernel = CalculateNormalized1DSampleKernel(deviation);
 52         double[,] res1 = new double[matrix.GetLength(0), matrix.GetLength(1)];
 53         double[,] res2 = new double[matrix.GetLength(0), matrix.GetLength(1)];
 54         //x-direction
 55         for (int i = 0; i < matrix.GetLength(0); i++)
 56         {
 57             for (int j = 0; j < matrix.GetLength(1); j++)
 58                 res1[i, j] = processPoint(matrix, i, j, kernel, 0);
 59         }
 60         //y-direction
 61         for (int i = 0; i < matrix.GetLength(0); i++)
 62         {
 63             for (int j = 0; j < matrix.GetLength(1); j++)
 64                 res2[i, j] = processPoint(res1, i, j, kernel, 1);
 65         }
 66         return res2;
 67     }
 68     private static double processPoint(double[,] matrix, int x, int y, double[,] kernel, int direction)
 69     {
 70         double res = 0;
 71         int half = kernel.GetLength(0) / 2;
 72         for (int i = 0; i < kernel.GetLength(0); i++)
 73         {
 74             int cox = direction == 0 ? x + i - half : x;
 75             int coy = direction == 1 ? y + i - half : y;
 76             if (cox >= 0 && cox < matrix.GetLength(0) && coy >= 0 && coy < matrix.GetLength(1))
 77             {
 78                 res += matrix[cox, coy] * kernel[i, 0];
 79             }
 80         }
 81         return res;
 82     }
 83     /// <summary>
 84     /// 对颜色值进行灰色处理
 85     /// </summary>
 86     /// <param name="cr"></param>
 87     /// <returns></returns>
 88     private Color grayscale(Color cr)
 89     {
 90         return Color.FromArgb(cr.A, (int)(cr.R * .3 + cr.G * .59 + cr.B * 0.11),
 91                               (int)(cr.R * .3 + cr.G * .59 + cr.B * 0.11),
 92                               (int)(cr.R * .3 + cr.G * .59 + cr.B * 0.11));
 93     }
 94     /// <summary>
 95     /// 对图片进行高斯模糊
 96     /// </summary>
 97     /// <param name="d">模糊数值,数值越大模糊越很</param>
 98     /// <param name="image">一个需要处理的图片</param>
 99     /// <returns></returns>
100     public Bitmap FilterProcessImage(double d, Bitmap image)
101     {
102         Bitmap ret = new Bitmap(image.Width, image.Height);
103         Double[,] matrixR = new Double[image.Width, image.Height];
104         Double[,] matrixG = new Double[image.Width, image.Height];
105         Double[,] matrixB = new Double[image.Width, image.Height];
106         for (int i = 0; i < image.Width; i++)
107         {
108             for (int j = 0; j < image.Height; j++)
109             {
110                 //matrix[i, j] = grayscale(image.GetPixel(i, j)).R;
111                 matrixR[i, j] = image.GetPixel(i, j).R;
112                 matrixG[i, j] = image.GetPixel(i, j).G;
113                 matrixB[i, j] = image.GetPixel(i, j).B;
114             }
115         }
116         matrixR = Gaussian.GaussianConvolution(matrixR, d);
117         matrixG = Gaussian.GaussianConvolution(matrixG, d);
118         matrixB = Gaussian.GaussianConvolution(matrixB, d);
119         for (int i = 0; i < image.Width; i++)
120         {
121             for (int j = 0; j < image.Height; j++)
122             {
123                 Int32 R = (int)Math.Min(255, matrixR[i, j]);
124                 Int32 G = (int)Math.Min(255, matrixG[i, j]);
125                 Int32 B = (int)Math.Min(255, matrixB[i, j]);
126                 ret.SetPixel(i, j, Color.FromArgb(R, G, B));
127             }
128         }
129         return ret;
130     }
131 }
132 #endregion

时间: 2024-10-17 16:28:12

.net版高斯模糊算法的相关文章

高斯模糊算法的全面优化过程分享(二)。

      相关链接: 高斯模糊算法的全面优化过程分享(一) 在高斯模糊算法的全面优化过程分享(一)一文中我们已经给出了一种相当高性能的高斯模糊过程,但是优化没有终点,经过上一个星期的发愤图强和测试,对该算法的效率提升又有了一个新的高度,这里把优化过程中的一些心得和收获用文字的形式记录下来. 第一个尝试   直接使用内联汇编替代intrinsics代码(无效) 我在某篇博客里看到说intrinsics语法虽然简化了SSE编程的难度,但是他无法直接控制XMM0-XMM7寄存器,很多指令中间都会用内

【JavaScript】【算法】JavaScript版排序算法

JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) 1 //排序算法 2 window.onload = function(){ 3 var array = [0,1,2,44,4, 4 324,5,65,6,6, 5 34,4,5,6,2, 6 43,5,6,62,43, 7 5,1,4,51,56, 8 76,7,7,2,1, 9 45,4,6,7,8]; 10 //var array = [4,2,5,1,0,3]; 11 array

第三版《算法导论》中的15.3-6关于动态规划新增题解

题目: 15.3-6假定你希望兑换外汇,你意识到与其直接兑换,不如进行多种外币的一系列兑换,最后兑换到你想要的那种外币,可能会获得更大收益.假定你可以交易n种不同的货币,编号为1,2.....n,兑换从1号货币开始,最终兑换为n号货币.对每两种货币i和j给定汇率rij,意味着你如果有d个单位的货币i,可以兑换dr0个单位的货币j.进行一系列的交易需要支付一定的佣金,金额取决于交易次数.令ck表示k次交易需要支付的佣金.证明:如果对所有k=1,2...n,ck=0,那么寻找最优兑换序列的问题具有最

C语言版数据结构算法

C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu.com/s/1u8YW897MjJkoOfsbHuadFQ 在上一篇的FIFO中就是基于数据结构思维中的队列实现的,而基本的数据结构内容还有 算法效率分析.线性表.栈和队列.串.数组和广义表.树和二叉树.图.查表.排序.动态存储管理 上面两个链接就是<数据结构(C语言版)>严蔚敏教授严奶奶的书籍

PHP版DES算法加密数据(3DES)另附openssl_encrypt版本

PHP版DES算法加密数据(3DES) 可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容 <?php /** * Created by PhpStorm. * Title:PHP版DES加解密类 * 可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容 * User: yaokai * Date: 2017/11/13 0013 * Time: 19:03 */ namespace App\Http\Libs; class Des

高斯模糊算法的 C++ 实现

2008 年在一个 PS 讨论群里,有网友不解 Photoshop 的高斯模糊中的半径是什么含义,因此当时我写了这篇文章: 对Photoshop高斯模糊滤镜的算法总结: 在那篇文章中,主要讲解了高斯模糊中的半径的含义,是二维正态分布的方差的平方根,并且给出了算法的理论描述.现在我又打算把该算法用 c++ 实现出来,于是有了下面的这个 DEMO. 起初我是按照算法理论直接实现,即使用了二维高斯模板,结果发现处理时间很长,对一个图片竟然能达到大约数分钟之久.这样肯定是不对的,所以我百度了一下,发现这

静态链表----数据结构(C语言版) 算法2.17 心得

今天学习了数据结构中的静态链表,刚开始有些语句不能理解,研究了大半天终于想通了.记录于此留待以后查看,同时,对于同样对静态链表有些许不理解的人一点启发.文章中难免有理解上的问题,请指正.下面进入正文. 一.静态链表结构 静态链表可以在不设"指针"类型的高级程序设计语言中使用链表结构.静态链表如下所示:   首先,了解一下静态链表.静态链表中跟单链表类似,包含有很多结点,第i个结点中有包括数据space[i].data,和游标cur,游标space[i].cur的值为下一个结点的数组下标

javascript的Astar版 寻路算法

去年做一个模仿保卫萝卜的塔防游戏的时候,自己写的,游戏框架用的是coco2d-html5 实现原理可以参考 http://www.cnblogs.com/technology/archive/2011/05/26/2058842.html 这个算法项目一直放在github中,朋友们需要的可以自己去看下 https://github.com/caoke90/Algorithm/blob/master/Astar.js //Astar 寻路算法 //Point 类型 var cc=cc||conso

Python版冒泡排序算法

0 为什么写本文 一方面对经典排序算法冒泡排序进行复习,另一方面通过实际应用来检验python基础知识的掌握情况,包括range函数.len函数.for循环.if语句.函数定义与调用.列表的排序等知识点.在实践中加深理解,达到学以致用.用以促学.学用相长的目的. 1 什么是冒泡排序 冒泡排序的基本思想是,将需要排序的元素看作是一个个"气泡",最小的"气泡"最快浮出水面,排在前面.较小的"气泡"排在第二个位置,依次类推.冒泡排序需要对数列循环若干次