PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三)

PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三)

[email protected]

http://blog.csdn.net/kezunhai

高斯模糊(Gaus Blur)采用二维高斯模板对图像进行模糊处理,用于图像模糊化(去除细节和噪声),它的处理效果给人一种更佳柔和的感觉。

一维高斯:

二维高斯:

理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可。 如下图为一个标准差为1.0的整数值高斯核:

在有些场合,可以用下面的模块来对高斯核进行近似:

本文实现算法根据用户输入的核尺寸和方差来计算高斯核,实现高斯滤波,高斯核创建算法如下:

// 创建高斯核
// kSize:卷积核的大小3、5、7等(3×3、5×5、7×7)
// sigma:方差
void PhotoShop::CreateGaussKernel(float **pdKernel, int kSize, float sigma)
{
	float dDis;  //数组中一点到中心点距离
	float dCenter = (kSize-1)/2;

	float dSum = 0;
	float dValue;

	int i, j; 

	//生成高斯数据
	for ( i=0; i<kSize; i++)
	{
		for ( j=0; j<kSize; j++)
		{
			dDis = fabsf(i-dCenter) + fabsf(j-dCenter);  // 用和来近似平方和的开方
			dValue = exp(-dDis*dDis/(2*sigma*sigma+DBL_EPSILON));
			pdKernel[i][j] = dValue;
			dSum+=dValue;
		}
	}

	//归一化
	for ( i=0; i<kSize; i++)
	{
		for ( j=0; j<kSize; j++)
		{
			pdKernel[i][j] /= (dSum+DBL_EPSILON);
		}
	}
}

高斯滤波算法:

void PhotoShop::GaussianBlur(cv::Mat &img, cv::Mat &dst, int kSize, float sigma)
{
	int height = img.rows;
	int width = img.cols;
	int chns = img.channels();

	int i, j, k,p, q;

	// 分配高斯核空间
	float **pKernel = new float*[kSize];
	for ( i=0; i<kSize; i++)
	{
		pKernel[i] = new float[kSize];
		ZeroMemory(pKernel[i], kSize*sizeof(float));
	}
	CreateGaussKernel(pKernel, kSize, sigma);  // 创建高斯核

	if ( dst.empty())
		dst.create(height, width, img.type());

	float sum = 0;
	int border = (kSize-1)/2;

	for ( i =border; i<height-border; i++)
	{
		unsigned char* dstData = (unsigned char*)dst.data + dst.step*i;
		for ( j=border; j<width-border; j++)
		{
			for ( k=0; k<chns; k++)
			{
				sum = 0;
				for ( p = -border; p<=border; p++)
				{
					for ( q = -border; q<=border; q++)
					{
						sum += getPixel(img, i+p, j+q, k)*pKernel[p+border][q+border];
					}
				}

				dstData[j*chns+k] = saturate_cast<uchar>(sum+0.5);
			}	// for k
		}
	} // for i
}

算法测试:

高斯滤波由于其线性和良好的去噪效果,在很多算法中得到了广泛的应用,如Canny算子的预处理就采用了高斯滤波,OpenCV中的Sobel算子的实现也采用高斯滤波作为预处理步骤,还是闻名古今的SIFT算子采用了高斯金字塔和高斯差分来进行候选特征点的提取,有兴趣的朋友可以进一步深入了解高斯滤波的应用。

作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。

时间: 2024-10-10 17:08:10

PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三)的相关文章

PhotoShop算法实现进阶-模糊滤镜-运动模糊(二十四)

[email protected] http://blog.csdn.net/kezunhai 造成图像退化或者说使图像模糊的原因有很多种,如果是因为在摄像时相机和被摄景物之间有相对运动而造成的图像模糊则称为运动模糊.所得到图像中的景物往往会模糊不清,我们称之为运动模糊图像.运动模糊(Motion Blur)是一种抓取物体运动状态效果的滤镜,主要应用物体运动时曝光的摄影手法,模拟出在摄像中拍摄运动物体的间接曝光功能,从而使图像产生出一种动态效果.它通常用来制造物体掠过或移动的效果. 实现原理:运

Atitit &#160;&#160;图像处理&#160;平滑&#160;也称&#160;模糊,&#160;归一化块滤波、高斯滤波、中值滤波、双边滤波)

Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: 归一化块滤波器 (Normalized Box Filter) § 最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等) § 高斯滤波器 (Gaussian Filter) § 最有用的滤波器 (尽管不是最快的). 高斯滤波是将输入数组的每一个像素点与 高斯

opencv3 图片模糊操作-均值滤波 高斯滤波 中值滤波 双边滤波

#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; //均值滤波模糊处理int demo_blur(){ char win1[] = "window1"; char win2[] = "window2"; Mat img1, img2; img1 = imread("D://images//4.jpg&quo

学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波

本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤波","高斯滤波"三种常见的邻域滤波操作.而作为非线性滤波的"中值滤波"和"双边滤波",我们下次再分析. 因为文章很长,如果详细啃的话,或许会消化不良.在这里给大家一个指引,如果是单单想要掌握这篇文章中讲解的OpenCV线性滤波相关的三个函

SIFT四部曲之——高斯滤波

本文为原创作品,未经本人同意,禁止转载 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 或许网络上有各位牛人已经对sift算法进行各种的详解和说明,我(小菜鸟)在翻阅各种资料和对opencv中的代码进行反推之后,终于理解该算法.并记录之,供大家一起交流学习!这个博文主要记录了我的学习历程,或许对你有帮助,或许可以启发你,或许你只是一笑而过!没关系,至少自己总结过. 这篇文章主要是对sif

图像处理之基础---滤波器 高斯滤波

引用 keendawn 的 高斯(核)函数简介 1函数的基本概念 所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数. 通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-xc||), 其作用往往是局部的 , 即当x远离xc时函数取值很小.最常用的径向基函数是高斯核函数 ,形式为 k(||x-xc||)=exp{- ||x-xc||^2/(2*σ)^2) } 其中xc为核函数中心,σ为函数的宽度参数 ,

VC++高斯滤波\中值滤波实现图像模糊处理

一.算法 高斯模糊算法 详见:高斯模糊,基本思想就是利用高斯函数,将一个坐标点的所有邻域的加权平均值设置为这些点的颜色值. 中值滤波算法就更简单了:将一个坐标点的所有邻域的平均值设置为这些点的像素值. 二.算法的代码实现 高斯函数: 使用宏定义来替换: #define PI<span style="white-space:pre"> </span>3.1415926 //高斯模糊函数 #define GAUSS_FUN(x, y) (exp(-(x*x)/(do

图像平滑技术之盒滤波、均值滤波、中值滤波、高斯滤波、双边滤波的原理概要及OpenCV代码实现

图像平滑是指直接对源图像的每个像素数据做邻域运算以达到平滑图像的目的.实质上主要就是通达卷积核算子实现的,卷积核算子的相关知识大家可以参考我写的博文http://blog.csdn.net/wenhao_ir/article/details/51691410 图像平滑也称为模糊或滤波,是图像处理中常用的技术之一,进行平滑处理时需要用到滤波器核(其实就是卷积核算子),根据滤波器核函数来实现不同的滤波技术.下面介绍几种 常用的图像平滑方法的大概原理及OpenCV下的实现代码. 一.盒滤波(均值滤波)

基于opencv下对视频的灰度变换,高斯滤波,canny边缘检测处理,同窗体显示并保存

如题:使用opencv打开摄像头或视频文件,实时显示原始视频,将视频每一帧依次做灰度转换.高斯滤波.canny边缘检测处理(原始视频和这3个中间步骤处理结果分别在一个窗口显示),最后将边缘检测结果保存为一个视频avi文件. 这里问题综合性比较大,这里进行分治. 该类问题可分为四个方面的处理: (1)打开 视频或者是摄像头,并播放视频 (2)对视频的每一帧做处理 (3)同窗体显示四个结果 (4)保存视频文件 以下分为这三个方面进行处理: (1)打开 视频或者摄像头,并播放视频 这个利用opencv