opencv实现高斯模糊

#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>

using namespace std;
using namespace cv;

//高斯平滑(高斯模糊)实现
void myGaussianBlur(Mat& src, Mat& result, int baseKernel, double delta)
{
	//高斯核半径
	int kerR = baseKernel / 2;
	//高斯核因子
	Mat kernel = Mat_<double>(baseKernel, baseKernel);
	//归一化参数
	double alpha = 1 / ((2*22/7)*delta*delta);
	//核函数生成
	for (int i = -kerR; i <= kerR; i++)
	{
		for (int j = -kerR; j <= kerR; j++)
		{
			kernel.at<double>(i + kerR, j + kerR) = exp(-(i*i+j*j)/(2*delta*delta))*alpha;
		}
	}
	result = src.clone();
	double pix;
	for (int i = kerR; i < src.rows - kerR; i++)
	{
		for (int j = kerR; j < src.cols - kerR; j++)
		{
			pix = 0;
			for (int pi = -kerR; pi <= kerR; pi++)
			{
				for (int pj = -kerR; pj <= kerR; pj++)
				{
					pix += src.at<uchar>(i+pi, j+pj)*kernel.at<double>(kerR+pi,kerR+pj);
				}
			}
			result.at<uchar>(i-kerR, j-kerR) = pix;
		}
	}
}

int main()
{
	//imread中0表示灰度返回,1表示原图返回
	Mat src = imread("E:\\研究生\\学习材料\\学习书籍\\OpenCV图像处理编程实例-源码-20160801\\《OpenCV图像处理编程实例-源码-20160801\\images\\flower3.jpg",0);
	if (!src.data)
		return -1;
	Mat dst;
	//dst=addSaltNoise(src, 100);
	myGaussianBlur(src, dst, 3, 1);
	//imshow("SaltNoise",dst);
	imshow("GaussianBlur", dst);
	waitKey(0);
	return(0);
}

上一篇中值滤波中并没有用到原图像边缘像素,直接将原图像边界像素放入目标图像中,上述这个高斯模糊使用了原图的边界像素。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值