【图像处理OpenCV(C++版)】——5.2 图像平滑之高斯平滑

这篇具有很好参考价值的文章主要介绍了【图像处理OpenCV(C++版)】——5.2 图像平滑之高斯平滑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

😊😊😊欢迎来到本博客😊😊😊

🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。

😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–>搜索你要查询的算子名称或相关知识点,或者通过这篇博客👉通俗易懂OpenCV(C++版)详细教程——OpenCV函数快速查找(不断更新中)]查阅你想知道的知识,即可食用。

🎁🎁🎁支持:如果觉得博主的文章还不错或者您用得到的话,可以悄悄关注一下博主哈,如果三连收藏支持就更好啦!这就是给予我最大的支持!😙😙😙


学习目标

  • 了解高斯平滑含义
  • 熟悉高斯卷积核的构建及分离
  • C++实现高斯平滑案例

  每一张图像都可能包含某种程度的噪声,噪声可以理解为由一种或者多种原因造成的灰度值的随机变化。
  在大多数情况下,通过平滑技术(也常称为滤波技术)进行抑制或者去除,其中具备保持边缘(Edge Preserving)作用的平滑技术得到了更多的关注。
  常用的平滑处理算法包括基于二维离散卷积高斯平滑、均值平滑,基于统计学方法的中值平滑,具备保持边缘作用的平滑算法的双边滤波、导向滤波等。

  下面将详细介绍高斯平滑技术原理、常见应用及实现。


一、高斯卷积核的构建及分离性

1.1 相关概念

  假设构造宽(列数)为W、高(行数)为H的高斯卷积算子gaussKernelH×WWH均为奇数,锚点(中心点)位置为:[(H-1)/2,(w-1)/2],则:
    (1) 计算高斯矩阵

高斯平滑,# OpenCV(C++),opencv,图像处理,c++,算法,计算机视觉
其中:
高斯平滑,# OpenCV(C++),opencv,图像处理,c++,算法,计算机视觉
r(rows)、c(cols)代表位置索引,其中0≤c≤W-1,0≤r≤H-1,且r,c均为整数。

    (2) 计算高斯矩阵的和

高斯平滑,# OpenCV(C++),opencv,图像处理,c++,算法,计算机视觉

    (3) 高斯矩阵除以其本身的和,即归一化,得到的便是高斯卷积算子

高斯平滑,# OpenCV(C++),opencv,图像处理,c++,算法,计算机视觉

1.2 高斯卷积算子是可分离卷积核

  在计算高斯矩阵过程中:

高斯平滑,# OpenCV(C++),opencv,图像处理,c++,算法,计算机视觉

  高斯卷积核可分离成一维水平方向上的高斯核和一维垂直方向上的高斯核,或者反过来,即:

高斯平滑,# OpenCV(C++),opencv,图像处理,c++,算法,计算机视觉

  基于这种分离性,OpenCV给出了构建一维垂直方向上的高斯卷积核的函数

Mat cv::getGaussianKernel(int ksize,
						double 	sigma,
						int ktype = CV_64F )	
参数 解释
ksize 一维垂直方向上高斯核的行数,必须为正奇数
sigma 标准差,若不设置,即sigma = 0.3*((ksize-1)*0.5 - 1) + 0.8
ktype 返回值的数据类型,CV_32F或者为CV_64F,默认CV_64F

  返回值就是一个ksize×1的垂直方向上的高斯核,而对于一维水平方向上的高斯核,只需对垂直方向上的高斯核进行转置即可。


二、C++实现

  因为高斯卷积核是可分离的,所以可以通过定义可分离卷积函数sepConv2D_Y_X (此处用sepFilter2D代替)来实现图像的高斯平滑:

cv::Mat gaussBlur(const Mat &image,Size winsize,float sigma,int ddepth=CV_64F,Point anchor=Point(-1,-1),int boderType=BORDER_DEFAULT) {
	//卷积核的宽高须为正基数
	CV_Assert(winsize.width % 2 ==1 && winsize.height % 2 == 1);
	
	//构建垂直方向上的高斯核
	Mat gK_y = getGaussianKernel(winsize.height,sigma,CV_64F);
	
	//构建水平方向上的高斯核
	Mat gK_x = getGaussianKernel(winsize.width, sigma, CV_64F);
	
	//转置
	gK_x = gK_x.t();

	//分离高斯卷积
	Mat BlurImage;
	Mat gK_y = getGaussianKernel(winsize.height,sigma,CV_64F);
	//sepConv2D_Y_X
	sepFilter2D(image,BlurImage, ddepth, gK_y, gK_x, Point(-1, -1));
	
	return BlurImage;

}

  OpenCV提供了高斯平滑函数:


void cv::GaussianBlur(InputArray src,
	OutputArray dst,
	Size ksize,
	double sigmaX,
	double sigmaY = 0,
	int borderType = BORDER_DEFAULT 
)	
参数 解释
src 输入矩阵,支持数据类型为:CV_8U, CV_16U, CV_16S, CV_32F or CV_64F
dst 输出矩阵,大小与数据类型同src一致
ksize 高斯核大小,宽高均为正奇数,宽高可不相同
sigmaX 一维水平方向上高斯核的标准差
sigmaY 一维垂直方向上高斯核的标准差。若sigmaY为0,则将它设置为等于 sigmaX(即:sigmaY=sigmaX);如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来(计算方式可以查阅上面getGaussianKernel()建议指定所有参数值
borderType 边界扩充方式,默认BORDER_DEFAULT

注:边界扩充说明

高斯平滑,# OpenCV(C++),opencv,图像处理,c++,算法,计算机视觉

  从参数的设置可以看出,GaussianBlur()也是通过分离的高斯卷积核实现的,也可以令水平方向和垂直方向上的标准差不相同但是一般会取相同的标准差
  当平滑窗口比较小时,对标准差的变化不是很敏感,得到的高斯平滑效果差别不大;相反,当平滑窗口较大时,对标准差的变化很敏感,得到的高斯平滑效果差别较大。


三、 总结

  最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。OpenCV是学习图像处理理论知识比较好的一个途径,大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,有什么问题希望大家可以积极评论交流,我也会及时更新,来督促自己学习进度。希望大家觉得不错的可以点赞、关注、收藏。文章来源地址https://www.toymoban.com/news/detail-610533.html


🚶🚶🚶 今天的文章就到这里啦~
喜欢的话,点赞👍、收藏⭐️、关注💟哦 ~
高斯平滑,# OpenCV(C++),opencv,图像处理,c++,算法,计算机视觉

到了这里,关于【图像处理OpenCV(C++版)】——5.2 图像平滑之高斯平滑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图像处理OpenCV(C++版)】——5.3 图像平滑之均值平滑(滤波)

    前言 : 😊😊😊 欢迎来到本博客 😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。 😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–搜索你要查询的算子

    2024年02月04日
    浏览(45)
  • 【OpenCV】第七章: 图像平滑处理

    第七章: 图像平滑处理 1、什么是图像平滑处理 图像平滑处理就是,将图像中与 周围像素点的像素值差异较大的像素点 调整成 和周围像素点像素值 相近的值。 例如: 2、为什么要进行平滑处理? 因为图像在采集(生成)、传输、处理的过程中常常会存在一定的噪声干扰,比如

    2024年02月03日
    浏览(46)
  • Python-OpenCV中的图像处理-图像平滑

    使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。其实就是去除图像中的高频成分(比如:噪音,边界)。所以边界也会被模糊一点。(当然,也有一些模糊技术不会模糊掉边界)。 这是由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平

    2024年02月13日
    浏览(55)
  • 第五章 Opencv图像处理框架实战 5-3 图像阈值与平滑处理

    ret, dst = cv2.threshold(src, thresh, maxval, type) src: 输入图,只能输入单通道图像,通常来说为灰度图 dst: 输出图 thresh: 阈值 maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值 type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY

    2024年02月14日
    浏览(40)
  • 【OpenCV • c++】图像平滑处理(1) —— 线性滤波

      平滑处理也称为模糊处理,是一种简单且使用频率很高的图像处理方法,平滑处理的用途有很多,最常见的是用来减少图像上的噪点或者失真。在涉及到降低图像分辨率时,平滑处理是非常好用的方法。   图像滤波指的是在尽量保留图像细节特征的条件下对图像的噪音

    2024年03月20日
    浏览(49)
  • 【图像处理OpenCV(C++版)】——5.5 图像平滑之双边滤波

    前言 : 😊😊😊 欢迎来到本博客 😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。 😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–搜索你要查询的算子

    2024年02月13日
    浏览(45)
  • 计算机图形图像技术(OpenCV核心功能、图像变换与图像平滑处理)

    1、显示图像 ①功能:在指定窗口中显示图像。 ②参数: name 为窗口的名字; image 为待显示的图像。 ③说明:可显示彩色或灰度的字节图像和浮点数图像,彩色图像数据按BGR顺序存储。 2、读入图像 ①功能:从指定文件读入图像。 ②参数: filename 为图像文件名,支持BMP、

    2024年02月03日
    浏览(46)
  • opencv-34 图像平滑处理-双边滤波cv2.bilateralFilter()

    双边滤波(BilateralFiltering)是一种图像处理滤波技术,用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同,双边滤波在考虑像素之间的空间距离之外,还考虑了像素之间的灰度值相似性。这使得双边滤波能够有效地去除噪声,同时保持图像的细节和边缘。

    2024年02月14日
    浏览(39)
  • opencv 31-图像平滑处理-方框滤波cv2.boxFilter()

    方框滤波(Box Filtering)是一种简单的图像平滑处理方法,它主要用于去除图像中的噪声和减少细节,同时保持图像的整体亮度分布。 方框滤波的原理很简单:对于图像中的每个像素,将其周围的一个固定大小的邻域内的像素值取平均,然后将这个平均值赋值给当前像素。这

    2024年02月14日
    浏览(43)
  • opencv 30 -图像平滑处理01-均值滤波 cv2.blur()

    图像平滑处理(Image Smoothing)是一种图像处理技术,旨在减少图像中的噪声、去除细节并平滑图像的过渡部分。这种处理常用于预处理图像,以便在后续图像处理任务中获得更好的结果。 常用的图像平滑处理方法包括: 均值滤波(Mean Filtering) :用图像中像素周围区域的平

    2024年02月01日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包