实战OpenCV之图像滤波

embedded/2024/9/25 12:42:01/

基础入门

        图像滤波是数字图像处理中一种非常重要的技术,主要用于图像噪声去除、图像平滑、突出图像特征,或者进行图像风格的转换。它通过数学运算对图像中的像素值进行修改,以达到特定的处理目的。图像滤波可以分为两大类,分别为:线性滤波、非线性滤波。

        线性滤波器通过一个固定的权重矩阵(即:滤波核或卷积核)与图像的每个像素及其周围像素进行卷积操作,从而实现对图像的平滑或锐化。这个权重矩阵决定了滤波的效果,常见的线性滤波器有:高斯滤波均值滤波等。

        非线性滤波不遵循线性叠加原则,常见的有中值滤波等。非线性滤波对于消除椒盐噪声尤为有效,因为它能保留边缘细节。

均值滤波

        均值滤波是最基础的线性滤波方法,它将每个像素点替换为其邻域像素值的平均值,这有助于消除图像中的随机噪声。在OpenCV中,均值滤波使用cv::blur函数,其函数原型如下。

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

        各个参数的含义如下。

        src:需要进行均值模糊处理的图像,类型为cv::Mat。

        dst:用于存放处理后的模糊图像,类型为cv::Mat。

        ksize:模糊内核的大小,类型为cv::Size,指定在水平和垂直方向上的像素数目。通常使用奇数大小的核,以确保有中心点。

        anchor:锚点位置,类型为cv::Point,默认值为Point(-1,-1),表示锚点位于核的中心。锚点是核中的一个点,用于对应输入图像中的像素位置。如果锚点位于核的边界之外,则其实际位置会根据边界规则调整到核的边界上。

        borderType:边界填充类型,决定了图像边界的处理方式。默认值为BORDER_DEFAULT。

        在下面的实战代码中,我们首先尝试读取图像文件。读取成功后,利用cv::blur函数应用一个5x5大小的核进行均值滤波,以减少图像中的噪声。最后,我们通过cv::imshow分别显示原始图像和经过滤波处理后的图像。

#include <opencv2/opencv.hpp>
using namespace cv;#include <iostream>
using namespace std;int main()
{Mat srcImage = imread("Snowman.jpg");if(srcImage.empty()){cout << "Can not open or find the image" << endl;return -1;}Mat destImage;// 使用均值滤波,核大小为5 x 5blur(srcImage, destImage, Size(5, 5));imshow("Original Image", srcImage);imshow("Blurred Image", destImage);waitKey(0);destroyAllWindows();return 0;
}

        执行上面的代码,运行效果可参考下图。可以看到,通过均值滤波后,图像变得模糊了。

高斯滤波

        高斯滤波同样采用卷积的方式,但它使用了加权平均,其中权重是由二维高斯函数确定的。高斯函数确保了中心像素附近的像素权重较大,远离中心的像素权重逐渐减小。这意味着,更靠近中心的像素对结果的影响更大。均值滤波适合对处理速度要求较高且对图像质量损失不敏感的应用,比如:初步的图像预处理。而高斯滤波更适合于需要高质量平滑效果,同时希望尽可能保留图像细节的场合,比如:医学图像处理、图像增强前的预处理等。

        在OpenCV中,高斯滤波使用cv::GaussianBlur函数,其函数原型如下。

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT);

        各个参数的含义如下。

        src:需要进行高斯模糊处理的图像,类型为cv::Mat。

        dst:经过高斯模糊处理后的图像,类型为cv::Mat,此参数用于存放处理后的结果。

        ksize:高斯核的大小,类型为cv::Size。它定义了在水平和垂直方向上的核大小,通常是一个奇数,以确保有中心点。如果传递一个单个数值,OpenCV会将其视为在两个方向上的相同大小。

        sigmaX:水平方向上的高斯核标准差。如果设为0(默认值),函数会自动从ksize.width计算得到。

        sigmaY:垂直方向上的高斯核标准差。如果设为0(默认值),函数会将其设为simgaX的值,从而创建一个在两个方向上大小相同的核。

        borderType:边界填充类型,用于外部像素的延伸处理。默认值BORDER_DEFAULT通常足够使用,但也可以根据需要选择其他类型,比如:BORDER_CONSTANT、BORDER_REPLICATE等。

        同样的一幅图像,经过高斯滤波后,效果可参考下图。

中值滤波

        中值滤波主要用于去除图像中的椒盐噪声,同时能很好地保护边缘信息,不会造成模糊效应。在OpenCV中,中值滤波使用cv::medianBlur函数,其函数原型如下。

void cv::medianBlur(InputArray src, OutputArray dst, int ksize);

        各个参数的含义如下。

        src:单通道或多通道图像,类型为cv::Mat。

        dst:输出图像,与输入图像具有相同的大小和类型。

        ksize中值滤波器的核大小(宽度和高度必须是奇数且相等),决定了考虑邻域的大小。较大的核尺寸能够过滤掉较大的噪声,但也可能模糊图像中的细节。

        同样的一幅图像,经过中值滤波后,效果可参考下图。

总结

        图像滤波不仅仅是简单地去噪或平滑图像,它至少在以下四个领域都有着非常广泛的应用。

        1、预处理。在进行边缘检测、特征提取等操作之前,常使用高斯滤波去除噪声,减少误检。

        2、特征增强。通过特定的滤波器(比如:锐化滤波等),可以增强图像中的边缘和细节,便于后续的特征提取。

        3、图像复原。在图像去模糊、去噪等复原任务中,滤波器的选择和设计显得至关重要。

        4、艺术效果。通过一些非传统的滤波器(比如:双边滤波等),可以在保留边缘的同时进行平滑,常用于图像风格转换。


http://www.ppmy.cn/embedded/116611.html

相关文章

MySQL—存储过程详解

基本介绍 存储过程和函数是数据库中预先编译并存储的一组SQL语句集合。它们的主要目的是提高代码的复用性、减少数据传输、简化业务逻辑处理&#xff0c;并且一旦编译成功&#xff0c;可以永久有效。 存储过程和函数的好处 提高代码的复用性&#xff1a;存储过程和函数可以在…

个人计算机与网络的安全

关于 wifi 大家都知道 wifi 已经使用了 wpa3 非常安全 但很多人不知道 pin 和 wps 这两项有漏洞 我发现很多用户都简单设置了这两项 他们的设置 使他们的网络出现了漏洞 关于 国产的 linux 老实说全是漏洞 默认开启 很多服务 但初始化的设置都有漏洞 关于 系统安全 老…

vue3的生命周期有哪些

vue3的生命周期&#xff1a;1、beforecreate&#xff1b;2、created&#xff1b;3、beforemount&#xff1b;4、mounted&#xff1b;5、beforeupdate&#xff1b;6、updated&#xff1b;7、beforedestroy&#xff1b;8、destroyed&#xff1b;9、activated&#xff1b;10、deac…

2.数据库-第二章数据库数据管理

2.数据库-第二章数据库数据管理 文章目录 2.数据库-第二章数据库数据管理DML1.新增:2.修改&#xff1a;3.删除&#xff1a; DML 1.新增: ​ insert into 表名[(列1,列2…)]values(值1,值2) 当出现多条插入时 使用逗号,隔开 inser into grade(GradeName) values("S1&qu…

zynq的PS端mac与RTL8211F的连接要点

目录 1 VCCO_MIO12 PS_MIO_VREF3 PS的引脚4 RXDLY TXDLY5 ZYNQ的MAC可以调整延时吗 1 VCCO_MIO1 接1.8V 2 PS_MIO_VREF 接0.9V&#xff0c;可通过电阻分压 可通过电阻分压 3 PS的引脚 4 RXDLY TXDLY RXDLY RXD[0] TXDLY RXD[1] 与XC7Z020的PS端MAC连接&#xff0c;必须…

LeetCode 210. 课程表 II

LeetCode 210. 课程表 II 现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 先选修 bi 。 例如&#xff0c;想要学习课程 0 &#x…

如何批量获取安卓设备上所有应用的桌面图标

文章目录 概述一、准备工作1.1 安装 ADB安装 ADB&#xff1a;1.2 获取设备上的应用包名1.3 使用 ADB 导出 APK 文件 二、提取桌面图标流程2.1 反编译 APK 文件2.2 解析 AndroidManifest.xml2.3 搜索图标资源文件 三、 编写 Python 自动化工具3.1 代码结构3.2 运行脚本 四、错误…

架构面试题

架构基础 如何理解架构的演进&#xff1f; 架构的演进指的是随着技术、业务和需求的不断发展&#xff0c;架构在设计和实施上的变化和进化过程。这包括从单体应用向微服务架构的过渡、从传统的服务器部署向云原生架构的转变&#xff0c;以及在数据处理、安全性和性能优化等方…