在线教学网站开发,德阳响应式网站建设,项目招商网站大全,哪个网站上门做护肤图像处理中#xff0c;常用的滤波算法有均值滤波、中值滤波以及高斯滤波等。 三种滤波器的对比滤波器种类基本原理特点均值滤波使用模板内所有像素的平均值代替模板中心像素灰度值易收到噪声的干扰#xff0c;不能完全消除噪声#xff0c;只能相对减弱噪声中值滤波计算模板内…图像处理中常用的滤波算法有均值滤波、中值滤波以及高斯滤波等。
三种滤波器的对比滤波器种类基本原理特点均值滤波使用模板内所有像素的平均值代替模板中心像素灰度值易收到噪声的干扰不能完全消除噪声只能相对减弱噪声中值滤波计算模板内所有像素中的中值并用所计算出来的中值体改模板中心像素的灰度值对噪声不是那么敏感能够较好的消除椒盐噪声但是容易导致图像的不连续性高斯滤波对图像邻域内像素进行平滑时邻域内不同位置的像素被赋予不同的权值对图像进行平滑的同时同时能够更多的保留图像的总体灰度分布特征
下面本文主要对高斯滤波展开详细的介绍。
基本原理
数值图像处理中高斯滤波主要可以使用两种方法实现。一种是离散化窗口滑窗卷积另一种方法是通过傅里叶变化。最常见的就是滑窗实现只有当离散化的窗口非常大用滑窗计算量非常搭的情况下可能会考虑基于傅里叶变化的实现方法。所以本文将主要介绍滑窗实现的卷积。
离散化窗口划船卷积时主要利用的是高斯核高斯核的大小为奇数因为高斯卷积会在其覆盖区域的中心输出结果。常用的高斯模板有如下几种形式 高斯模板是通过高斯函数计算出来的公式如下 以3 × 3的高斯滤波器模板为例以模板的中心位置为坐标原点进行取样。模板在各个位置的坐标如下所示x轴水平向右y轴竖直向上。 这样将各个位置的坐标带入到高斯函数G中得到的每个值按照位置排列就得到了模板。
这样输出的模板有两种形式
① 小数类型直接计算得到的值没有经过任何处理。
② 整数类型将得到的值进行归一化处理即将坐上叫的值归一化为1其他每个系数都除以左上角的系数然后取整。在使用整数模板时则需要在模板的前面加一个系数该系数为模板系数之和的倒数。
例如生成高斯核为3 × 3σ 0.8的模板
小数模板
0.0571180.124760.0571180.124760.27250.124760.0571180.124760.057118整数模板
12.184212.18424.77072.184212.18421再经过四舍五入和添加系数得到最终结果 从以上描述中我们可以看出高斯滤波模板中最重要的参数就是高斯分布的标准差σ。它代表着数据的离散程度如果σ较小那么生成的模板中心系数越大而周围的系数越小这样对图像的平滑效果就不是很明显相反σ较大时则生成的模板的各个系数相差就不是很大比较类似于均值模板对图像的平滑效果就比较明显。通过下面的一维高斯分布图也可验证上述观点。 GaussianBlur函数
函数原型:
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY0, int borderTypeBORDER_DEFAULT);
参数详解如下
src输入图像即源图像填Mat类的对象即可。它可以是单独的任意通道数的图片但需要注意图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
dst即目标图像需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone以源图片为模板来初始化得到如假包换的目标图。
ksize高斯内核的大小。其中ksize.width和ksize.height可以不同但他们都必须为正数和奇数并不能理解。或者它们可以是零的它们都是由sigma计算而来。
sigmaX表示高斯核函数在X方向的的标准偏差。
sigmaY表示高斯核函数在Y方向的的标准偏差。若sigmaY为零就将它设为sigmaX如果sigmaX和sigmaY都是0那么就由ksize.width和ksize.height计算出来。 应用示例
#include stdafx.h
#include opencv2/opencv.hppint main()
{// 创建两个窗口分别显示输入和输出的图像cv::namedWindow(Example2-5_in, cv::WINDOW_AUTOSIZE);cv::namedWindow(Example2-5_out, cv::WINDOW_AUTOSIZE);// 读取图像并用输入的窗口显示输入图像cv::Mat img cv::imread(C:\\Users\\Bello\\Desktop\\test.jpg, -1);cv::imshow(Example2-5_in, img);// 声明输出矩阵cv::Mat out;// 进行平滑操作可以使用GaussianBlur()、blur()、medianBlur()或bilateralFilter()// 此处共进行了两次模糊操作cv::GaussianBlur(img, out, cv::Size(5, 5), 3, 3);cv::GaussianBlur(out, out, cv::Size(5, 5), 3, 3);// 在输出窗口显示输出图像cv::imshow(Example2-5_out, out);// 等待键盘事件cv::waitKey(0);// 关闭窗口并释放相关联的内存空间cv::destroyAllWindows();return 0;
}
运行结果
平滑处理前平滑处理后