OpenCV高斯滤波GaussianBlur

14 篇文章 1 订阅
14 篇文章 3 订阅

图像处理中,常用的滤波算法有均值滤波、中值滤波以及高斯滤波等。

三种滤波器的对比
滤波器种类基本原理特点
均值滤波使用模板内所有像素的平均值代替模板中心像素灰度值易收到噪声的干扰,不能完全消除噪声,只能相对减弱噪声
中值滤波计算模板内所有像素中的中值,并用所计算出来的中值体改模板中心像素的灰度值对噪声不是那么敏感,能够较好的消除椒盐噪声,但是容易导致图像的不连续性
高斯滤波对图像邻域内像素进行平滑时,邻域内不同位置的像素被赋予不同的权值对图像进行平滑的同时,同时能够更多的保留图像的总体灰度分布特征

下面本文主要对高斯滤波展开详细的介绍。

基本原理

数值图像处理中,高斯滤波主要可以使用两种方法实现。一种是离散化窗口滑窗卷积,另一种方法是通过傅里叶变化。最常见的就是滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常搭的情况下,可能会考虑基于傅里叶变化的实现方法。所以本文将主要介绍滑窗实现的卷积。

离散化窗口划船卷积时主要利用的是高斯核,高斯核的大小为奇数,因为高斯卷积会在其覆盖区域的中心输出结果。常用的高斯模板有如下几种形式:

高斯模板是通过高斯函数计算出来的,公式如下:

以3 × 3的高斯滤波器模板为例,以模板的中心位置为坐标原点进行取样。模板在各个位置的坐标,如下所示(x轴水平向右,y轴竖直向上)。

这样,将各个位置的坐标带入到高斯函数G中,得到的每个值按照位置排列,就得到了模板。

这样输出的模板有两种形式:

① 小数类型:直接计算得到的值,没有经过任何处理。

② 整数类型:将得到的值进行归一化处理,即将坐上叫的值归一化为1,其他每个系数都除以左上角的系数,然后取整。在使用整数模板时,则需要在模板的前面加一个系数,该系数为模板系数之和的倒数。

例如:生成高斯核为3 × 3,σ = 0.8的模板

小数模板:

0.0571180.124760.057118
0.124760.27250.12476
0.0571180.124760.057118

 

整数模板:

12.18421
2.18424.77072.1842
12.18421

                 再经过四舍五入和添加系数得到最终结果:

 从以上描述中我们可以看出,高斯滤波模板中最重要的参数就是高斯分布的标准差σ。它代表着数据的离散程度,如果σ较小,那么生成的模板中心系数越大,而周围的系数越小,这样对图像的平滑效果就不是很明显;相反,σ较大时,则生成的模板的各个系数相差就不是很大,比较类似于均值模板,对图像的平滑效果就比较明显。通过下面的一维高斯分布图也可验证上述观点。

GaussianBlur函数

函数原型:

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_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计算出来。

\sigma _x=(\frac{n_x-1}{2})\cdot 0.30+0.80,n_x=ksize.width-1

\sigma _y=(\frac{n_y-1}{2})\cdot 0.30+0.80,n_y=ksize.height-1

应用示例

#include "stdafx.h"
#include <opencv2/opencv.hpp>


int 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;
}

运行结果:

平滑处理前平滑处理后

 

  • 66
    点赞
  • 401
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
OpenCV提供了GaussianBlur()函数用于实现高斯滤波。该函数接受输入图像、卷积核的大小、sigmaX和sigmaY等参数,并返回滤波后的图像。具体的函数原型为: cv2.GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT) 通过该函数,OpenCV会根据传入的sigmaX和sigmaY参数生成对应的一维卷积核。如果sigmaX和sigmaY未传入参数,则会使用ksize计算得到。接着,OpenCV会将生成的卷积核分别应用于图像的行和列进行卷积操作。最后,对卷积结果进行归一化处理,得到高斯滤波后的图像。 为了验证这个过程,可以使用以下代码: image_ori = cv2.imread('car.png') image_gray = cv2.cvtColor(image_ori, cv2.COLOR_BGR2GRAY) image1 = cv2.GaussianBlur(image_gray, (3,3), 0.8, 0.8) image2 = cv2.sepFilter2D(image_gray, -1, cv2.getGaussianKernel(3, 0.8), cv2.getGaussianKernel(3, 0.8)) print(image1==image2) 在这段代码中,首先读取输入图像,并将其转换为灰度图像。然后,分别使用GaussianBlur()函数和sepFilter2D()函数实现高斯滤波,并将结果保存在image1和image2中。最后,使用print语句比较image1和image2是否相等。 通过以上步骤,可以验证OpenCV高斯滤波的实现过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [opencv高斯滤波GaussianBlur()详解(sigma取值)](https://blog.csdn.net/wuqindeyunque/article/details/103694900)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [opencv学习(二十)之高斯滤波GaussianBlur()](https://blog.csdn.net/keith_bb/article/details/54412493)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值