【OpenCV实战】4.OpenCV 五种滤波使用实战(均值、盒状、中值、高斯、双边)

news2024/11/24 2:19:56

OpenCV 五种滤波使用实战(均值、盒状、中值、高斯、双边)

  • 〇、Coding实战内容
  • 一、滤波、核和卷积
    • 1.1 滤波
    • 1.2 核 & 滤波器
    • 1.3 公式
    • 1.4 例子
  • 二、图片边界填充实战
    • 2.1 解决问题
    • 2.2 相关OpenCV函数
    • 2.3 Code
  • 三. 均值滤波实战
    • 3.1 理论
    • 3.2 Blur
    • 3.3 Code
  • 四. 盒状滤波实战
    • 4.1 理论
    • 4.2 实战:实现Sobel 滤波器
  • 五、中值滤波实战
    • 5.1 Concept
    • 5.2 Code
  • 六、高斯滤波实战
    • 6.1 Concept
    • 6.2 Code
  • 七、双边滤波实战
    • 7.1 Concept
    • 7.2 Code

〇、Coding实战内容

  1. 滤波、核和卷积
  2. 图片边界填充实战
  3. 均值滤波使用实战
  4. Box滤波使用实战
  5. 中值滤波使用实战
  6. 高斯滤波使用实战
  7. 双边滤波使用实战

一、滤波、核和卷积

1.1 滤波

一、公式:图片A => 滤波 => 图片B

二、通俗概念:
1. 一张图片,经过滤波的过程,处理成了另外一种图片。
2. 在图像上的每个位置利用邻域信息更新其本身的信息

三、应用场景:
1.图像增强:去噪,锐化,模糊
2.提取信息:纹理,边缘检测等

1.2 核 & 滤波器

一、滤波器:绿波过程中使用的算法即:滤波器
滤波器即由一副图像I(x,y) 根据像素点x, y附近的区域计算得到一副新图像I’(x,y)的算法。

二、核:Color(x,y) => Array[w,h] - 核 => Color’(x,y)

在这里插入图片描述

说明:

  1. 核是一个多维数组
  2. 有宽和高属性,宽等于高则为BoxFilter
  3. A,和B的区别为B做了归一化,如果不做归一化,则滤波后的颜色值会溢出

1.3 公式

在这里插入图片描述

对于任何一个形状的盒,取其(i, j)的值K(i, j)并与原始图像中相对于像素点(x, y)偏移(i, j) 的值I(x+i, y+j)进行点乘。最后求和就可以得到原始I(x, y) 经过滤波后的新值I’(x, y)

1.4 例子

在这里插入图片描述在这里插入图片描述

(0 * 1/9 + 0 * 1/9 + 0 * 1/9 + 0 * 1/9 + 0 * 1/9 + 0 * 1/9 + 0 * 1/9 + 90 * 1/9 + 90 * 1/9) = 20

二、图片边界填充实战

2.1 解决问题

  1. 原始图[w+p , h+q]经过滤波器[2p+1, 2q+1] 得到的新图[w, h]
  2. 因此如果要使输出的图和原始图保障一样的Size,则需要在原始图上添加虚拟像素

2.2 相关OpenCV函数

/** 
The function copies the source image into the middle of the destination image. The areas to the
left, to the right, above and below the copied source image will be filled with extrapolated
pixels. This is not what filtering functions based on it do (they extrapolate pixels on-fly), but
what other more complex functions, including your own, may do to simplify image boundary handling.
*/
CV_EXPORTS_W void copyMakeBorder(InputArray src, OutputArray dst,
                                 int top, int bottom, int left, int right,
                                 int borderType, const Scalar& value = Scalar() );
                     
//常用BorderTypes                                 
enum BorderTypes {
    BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some `i`
    BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
    BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`
    BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`
};

2.3 Code

int main(int argc, char *argv[])
{
      // root Path
    std::string filePath = std::string(__FILE__);
    size_t pos = filePath.find_last_of("/\\");
    std::string rootPath = filePath.substr(0, pos); // string path = string(__BASE_FILE__)+"/img.webp";
    cout << rootPath;
    Mat image = imread(rootPath+"/img.webp",IMREAD_COLOR);
    
 
    //填黑边, BORDER_CONSTANT
    Mat borderImageBlack;
    copyMakeBorder(image,borderImageBlack,200,200,200,200,BORDER_CONSTANT,Scalar(0,0,0));


    Mat borderReplicate;
    copyMakeBorder(image,borderReplicate,200,200,200,200,BORDER_REPLICATE);


    Mat borderReflect;
    copyMakeBorder(image,borderReflect,400,400,400,400,BORDER_REFLECT);

    Mat borderWrap;
    copyMakeBorder(image,borderWrap,200,200,200,200,BORDER_WRAP);

}

BORDER_CONSTANT在这里插入图片描述在这里插入图片描述在这里插入图片描述

三. 均值滤波实战

3.1 理论

在这里插入图片描述

3.2 Blur

可以使用OpenCV中的blur()方法来实现

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

参数说明:

  1. src原图像
  2. dst目标图像
  3. ksize:核的size大小
  4. anchor:核中心点位置,默认-1,-1在核的最中心,一版都用默认值
  5. borderType:边界填充类型,用默认值即可

3.3 Code

int main(int argc, char *argv[])
{
      // root Path
    std::string filePath = std::string(__FILE__);
    size_t pos = filePath.find_last_of("/\\");
    std::string rootPath = filePath.substr(0, pos); // string path = string(__BASE_FILE__)+"/img.webp";
    cout << rootPath;
    Mat image = imread(rootPath+"/img_1.jpeg",IMREAD_COLOR);
    
    Mat blurImg;
    blur(image,blurImg,Size(5,5));
    
 	namedWindow("originImg");    
    imshow("originImg", image); 
    waitKey(0);             
    destroyWindow("originImg");  

 	namedWindow("blurImg");    
    imshow("blurImg", blurImg); 
    waitKey(0);             
    destroyWindow("blurImg");  
    return 0;

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

说明:

  1. 均值滤波即对该图像周边的像素计算均值,用于模糊图片
  2. 上面显示了原图,33,55,7*7的均值滤波。

四. 盒状滤波实战

4.1 理论

  1. 均值滤波要求盒的均值加起来为1
  2. 盒装滤波则没有该要求。

4.2 实战:实现Sobel 滤波器

在这里插入图片描述

int main(int argc, char *argv[])
{
      // root Path
    std::string filePath = std::string(__FILE__);
    size_t pos = filePath.find_last_of("/\\");
    std::string rootPath = filePath.substr(0, pos); // string path = string(__BASE_FILE__)+"/img.webp";
    cout << rootPath;
    
    Mat dstImage;
    //
    Mat sobel(3,3,CV_32S);
    sobel.at<int>(0,0) = 1;
    sobel.at<int>(0,1) = 0; 
    sobel.at<int>(0,2) = -1;

    sobel.at<int>(1,0) = 2;
    sobel.at<int>(1,1) = 0;
    sobel.at<int>(1,2) = -2;

    sobel.at<int>(2,0) = 1; 
    sobel.at<int>(2,1) = 0;
    sobel.at<int>(2,2) = -1;
    
    Mat sobel_horizion(3,3,CV_32S);
    sobel_horizion.at<int>(0,0) = 1;
    sobel_horizion.at<int>(0,1) = 2; 
    sobel_horizion.at<int>(0,2) = 1;

    sobel_horizion.at<int>(1,0) = 0;
    sobel_horizion.at<int>(1,1) = 0;
    sobel_horizion.at<int>(1,2) = 0;

    sobel_horizion.at<int>(2,0) = -1; 
    sobel_horizion.at<int>(2,1) = -2;
    sobel_horizion.at<int>(2,2) = -1;

    filter2D(image,dstImage,CV_8UC3,sobel);
    namedWindow("sobel");    // 创建一个标题为 "hello" 的窗口
    imshow("sobel", dstImage); // 在窗口 "hello" 中显示图片
    waitKey(0);              // 等待用户按下键盘
    destroyWindow("sobel");  // 销毁窗口 "hello"
    return 0;
}

在这里插入图片描述在这里插入图片描述

五、中值滤波实战

5.1 Concept

适用于去噪声,该滤波器选取核对应的图像中的终值

原图
在这里插入图片描述

5.2 Code

    Mat mediaImage;
    medianBlur(image,mediaImage,3);

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

以上分别为核是33,55,77,99的中值滤波器的效果

六、高斯滤波实战

6.1 Concept

思路:离(x,y)越远的像素,和(x,y)的相关性越低

/** @brief Blurs an image using a Gaussian filter.

The function convolves the source image with the specified Gaussian kernel. In-place filtering is
supported.

@param src input image; 

@param dst output image of the same size and type as src.

@param ksize Gaussian kernel size. ksize.width and ksize.height can differ but they both must be
positive and odd. 

@param sigmaX Gaussian kernel standard deviation in X direction.

@param sigmaY Gaussian kernel standard deviation in Y direction; if 
 */
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

在这里插入图片描述

6.2 Code


    Mat gauss;
    GaussianBlur(image,gauss,Size(7,7),2,1.5);

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

七、双边滤波实战

7.1 Concept

CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );

高斯滤波:

  1. 在做模糊处理的时候,会把明显的边界也模糊掉,双边滤波不会
  2. 减缓像素在空间上的变化。


双边滤波:

  1. 边缘保持平滑
  2. 对每个像素及其领域内的像素进行加权平均。
  3. 不是基于其他滤波器的空间距离,而是基于色彩强度进行计算平滑。即sigmaColor参数。
  4. 主要三个参数:
    d: 领域直径距离,设为-1,会根据sigmaColor进行自动计算
    sigmaColor:与高斯滤波器类似。指越大,平滑的色彩强度也越大。
    sigmaSpace:坐标空间的滤波器的sigma指

7.2 Code

    Mat bilateral;
    bilateralFilter(image,bilateral,-1,100,11);

在这里插入图片描述

没开出来处理前后显著的差异,可能选图不是很符合吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/960157.html

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

相关文章

集成跨境电商ERP(积加、易仓、马帮等)连接多个应用

场景描述&#xff1a; 基于跨境电商开放平台&#xff08;积加、易仓、马帮等&#xff09;能力&#xff0c;无代码集成跨境电商ERP与多个应用互通互连。通过Aboter可搭建业务自动化流程&#xff0c;实现多个应用之间的数据连接。 连接器&#xff1a; 积加ERP马帮ERP易仓ERP……

Visual Studio Code 终端配置使用 MySQL

Visual Studio Code 终端配置使用 MySQL 找到 MySQL 的 bin 目录 在导航栏中搜索–》服务 找到MySQL–>双击 在终端切换上面找到的bin目录下输入指令 终端为Git Bash 输入命令 ./mysql -u root -p 接着输入密码&#xff0c;成功在终端使用 MySQL 数据库。

【LLM】快速开始 LangChain

theme: orange LangChain是一个软件开发工具包&#xff0c;它通过将组件链接在一起并公开简单统一的API&#xff0c;简化了大型语言模型和应用程序的集成。本篇文章将会简要介绍&#xff0c;让各位开发者对其有一个整体的认识。 前言 如果你是一名软件开发人员&#xff0c;努力…

chatGPT讲师AIGC讲师叶梓:大模型这么火,我们在使用时应该关注些什么?-5

以下为叶老师讲义分享&#xff1a; P20-P24 顺便看看某大模型觉得“两头蛇”长啥样&#xff1f; “羊驼-2”的神逻辑 欣赏一下GPT-4给出的满分答案 提示工程的模式 1、说明模式下&#xff0c;您为 ChatGPT 输入内容来解释或阐明一个概念或理论。 它的主要功能是定义各种概念。…

设计封面有诀窍,这5个实用软件让你快人一步

每位作者和出版商都梦想着为他们的作品设计一个引人注目的封面。这样一来&#xff0c;潜在的读者才会被吸引&#xff0c;愿意拿起这本书来阅读&#xff0c;从而提高书籍的销售量。这正是封面设计软件发挥作用的地方。专业的封面设计软件能够添加前沿的效果&#xff0c;以呈现书…

使用代理服务器和pip安装软件包

在开着代理服务器的情况下&#xff0c;直接pip install 软件包名会出现如下错误&#xff0c; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by SSLError(SSLZeroReturnError(6, TLS/SSL connection has been…

【Cadence】Calculator计算sp的3dB带宽

【Cadence】Calculator计算sp的3dB带宽 1.计算最大增益2.cross函数3. 3dB带宽 下面演示如何在Cadence计算s参数&#xff08;如增益&#xff09;的3dB带宽 1.计算最大增益 ymax函数 2.cross函数 cross函数可以计算经过y轴给定值对应的x坐标 edge number选择1是经过的第一个点…

B081-Lucene+ElasticSearch

目录 认识全文检索概念lucene原理全文检索的特点常见的全文检索方案 Lucene创建索引导包分析图代码 搜索索引分析图代码 ElasticSearch认识ElasticSearchES与Kibana的安装及使用说明ES相关概念理解和简单增删改查ES查询DSL查询DSL过滤 分词器IK分词器安装测试分词器 文档映射(字…

火热报名中 | 网安朝阳·西门子白帽黑客大赛燃爆来袭

2022年 首届西门子白帽黑客大赛 集结全国网安精英 以热爱之名 引爆整个夏天 2023年 网安朝阳西门子白帽黑客大赛—— 国际精英挑战赛 再度重磅归来 网安骑士的荣耀角斗场 等你来战 赛宁网安持续为第二届赛事 提供全程服务支持 热血战役 即将打响 报名通道现已开启…

风险评估

风险评估概念 风险评估是一种系统性的方法&#xff0c;用于识别、评估和量化潜在的风险和威胁&#xff0c;以便组织或个人能够采取适当的措施来管理和减轻这些风险。 风险评估的目的 风险评估要素关系 技术评估和管理评估 风险评估分析原理 风险评估服务 风险评估实施流程

SQLAlchemy 封装的工具类,数据库pgsql(数据库连接池)

1.SQLAlchemy是什么&#xff1f; SQLAlchemy 是 Python 著名的 ORM 工具包。通过 ORM&#xff0c;开发者可以用面向对象的方式来操作数据库&#xff0c;不再需要编写 SQL 语句。 SQLAlchemy 支持多种数据库&#xff0c;除 sqlite 外&#xff0c;其它数据库需要安装第三方驱动。…

专访远航汽车远勤山:踏踏实实做好产品 直面挑战乘风远航

8月25日&#xff0c;第二十六届成都国际汽车展览会在中国西部国际博览城隆重开幕。车展举办期间&#xff0c;远航汽车董事长远勤山先生、产品研发总监王震先生向媒体分享了远航汽车品牌发展、产品研发、技术创新以及市场布局等内容。 “通过我们的付出和努力&#xff0c;让我们…

景芯SoC 芯片全流程培训

【全网唯一】景芯SoC是一款用于芯片全流程培训的低功耗ISP图像处理SoC&#xff0c;采用低功耗RISC-V处理器&#xff0c;内置ITCM SRAM、DTCM SRAM&#xff0c;集成包括MIPI、ISP、CNN、QSPI、UART、I2C、GPIO、百兆以太网等IP&#xff0c;采用SMIC40工艺设计流片。 培训数据包括…

云计算在智能制造中的应用与前景

文章目录 云计算的基本概念智能制造的基本概念云计算在智能制造中的应用1. 数据存储和管理2. 大数据分析3. 机器学习和预测维护4. 跨地理分布的协作5. 资源弹性和成本优化 未来前景1. 智能工厂2. 预测性维护3. 定制化生产4. 绿色生产5. 全球制造协作 结论 &#x1f389;欢迎来到…

QTday3(QT实现文件对话框保存操作、实现键盘触发事件【WASD控制小球的移动】)

1.实现文件对话框保存操作 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_fontBtn_clicked() {//调用QFo…

Java的23种设计模式

Java的23种设计模式 一、创建型设计模式1.单例模式 singleton1.1.静态属性单例模式1.2 静态属性变种1.3 基础的懒汉模式1.4 线程安全的懒加载单例1.5 线程安全的懒加载 单例-改进1.6 双重检查锁1.7 静态内部类1.8 枚举单例1.9 注册表单例 2.工厂方法模式 factory3.抽象工厂模式…

Error:Java:无效的源发行版:14

问题描述&#xff1a;项目拉下来&#xff0c;跑的时候发现版本有问题。这个问题可好解决了&#xff0c;只需要看下面几个方面&#xff0c;然后让他们保持一致就OK了 step1&#xff1a;查看本地的jdk版本 打开cmd窗口&#xff0c;输入命令 java -version就可以查看到本地的jdk版…

dji uav建图导航系列(三)模拟建图、导航

前面博文【dji uav建图导航系列()建图】、【dji uav建图导航系列()导航】 使用真实无人机和挂载的激光雷达完成建图、导航的任务。 当需要验证某一个slam算法时,我们通常使用模拟环境进行测试,这里使用stageros进行模拟测试,实际就是通过模拟器,虚拟一个带有传感器(如…

如何一键批量查询全部物流信息?

在日常工作中&#xff0c;快递物流信息的查询是一项常规任务。然而&#xff0c;这个过程往往既耗时又费力&#xff0c;尤其是在面对大量单号的情况下。为了解决这个问题&#xff0c;我们推荐使用固乔快递查询助手&#xff0c;一款能够快速、准确地查询快递物流信息的软件。 首先…

【线程池】如何判断线程池中的任务执行完毕(三)

目录 前言 1. isTerminated()方法 2. awaitTermination()方法 3.getTaskCount()方法和executor.getCompletedTaskCount()方法结合使用 4.使用CountDownlatch类 前言 通常我们使用线程池的时候&#xff0c;系统处于运行的状态&#xff0c;而线程池本身就是主要为了线程复用&…