高斯模糊
高斯模糊(英语: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);
}
如果想进一步了解更多计算机视觉代码,请移步
七、参考文献
https://blog.csdn.net/weixin_41042404/article/details/81608178