博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法
阅读量:5764 次
发布时间:2019-06-18

本文共 4826 字,大约阅读时间需要 16 分钟。

原文:



[函数名称]

  高斯平滑滤波器      GaussFilter(WriteableBitmap src,int radius,double sigma)

[算法说明]

  高斯滤波器实质上是一种信号的滤波器,其用途是信号的平滑处理。它是一类根据高斯函数的

形状来选择权重的线性平滑滤波器,该滤波器对于抑制服从正态分布的噪声非常有效。高斯函数

的公式如下所示:

private static double[,] GaussFuc(int r, double sigma)        {            int size = 2 * r + 1;            double[,] gaussResult = new double[size, size];            double k = 0.0;            for (int y = -r, h = 0; y <= r; y++, h++)            {                for (int x = -r, w = 0; x <= r; x++, w++)                {                    gaussResult[w, h] = (1.0 / (2.0 * Math.PI * sigma * sigma)) * (Math.Exp(-((double)x * (double)x + (double)y * (double)y) / (2.0 * sigma * sigma)));k += gaussResult[w, h];                }            }            return gaussResult;        }

我们设置参数r=1,sigma=1.0,则得到一个3*3的高斯模板如下:

这个公式可以理解为先对图像按行进行一次一维高斯滤波,在对结果图像按列进行一次一维高斯滤波,这样速度将大大提高。

一维高斯滤波代码如下(包含归一化)

private static double[] GaussKernel1D(int r, double sigma)        {            double[] filter = new double[2 * r + 1];            double sum = 0.0;            for (int i = 0; i < filter.Length; i++)            {                filter[i] = Math.Exp((double)(-(i - r) * (i - r)) / (2.0 * sigma * sigma));                sum += filter[i];            }            for (int i = 0; i < filter.Length; i++)            {                filter[i] = filter[i] / sum;            }            return filter;        }

[函数代码]

private static double[] GaussKernel(int radius, double sigma)        {            int length=2*radius+1;            double[] kernel = new double[length];            double sum = 0.0;            for (int i = 0; i < length; i++)            {                kernel[i] = Math.Exp((double)(-(i - radius) * (i - radius)) / (2.0 * sigma * sigma));                sum += kernel[i];            }            for (int i = 0; i < length; i++)            {                kernel[i] = kernel[i] / sum;            }            return kernel;        }        ///         /// Gauss filter process        ///         /// The source image.        /// The radius of gauss kernel,from 0 to 100.        /// The convince of gauss kernel, from 0 to 30.        /// 
public static WriteableBitmap GaussFilter(WriteableBitmap src,int radius,double sigma) 高斯滤波 { if (src != null) { int w = src.PixelWidth; int h = src.PixelHeight; WriteableBitmap srcImage = new WriteableBitmap(w, h); byte[] srcValue = src.PixelBuffer.ToArray(); byte[] tempValue=(byte[])srcValue.Clone(); double[] kernel = GaussKernel(radius, sigma); double tempB = 0.0, tempG = 0.0, tempR = 0.0; int rem = 0; int t = 0; int v = 0; double K = 0.0; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { tempB = tempG = tempR = 0.0; for (int k = -radius; k <= radius; k++) { rem = (Math.Abs(x + k) % w); t = rem * 4 + y * w * 4; K=kernel[k+radius]; tempB += srcValue[t] * K; tempG += srcValue[t + 1] * K; tempR += srcValue[t + 2] * K; } v = x * 4 + y * w * 4; tempValue[v] = (byte)tempB; tempValue[v + 1] = (byte)tempG; tempValue[v + 2] = (byte)tempR; } } for (int x = 0; x < w; x++) { for (int y = 0; y < h; y++) { tempB = tempG = tempR = 0.0; for (int k = -radius; k <= radius; k++) { rem = (Math.Abs(y + k) % h); t = rem * w * 4 + x * 4; K = kernel[k + radius]; tempB += tempValue[t] * K; tempG += tempValue[t + 1] * K; tempR += tempValue[t + 2] * K; } v = x * 4 + y * w * 4; srcValue[v] = (byte)tempB; srcValue[v + 1] = (byte)tempG; srcValue[v + 2] = (byte)tempR; } } Stream sTemp = srcImage.PixelBuffer.AsStream(); sTemp.Seek(0, SeekOrigin.Begin); sTemp.Write(srcValue, 0, w * 4 * h); return srcImage; } else { return null; } }

最后,分享一个专业的图像处理网站(微像素),里面有很多源代码下载:

你可能感兴趣的文章
从JDK源码看Writer
查看>>
Express 结合 Webpack 实现HMRwi
查看>>
基于protobuf的RPC实现
查看>>
我的友情链接
查看>>
HAProxy负载均衡原理及企业级实例部署haproxy集群
查看>>
开源中国动弹客户端实践(三)
查看>>
Win 8创造颠覆性体验:预览版关键更新
查看>>
vim在多文件中复制粘贴内容
查看>>
Android ContentObserver
查看>>
疯狂java学习笔记1002---非静态内部类
查看>>
ISA2006实战系列之一:实战ISA三种客户端部署方案(上)
查看>>
TCP服务器
查看>>
AC旁挂三层交换机管理ap,二层接入ap心得
查看>>
JS中比较数字大小
查看>>
springcloud 学习-eureka搭建-为eureka添加认证
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
如何成为一个C++高级程序员
查看>>
ant android 打包签名和渠道
查看>>
我的友情链接
查看>>