实战OpenCV之图像滤波

news2024/11/15 8:55:29

基础入门

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

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

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

均值滤波

        均值滤波是最基础的线性滤波方法,它将每个像素点替换为其邻域像素值的平均值,这有助于消除图像中的随机噪声。在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 5
    blur(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.coloradmin.cn/o/2163494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matlab划分区域的等高线云图(代码)

出图结果如下&#xff1a; 代码如下&#xff0c;按需修改 clear;clc; numRows100; %数据区域&#xff0c;步长&#xff0c;步数 numCols100; ax-2;bx2; ay-2;by2; hx(bx-ax)/numCols; hy(by-ay)/numRows; XXCax:hx:bx; %坐标阵&#xff0c;data Y…

Ubuntu磁盘不足扩容

1.问题 Ubuntu磁盘不足扩容 2.解决方法 安装一下 sudo apt-get install gpartedsudo gparted

如何使用 Bittly 为基于 HTTP 的 API 快速创建 UI 操作界面

在开发 Web 应用或服务时&#xff0c;通常会提供不同数量的 API 接口给客户端或其他第三方使用&#xff0c; 当 API 数量达到一定数量的时候&#xff0c;在处理接口间的调用链以及参数关系时就会变得异常麻烦。 在这种情况下便可通过 Bittly 的面板功能将这些 API 结构进行组装…

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…

洛谷-P5461 赦免战俘(Java递归)

题目背景 借助反作弊系统&#xff0c;一些在月赛有抄袭作弊行为的选手被抓出来了&#xff01; 题目描述 样例 #1 样例输入 #1 3样例输出 #1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1…

【机器学习】过拟合与欠拟合——如何优化模型性能

【机器学习】过拟合与欠拟合——如何优化模型性能 1. 引言 在机器学习中&#xff0c;模型的表现不仅依赖于算法的选择&#xff0c;还依赖于模型对数据的拟合情况。过拟合&#xff08;Overfitting&#xff09;和欠拟合&#xff08;Underfitting&#xff09;是模型训练过程中常…

黑马智数Day4-1

新增月卡 配置路由完成跳转 {path: /cardAdd,component: () > import(/views/car/car-card/add-card) }<el-button type"primary" click"$router.push(/cardAdd)">添加月卡</el-button> 车辆信息表单验证 <el-form :model"carInf…

自定义安装WSL和WSL迁移到指定位置

安装 WSL 到指定磁盘 配置环境 打开控制面板&#xff0c;找到程序–>右击启用或关闭Windows功能 向下滑动&#xff0c;找到“适用于Linux的Windows子系统”和“虚拟机平台”两个选项&#xff0c;勾选上&#xff0c;然后重启电脑 安装Ubuntu20.04 1. 下载发行版 打开链接…

全能通人工智能的能力评估框架-Levels of AGI: Operationalizing Progress on the Path to AGI

译自’Levels of AGI: Operationalizing Progress on the Path to AGI’&#xff0c;有所删节.笔者能力有限&#xff0c;敬请勘误。 摘要 Google DeepMind提出一种针对通用人工智能 (Artificial General Intelligence, 简称AGI) 框架&#xff0c;该框架用于评估AGI的模型及早期…

CAPL—on signal到底该怎么玩?

总结&#xff1a;一个前提&#xff0c;两种形式&#xff0c;一个注意&#xff0c;外加一个很不常用的知识点 1&#xff1a;一个前提&#xff1a;必须是DBC或其他数据库文件中定义的信号&#xff0c;且这个数据库已经添加到工程中去了。 2&#xff1a;使用格式 on signal&…

如何修改音频的音量增益

一、前言 在开发音频相关的功能&#xff08;比如说语音通话、播放音乐&#xff09;时&#xff0c;经常会遇到音量太小的问题&#xff0c;这时候就需要我们对原始数据进行处理。本文将介绍如何通过修改原始音频数据来增加增益&#xff0c;本文包含如下内容&#xff1a; 1.音频数…

3D Slicer医学图像全自动AI分割组合拳-MONAIAuto3DSeg扩展

3D Slicer医学图像全自动AI分割组合拳-MONAIAuto3DSeg扩展 1 官网下载最新3D Slicer image computing platform | 3D Slicer 版本5.7 2 安装torch依赖包&#xff1a; 2.1 进入安装目录C:\Users\wangzhenlin\AppData\Local\slicer.org\Slicer 5.7.0-2024-09-21\bin&#xff0…

PostgreSQL技术内幕12:PostgreSQL事务原理解析-锁管理

0.简介 本文介绍PG中的锁技术&#xff0c;主要包括PG中两阶段锁的介绍和PG中各种不同级别的锁&#xff0c;死锁问题介绍&#xff0c;以及如何去查看锁。 1.PG中两阶段锁 1.1 需要锁机制的原因 PG中的隔离性是通过MVCC和两阶段锁实现的&#xff0c;有了MVCC为什么还要使用悲…

python全栈学习记录(十八)re、os和sys、subprocess

re、os和sys、subprocess 文章目录 re、os和sys、subprocess一、re1.正则字符2.正则表达式的使用3.group的使用4.贪婪匹配与惰性匹配5.其他注意事项 二、os和sys1.os2.sys 三、subprocess四、打印进度条 一、re python中的re模块用来使用正则表达式&#xff0c;正则就是用一系…

基于Springboot企业员工人事管理系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

研一上课计划2024/9/23有感

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、需要认真上课的1.应用数理统计&#xff08;开卷考试&#xff09;2.最优化方法&#xff08;开卷考试&#xff09;3.跨文化交际&#xff08;主题演讲20课堂讨…

基于SpringBoot和Vue的餐饮管理系统

基于springbootvue实现的餐饮管理系统 &#xff08;源码L文ppt&#xff09;4-078 第4章 系统设计 4.1 总体功能设计 一般个人用户和管理者都需要登录才能进入餐饮管理系统&#xff0c;使用者登录时会在后台判断使用的权限类型&#xff0c;包括一般使用者和管理者,一…

手写SpringMVC(简易版)

在上一篇博客中说到这里我们要进行手写SpringMVC&#xff0c;因此最好是将上一篇博客中的SpringMVC源码分析那一块部分搞懂&#xff0c;或者观看动力节点老杜的SpringMVC源码分析再来看这里的书写框架。 首先我们要知道对于一个完整系统的参与者&#xff08;即一个完整的web项…

Spring Cloud :Hystrix实现优雅的服务容错

目录 Hystrix概述&#xff1a;第一个Hystrix程序步骤1&#xff1a;创建父工程hystrix-1步骤2&#xff1a;改造服务提供者步骤3&#xff1a;改造服务消费者为Hystrix客户端&#xff08;1&#xff09;添加Hystrix依赖&#xff08;2&#xff09;添加EnableHystrix注解&#xff08;…

共享单车轨迹数据分析:以厦门市共享单车数据为例(六)

副标题&#xff1a;.基于POI数据的站点功能混合度探究——以厦门市为例 为了保证数据时间尺度上的一致性&#xff0c;我们从互联网上下载了2020年的POI数据&#xff0c;POI数据来源于高德地图 API平台,包括名称、大小类、地理坐标等。并将高德地图 POI数据的火星坐标 系 GCJ-0…