高斯模糊

高斯模糊

高斯模糊(英语:Gaussian Blur),也叫高斯平滑 ,通常用它来减少图像噪声以及降低细节层次。 从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。由于正态分布又叫作“高斯分布”,所以这项技术就叫作高斯模糊。
在这里插入图片描述

图像噪声是指存在于图像数据中的不必要的或多余的干扰信息。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

既然知道了高斯模糊能减少图像噪声,那我们不妨动动手.

一、高斯模糊的原理

“模糊”,就是将图像中每个像素值进行重置的过程,这个过程采用将每一个像素都设置成周边像素的平均值

在这里插入图片描述

假设周边的点对中间点的影响都是相同的,即构造的卷积算子如下:

在这里插入图片描述

不难计算得出中间点的2取平均值后变成10/9,这是一种"平滑化"。在图形上,就相当于产生"模糊"效果,"中间点"失去细节。

在这里插入图片描述
显然,计算平均值时,取值范围越大,"模糊效果"越强烈。

接下来的问题就是,应该如何分配权重呢?因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。

如果使用简单平均,显然不是很合理,因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。正态分布显然是一种可取的权重分配模式!

在这里插入图片描述
在μ 处取最大值,在正(负)无穷远处取值为0,形状呈现中间高两边低 。计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。

在这里插入图片描述

因为计算平均值的时候,中心点就是原点,所以μ等于0。上式可以简化为
在这里插入图片描述

上面的正态分布是一维的,图像都是二维的,所以我们需要二维的正态分布。

在这里插入图片描述

有了这个函数 ,就可以计算每个点的权重了。

二、计算高斯模糊

假定中心点的坐标是(0,0),那么其他点的坐标也能写出,假设σ的值 ,将坐标和σ带入上式得出权重矩阵,最后加权平均得到最终的权重矩阵

将像素点的灰度值乘以对应的权重值之和就是中心点高斯模糊的值。

对所有点重复这个过程,就得到了高斯模糊后的图像。

下面我们尝试着自己动手试试高斯模糊吧!

三、C++实战体验高斯模糊

#include<opencv2/opencv.hpp>

#define PI 3.1415926
using namespace std;
using namespace cv;

int main(int argc, char ** argv)
{
	//由于只是尝试,我们就把图片直接读成单通道灰度图
	Mat src = imread("E:/a.jpg", 0);
	namedWindow("src", WINDOW_AUTOSIZE);
	imshow("src", src);

	//5x5卷积模板
	Mat model = Mat(5, 5, CV_64FC1);
	double sigma = 80;
	for (int i = -2; i <= 2; i++)
	{
		for (int j = -2; j <= 2; j++)
		{
			model.at<double>(i + 2, j + 2) =
				exp(-(i * i + j * j) / (2 * sigma * sigma)) /
				(2 * PI * sigma * sigma);
		}
	}
	//权重矩阵
	double gaussSum = 0;
	gaussSum = sum(model).val[0];
	for (int i = 0; i < model.rows; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			model.at<double>(i, j) = model.at<double>(i, j) /
				gaussSum;
		}
	}
	//计算高斯模糊
	Mat dst = Mat(src.rows - 4, src.cols - 4, CV_8UC1);

	for (int i = 2; i < src.rows - 2; i++)
	{
		for (int j = 2; j < src.cols - 2; j++)
		{
			double sum = 0;
			for (int m = 0; m < model.rows; m++)
			{
				for (int n = 0; n < model.cols; n++)
				{
					sum += (double)src.at<uchar>(i + m - 2, j + n - 2) *
						model.at<double>(m, n);
				}
			}
			dst.at<uchar>(i - 2, j - 2) = (uchar)sum;
		}
	}
    //输出高斯模糊后的图片
	namedWindow("gaussBlur", WINDOW_AUTOSIZE);
	imshow("gaussBlur", dst);

	waitKey(0);
}

高斯更模糊
如果想进一步了解更多计算机视觉代码,请移步

Barack Bao的github

七、参考文献

https://blog.csdn.net/weixin_41042404/article/details/81608178

https://www.jianshu.com/p/302a895c12dd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值