说说高斯模糊

高斯模糊的理论我这里就不太多费话了,百度下太多,都是抄来抄去。

主要用到二个函数“高斯函数”

一维形式为:

二维形式为:

X,Y对应的一维二维坐标,σ表示模糊半径(半径* 2 + 1) / 2)

根据这二个公式获取对应的权重。

先看二维

假设我们现在图片中的像素点位置为(0,0)

假设我们设置的模糊半径为1,那么对应的坐标为如下图

它是以(0,0)这个坐标为标记,向外扩展1个像素。

接下来就是计算各个坐标的权重值,我们采用二维的高斯函数来计算,计算的代码如下:

        /// <summary>
/// 获取权重
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
private double GetWeighing(int x, int y) {
double q = (this.BlurRadius * 2 + 1) / 2;
return 1 / (2 * Math.PI * Math.Pow(q, 2)) * Math.Exp(-(x * x + y * y) / (2 * q * q));
}

  this.BlurRadius 为我们设置的模糊半径

上图是我们计算的结果,这9个值的结果的总和为:0.779483679709388,该值不能大于1。这个时候我们要将上面的9个值 除以0.779483679709388,使他们的和为1.

除以0.779483679709388之后为:

假设这9个点上的RGB颜色值中的R值乘以上图矩阵中的值,如下图

计算之后的颜色值

求和为:112.14236039551

所以(0,0)坐标的RGB颜色值中的R为112.14236039551

然后我们获取这9个点的坐标RGB值,让后将RGB值分别乘以权重值,然和将这9个值相加得到最后的颜色值。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text; namespace NetShadow {
/// <summary>
/// 高斯模糊
/// </summary>
public class GaussianBlur {
/// <summary>
/// 模糊半径
/// </summary>
public int BlurRadius { get; private set; }
private Bitmap SourceImage { get; set; }
private List<double> BlurArray { get; set; }
private int MaxWidth { get; set; }
private int MaxHeight { get; set; } public GaussianBlur(int blurRadius) {
BlurArray = new List<double>();
this.BlurRadius = blurRadius;
this.SetBlurArray();
} /// <summary>
/// 设置需要模糊的图片
/// </summary>
/// <param name="img"></param>
public void SetSourceImage(Image img) {
this.SourceImage = (Bitmap)img;
this.MaxWidth = this.SourceImage.Width - 1;
this.MaxHeight = this.SourceImage.Height - 1;
} /// <summary>
/// 获取模糊之后的图片
/// </summary>
/// <returns></returns>
public Bitmap GetBlurImage() {
if (this.SourceImage == null) return null;
Bitmap newImage = new Bitmap(SourceImage.Width, SourceImage.Height);
for (int y = 0; y < this.SourceImage.Height; y++) {
for (int x = 0; x < this.SourceImage.Width; x++) {
var nC = GetBlurColor(x, y);
//return null;
newImage.SetPixel(x, y, nC);
}
}
return newImage;
} /// <summary>
/// 获取高斯模糊的颜色值
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
private Color GetBlurColor(int x, int y) {
double r = 0, g = 0 , b = 0;
int index = 0;
for (var t = y - this.BlurRadius; t <= y + this.BlurRadius; t++) {
for (var l = x - this.BlurRadius; l <= x + this.BlurRadius; l++) {
var color = GetDefautColor(l, t);
var weighValue = BlurArray[index];
r += color.R * weighValue;
g += color.G * weighValue;
b += color.B * weighValue;
index++;
}
}
return Color.FromArgb((byte)r, (byte)g, (byte)b);
} private Color GetDefautColor(int x, int y) {
if (x < 0 && y < 0)
return this.SourceImage.GetPixel(0, 0);
else if (x < 0)
return this.SourceImage.GetPixel(0, Math.Min(MaxHeight, y));
else if (y < 0)
return this.SourceImage.GetPixel(Math.Min(MaxWidth, x), 0);
else
return this.SourceImage.GetPixel(Math.Min(MaxWidth, x), Math.Min(MaxHeight, y));
} private void SetBlurArray() {
int blur = this.BlurRadius;
double sum = 0;
for (var y = blur; y >= blur * -1; y--) {
for (var x = blur * -1; x <= blur; x++) {
var d = GetWeighing(x, y);
this.BlurArray.Add(d);
sum += d;
}
}
for (var i = 0; i < this.BlurArray.Count; i++)
this.BlurArray[i] = this.BlurArray[i] / sum; //sum = 0;
//foreach (var item in this.BlurArray)
// sum += item;
} /// <summary>
/// 获取权重
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
private double GetWeighing(int x, int y) {
double q = (this.BlurRadius * 2 + 1) / 2;
return 1 / (2 * Math.PI * Math.Pow(q, 2)) * Math.Exp(-(x * x + y * y) / (2 * q * q));
}
}
}

  

这种效率其实很地下,所以网上的解决办法是将二维高斯改为一维高斯来计算,也就是先横向模糊,然后再纵向模糊。

另外获取图片的RGB颜色值采用的是GetPixel 和SetPixel,这二个函数的效率是很低下的,大家可以到网上找下相关的解决办法。

源码下载

c#实现高斯模糊的更多相关文章

  1. Android开发学习之路-动态高斯模糊怎么做

    什么是高斯模糊? 高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪 ...

  2. EasyPR--开发详解(3)高斯模糊、灰度化和Sobel算子

    在上篇文章中我们了解了PlateLocate的过程中的所有步骤.在本篇文章中我们对前3个步骤,分别是高斯模糊.灰度化和Sobel算子进行分析. 一.高斯模糊 1.目标 对图像去噪,为边缘检测算法做准备 ...

  3. Android 图片滤镜工具——高斯模糊

    ===================高斯模糊========================= 创建一个 ImageFilter 类(滤镜工具),代码如下: import android.graph ...

  4. .net版高斯模糊算法

    最近挺多人找高斯算法,本人贴上一个高斯模糊算法类,希望可以帮助到大家.算法的效率还是可以接受的. #region 高斯模糊算法 /// <summary> /// 高斯模糊算法 /// & ...

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

    2008 年在一个 PS 讨论群里,有网友不解 Photoshop 的高斯模糊中的半径是什么含义,因此当时我写了这篇文章: 对Photoshop高斯模糊滤镜的算法总结: 在那篇文章中,主要讲解了高斯模 ...

  6. Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途

    Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途 1.1. 高斯模糊 的原理(周边像素的平均值+正态分布的权重1 1.2. 高斯模糊 的用途(磨皮,毛玻璃效果,背景虚化 ...

  7. opencv 简单模糊和高斯模糊 cvSmooth

    cv::Mat 是C++版OpenCV的新结构. cvSmooth() 是老版 C API. 没有把C接口与C + + 结合. 建议你们也可以花一些时间看一下介绍. 同样,你如果查看opencv/mo ...

  8. 半径无关单核单线程最快速高斯模糊实现(附完整C代码)

    之前,俺也发过不少快速高斯模糊算法. 俺一般认为,只要处理一千六百万像素彩色图片,在2.2GHz的CPU上单核单线程超过1秒的算法,都是不快的. 之前发的几个算法,在俺2.2GHz的CPU上耗时都会超 ...

  9. 传统高斯模糊与优化算法(附完整C++代码)

    高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次 ...

  10. iOS开发小技巧--高斯模糊框架的应用

    事件背景:彩票项目中点击检查更新之后的操作,高斯模糊效果并弹出HUD 注意:在应用别人的框架的时候,最好封装一下下. 新建一个类  继承自高斯模糊的类. 使用方法:新建一个高斯模糊类的View,添加到 ...

随机推荐

  1. GameObject.DestroyImmediate(go, true)会使磁盘资源数据丢失,导致不可用

    GameObject.DestroyImmediate(go, true)会使磁盘资源数据丢失,导致不可用 第二个参数true表示 allowDestroyingAssets,表示允许销毁资源. 实测 ...

  2. Hibernate多对多关联映射的HQL中的in条件查询问题

    群里有朋友求解一个问题,高分求一条HQL多对多查询语句 . 问题描述见 http://topic.csdn.net/u/20090621/16/4eac6fe0-bf3e-422e-a697-f758 ...

  3. .net core 下的Area注册

    app.UseMvc(routes => { routes.MapAreaRoute( name: "AreaRoute", areaName: "Admin&qu ...

  4. ios学习--详解IPhone动画效果类型及实现方法

    详解IPhone动画效果类型及实现方法是本文要介绍的内容,主要介绍了iphone中动画的实现方法,不多说,我们一起来看内容. 实现iphone漂亮的动画效果主要有两种方法,一种是UIView层面的,一 ...

  5. 数据库执行的时候报ORA-01653错误

    查明原因是因为表空间文件到达了32G,因为oracle11g单个表空间大于32G的时候就不会自动在扩展了于是需要增加新的表空间文件,下面是4种解决此问题的方法 Meathod1:给表空间增加数据文件 ...

  6. AngularJS与服务器交互(4)

    转自:http://itindex.net/detail/50919-angularjs-%E6%9C%8D%E5%8A%A1%E5%99%A8-%E4%BA%A4%E4%BA%92 对于AJAX应用 ...

  7. 使用heap profiler进行内存占用分析

    最近在项目中用到了google的heap profiler工具来分析内存占用,效果非常显著,因此在这里写一篇博客记录一下使用过程中遇到的一些问题. heap profiler依赖于tcmalloc,所 ...

  8. Linux实战教学笔记46:NoSQL数据库之redis持久化存储 (二)

    第3章 Redis数据类型详解 3.1 Redis键/值介绍 Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如"foo"的简单字符串到一个JPG ...

  9. 压缩包法安装mysql

    之前一直安装mysql,我一直是用压缩包安装的.如果之前安装过Mysql,必须要删除注册文件,才能把Mysql彻底删除了. 先在官网下载mysql的版本.下载package版本,即.zip版本的.下载 ...

  10. 适配iOS10 调取系统打电话功能

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString: [NSString stringWithFormat:@"t ...