opencv#30 线性滤波

这篇具有很好参考价值的文章主要介绍了opencv#30 线性滤波。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

均值滤波原理

均值滤波步骤

Step1:求和。

Step2:计算平均值。

opencv#30 线性滤波,opencv,计算机视觉,人工智能

     所谓均值滤波,就是求平均值的意思。我们假设在一个3*3的范围内有一个图像,其中这个图像每一个像素可能含有噪声,也可能不含噪声,我们是不知道的,因此通过均值滤波的方式,对图像中所有像素进行求和,并除以像素个数,得到的结果就是滤波后的结果,将3*3区域的中心位置更改为滤波后的平均值,这样的过程就是均值滤波。

     均值滤波和图像的卷积操作相类似,它们都是在原图像中将每一个像素分别覆盖滤波模板,也可称为滤波器,覆盖原图像后求取平均值,放入中心区域作为滤波结果,然后移动滤波器,使滤波器能够覆盖图像的每一个位置。对于上图3*3的矩阵来说,其中每一个位置都乘了1,也就是说它进行卷积的模板是一个3*3的矩阵,此矩阵中的值都为1,之后又除以了和,因此它的卷积模板(滤波器)就是一个1/9乘全为1的矩阵(3*3)。

均值滤波函数

blur()

void cv::blur(InuputArray   src,
              OutputArray   dst,
              Size          ksize,
              Point         anchor = Point(-1,-1),
              int           borderType = BORDER_DEFAULT
             )

·src:待均值滤波的图像,图像数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F和CV_64F这五种数据类型之一。均值滤波输出的结果的数据类型与输入图像的数据类型保持一致。

·dst:均值滤波后的图像,与输入图像具有相同的尺寸和数据类型。

·ksize:卷积核尺寸(滤波器尺寸:常用的是奇数正方形)。因为均值滤波中,滤波器中的每一位参数值是恒定的,因此这里面我们只需给出其尺寸即可。

·anchor:内核的基准点(锚点),其默认值为(-1,-1)代表内核基准点位于kernel的中心位置。·borderType:像素外推法选择标志。

方框滤波函数

boxFilter()

void cv::boxFilter(InputArray   src,
                   OutputArray  dst,
                   int          ddepth,
                   Size         ksize,
                   Point        anchor = Point(-1,-1),
                   bool         normalize = true,
                   int          borderType = BORDER_DEFAULT
                  )

     方框滤波函数与均值滤波其实是等价的,只不过方框滤波运行滤波器不进行归一化,但是在均值滤波中是强制进行归一化的。 由于方框滤波是一个求和的参数,可能会出现255+255+255+....很多个255相加,最终超出255范围的情况,因此第三个参数运行用户设定输出图像的数据类型,也就是输出图像的数据类型可以与输入图像不同,但是尺寸和通道数是一致的。

·src:输入图像。

·dst:输出图像,与输入图像具有相同的尺寸和通道数。

·ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。

·ksize:卷积核尺寸。

·anchor:内核的基准点(锚点),其默认值为(-1,-1)代表内核基准点位于kernel的中心位置。

·normalize:是否将卷积核进行归一化的标志,默认参数为true,表示进行归一化(在矩阵前面乘所有数值之和)。

·borderType:像素外推法选择标志。

高斯滤波原理

opencv#30 线性滤波,opencv,计算机视觉,人工智能     高斯滤波也就是滤波器是一个高斯分布的形式,如上图所示,滤波器中中间的像素值较大,而四周像素值较小的情况,是一个中心对称的滤波器。若以这样的滤波器作为卷积核与原图像进行卷积操作的时候,得到的就是一个高斯滤波之后的结果 。

高斯滤波函数

GaussianBlur()

void cv::GaussianBlur(InputArray    src,
                      OutputArray   dst,
                      Size          xsize,
                      double        sigmaX,
                      double        sigmaY = 0,
                      int           borderType = BORDER_DEFAULT
                     )

·src:待高斯滤波图像,数据类型必须为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。

·dst:输出图像,与输入图像src具有相同的尺寸,通道数和数据类型。

·ksize:高斯滤波器的尺寸,滤波器可以不为正方形,但是必须是正奇数。如果尺寸为0,则由标准偏差计算尺寸。高斯滤波器不需要人为的输入,因为高斯滤波器的高斯函数分布形式是固定的,只需给出滤波器尺寸即可。

·sigmaX:X方向的高斯滤波器标准偏差。

·sigmaY:Y方向的高斯滤波器标准偏差。如果输入量为0,则将其设置为等于sigmaX,如果两个轴的标准差均为0,则根据输入的高斯滤波器尺寸计算标准差。

ksize ,sigmaX,sigmaY不允许同时为0,若某个参数为0,可以根据对应关系计算出参数。

·borderType:像素外推法选择标志。

示例
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv; //opencv的命名空间
using namespace std;



//主函数
int main()
{
	Mat lenaGray = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenaGray.png");
	Mat equalLena_Salt = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/equalLena_S.png");
	Mat equalLena_Gauss = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/equalLena_G.png");

	if (lenaGray.empty() || equalLena_Salt.empty() || equalLena_Gauss.empty())
	{
		cout << "请确认图像名称是否正确" << endl;
		return -1;
	}

	Mat result_3, result_9; //存放不含噪声滤波结果,后面的数字代表滤波器尺寸
	Mat result_3gauss, result_9gauss; //存放含有高斯噪声滤波结果,后面数字代表滤波器尺寸
	Mat result_3salt, result_9salt; //存放含有椒盐噪声滤波结果,后面的数字代表滤波器尺寸

	//调用均值滤波函数blur()进行滤波
	blur(lenaGray, result_3, Size(3, 3));
	blur(lenaGray, result_9, Size(9, 9));
	blur(equalLena_Salt, result_3salt, Size(3, 3));
	blur(equalLena_Salt, result_9salt, Size(9, 9));
	blur(equalLena_Gauss, result_3gauss, Size(3, 3));
	blur(equalLena_Gauss, result_9gauss, Size(9, 9));


	//显示不含噪声图像
	imshow("lenaGray", lenaGray);
	imshow("result_3", result_3);
	imshow("result_9", result_9);
	//显示不含噪声图像
	imshow("equalLena_Salt", equalLena_Salt);
	imshow("result_3salt", result_3salt);
	imshow("result_9salt", result_9salt);
	//显示不含噪声图像
	imshow("equalLena_Gauss", equalLena_Gauss);
	imshow("result_3gauss", result_3gauss);
	imshow("result_9gauss", result_9gauss);

	cout << "下面是方框滤波" << endl;
	waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出
	
	Mat resultNorm, result;
	//方框滤波boxFilter()和sqrBoxFilter()
	boxFilter(lenaGray, resultNorm, -1, Size(3, 3), Point(-1, -1), true); //进行归一化
	boxFilter(lenaGray, result, -1, Size(3, 3), Point(-1, -1), false); //进行归一化

	//显示处理结果
	imshow("resultNorm", resultNorm);
	imshow("result", result);
	cout << "下面是高斯滤波" << endl;
	waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出

	Mat result_5_G, result_9_G;//存放不含噪声滤结果,后面数字代表滤波器尺寸
	Mat result_5Gauss_G, result_9Gauss_G;//存放含高斯噪声滤结果,后面数字代表滤波器尺寸
	Mat result_5Salt_G, result_9Salt_G;//存放含椒盐噪声滤结果,后面数字代表滤波器尺寸

	GaussianBlur(lenaGray, result_5_G, Size(5, 5), 10, 20);
	GaussianBlur(lenaGray, result_5_G, Size(5, 5), 10, 20);
	GaussianBlur(equalLena_Gauss, result_5Gauss_G, Size(5, 5), 10, 20);
	GaussianBlur(equalLena_Gauss, result_9Gauss_G, Size(9, 9), 10, 20);
	GaussianBlur(equalLena_Salt, result_5Salt_G, Size(5, 5), 10, 20);
	GaussianBlur(equalLena_Salt, result_9Salt_G, Size(9, 9), 10, 20);


	//显示不含噪声图像
	imshow("lenaGray", lenaGray);
	imshow("result_5_G", result_5_G);
	imshow("result_9_G", result_9_G);
	//显示不含噪声图像
	imshow("equalLena_Salt", equalLena_Salt);
	imshow("result_5Gauss_G", result_5Gauss_G);
	imshow("result_9Gauss_G", result_9Gauss_G);
	//显示不含噪声图像
	imshow("equalLena_Gauss", equalLena_Gauss);
	imshow("result_5Salt_G", result_5Salt_G);
	imshow("result_9Salt_G", result_9Salt_G);
	waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出

	return 0;

}

滤波完成后:

在均值滤波中:对于椒盐噪声和高斯噪声的滤波结果,尺寸越大的滤波器,对于图像来说,滤波后的结果也越模糊,噪声产生的影响变小。如果想最大程度的去除噪声,采用均值滤波的形式的话,那么需要一个很大的尺寸,同时对图像的整体质量有较大的影响。

对椒盐噪声,由于我们的均值滤波是每一个像素值都贡献了相同作用,所以对于椒盐噪声来说,仍然可以看出图像中含有椒盐噪声,只不过椒盐噪声的颗粒没有那么亮,没有那么明显,但是椒盐噪声的颗粒变得更粗了。

在方框滤波中:方框滤波中如果进行归一化操作,所得到的结果与均值滤波的结果一致,若不进行归一化操作,那么有可能出现图像中数值远远大于255,但是在opencv中,会强制为255,所以导致整个图像中,较大的区域都为白色,而有纹理的恰恰是原图像中较暗的区域。

在高斯滤波中:顾名思义对高斯噪声的滤波更为理想。结果也会变得模糊,但是处理结果也较好。若图像中含有椒盐噪声,采用线性滤波的方式得到的结果不太理想。文章来源地址https://www.toymoban.com/news/detail-817971.html

到了这里,关于opencv#30 线性滤波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【计算机视觉】图像处理算法(形态学滤波篇)

    来源:《OpenCV3编程入门》,怀念毛星云大佬🕯️ 说明: 本系列重点关注各种图像处理算法的原理、作用和对比 数学形态学的概念: 数学形态学(Mathematical morphology)是立在格论和拓扑学基础之上的图像分析学科,足数学形态学阁像处现的基本理论。其基本的运算包括:二值腐

    2024年03月10日
    浏览(57)
  • 探索人工智能 | 计算机视觉 让计算机打开新灵之窗

    计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。 计算机视觉既是工程领域,也是科学领域中的一个富

    2024年02月14日
    浏览(53)
  • 线性变换与计算机视觉的发展

    计算机视觉(Computer Vision)是一门研究如何让计算机理解和解析人类视觉系统所处的环境的科学。它涉及到许多领域,包括图像处理、模式识别、机器学习等。线性变换(Linear Transform)是计算机视觉中的一个基本概念,它可以用来处理图像和其他多维数据。 线性变换是一种将一个

    2024年02月22日
    浏览(48)
  • 计算机视觉教程2-2:详解图像滤波算法(附Python实战)

    图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter) ,其本质是数字窗口上的数学运算。一般用于图像平滑、图像锐化、特征提取(如纹理测量、边缘检测)等,邻域滤波使用邻域算子—— 利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Freque

    2024年02月06日
    浏览(80)
  • 深入探索人工智能与计算机视觉

    在当今数字化时代,人工智能(AI)和计算机视觉(CV)作为两大前沿技术,正以惊人的速度改变着我们的生活。本文将深入探讨人工智能与计算机视觉的关系、应用以及未来发展方向。 1. 人工智能与计算机视觉的关系 人工智能是一门涵盖众多技术领域的学科,旨在使计算机

    2024年04月14日
    浏览(60)
  • 图像处理与计算机视觉--第四章-图像滤波与增强-第二部分

    目录 1.图像噪声化处理与卷积平滑 2.图像傅里叶快速变换处理 3.图像腐蚀和膨胀处理 4 图像灰度调整处理 5.图像抖动处理算法    

    2024年02月07日
    浏览(44)
  • 人工智能在计算机视觉中的应用与挑战

    引言 计算机视觉是人工智能领域的一个重要分支,旨在让计算机能够像人一样理解和解释视觉信息,实现图像和视频的自动识别、理解和分析。计算机视觉技术已经在许多领域产生了深远的影响,如人脸识别、自动驾驶、医学影像分析等。本篇博客将深入探讨人工智能在计算

    2024年02月14日
    浏览(62)
  • 图像处理与计算机视觉--第四章-图像滤波与增强-第一部分

    目录 1.灰度图亮度调整 2.图像模板匹配 3.图像裁剪处理 4.图像旋转处理 5.图像邻域与数据块处理

    2024年02月07日
    浏览(72)
  • 【计算机视觉】基于OpenCV计算机视觉的摄像头测距技术设计与实现

    在当今技术日益进步的时代,计算机视觉已成为我们生活中不可或缺的一部分。从智能监控到虚拟现实,计算机视觉技术的应用范围日益广泛。在这篇博客中,我们将探索一个特别实用的计算机视觉案例:使用OpenCV实现摄像头测距。这一技术不仅对专业人士有用,也为编程爱

    2024年02月04日
    浏览(55)
  • 读十堂极简人工智能课笔记04_计算机视觉

    3.2.3.1. 应该发现真正的边缘,而尽量避免错报 3.2.4.1. 应该正确地找出边缘的确切位置 3.2.5.1. 每条实际的边缘应该检测为一条边缘,而不是多条边缘 4.7.5.1. 有数以百万计的几乎任何种类的图像例子 4.7.7.1. 神经网络自己就能完成这一切

    2024年02月19日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包