opencv实现高斯模糊

#include
#include
#include
#include

using namespace std;
using namespace cv;

//高斯平滑(高斯模糊)实现
void myGaussianBlur(Mat& src, Mat& result, int baseKernel, double delta)
{
	//高斯核半径
	int kerR = baseKernel / 2;
	//高斯核因子
	Mat kernel = Mat_(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(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(i+pi, j+pj)*kernel.at(kerR+pi,kerR+pj);
				}
			}
			result.at(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);
}

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

你可能感兴趣的:(opencv学习)