当前位置: 首页 > news >正文

实战OpenCV之图像滤波

基础入门

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

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

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

均值滤波

        均值滤波是最基础的线性滤波方法,它将每个像素点替换为其邻域像素值的平均值,这有助于消除图像中的随机噪声。在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、艺术效果。通过一些非传统的滤波器(比如:双边滤波等),可以在保留边缘的同时进行平滑,常用于图像风格转换。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Godot4.3】基于状态切换的游戏元素概论
  • 如何开发数字药店与医保购药APP:技术架构与实现细节
  • Python NumPy 安装指南:开启高效数值计算之旅
  • 【.net core】线程的创建和方法调用
  • 机械设计基础知识---不锈钢
  • Android通知服务及相关概念
  • 数据结构——链表
  • 【Day20240924】05git 两人协作 冲突
  • 零基础到精通Web渗透测试的学习路线,零基础入门到精通,收藏这一篇就够了
  • MySQL—存储过程详解
  • mysql如何快速编写单表查询语句
  • Spring定时任务 - @Scheduled注解详解
  • Flutter 获取手机连接的Wifi信息
  • 秋分之际,又搭建了一款微信记账本小程序
  • Java后端开发中的响应缓存:从HTTP缓存到分布式缓存的最佳实践
  • hexo+github搭建个人博客
  • 2017届校招提前批面试回顾
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CAP理论的例子讲解
  • conda常用的命令
  • create-react-app项目添加less配置
  • flask接收请求并推入栈
  • IndexedDB
  • JAVA之继承和多态
  • linux学习笔记
  • ReactNative开发常用的三方模块
  • Vue 2.3、2.4 知识点小结
  • vue数据传递--我有特殊的实现技巧
  • 飞驰在Mesos的涡轮引擎上
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 汉诺塔算法
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 人脸识别最新开发经验demo
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 项目管理碎碎念系列之一:干系人管理
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 智能合约开发环境搭建及Hello World合约
  • scrapy中间件源码分析及常用中间件大全
  • 阿里云重庆大学大数据训练营落地分享
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # Redis 入门到精通(一)数据类型(4)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #pragma pack(1)
  • (1)虚拟机的安装与使用,linux系统安装
  • (done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (二)丶RabbitMQ的六大核心
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)setTimeout 和 setInterval 的区别
  • (转载)利用webkit抓取动态网页和链接
  • .bashrc在哪里,alias妙用
  • .naturalWidth 和naturalHeight属性,
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅