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

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 Pathstd::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_CONSTANTMat 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 Pathstd::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 Pathstd::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.mzph.cn/news/67915.shtml

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

相关文章

南方科技大学博士研究生奖助学金,深圳大学

目录 南方科技大学 中南大学 南京大学 厦门大学 苏州大学 中南财经政法大学 深圳大学 南方科技大学 https://ocean.sustech.edu.cn/ocean/public/upload/download/3/2.pdf 南方科技大学的在读研究生&#xff0c;每人每年都会得到40000元的补助&#xff0c;这40000块钱分…

Flink中RPC实现原理简介

前提知识 Akka是一套可扩展、弹性和快速的系统&#xff0c;为此Flink基于Akka实现了一套内部的RPC通信框架&#xff1b;为此先对Akka进行了解 Akka Akka是使用Scala语言编写的库&#xff0c;基于Actor模型提供一个用于构建可扩展、弹性、快速响应的系统&#xff1b;并被应用…

Servlet属性、监听者和会话

没有servlet能单独存在。在当前的现代Web应用中&#xff0c;许多组件都是在一起协作共同完成一个目标。怎么让这些组件共享信息&#xff1f;如何隐藏信息&#xff1f;怎样让信息做到线程安全&#xff1f; 1 属性和监听者 1.1 初始化 容器初始化一个servlet时&#xff0c;会为…

LeetCode--HOT100题(47)

目录 题目描述&#xff1a;105. 从前序与中序遍历序列构造二叉树&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;105. 从前序与中序遍历序列构造二叉树&#xff08;中等&#xff09; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preo…

基于Vgg-Unet模型自动驾驶场景检测

1.VGG VGG全称是Visual Geometry Group属于牛津大学科学工程系&#xff0c;其发布了一些列以VGG开头的卷积网络模型&#xff0c;可以应用在人脸识别、图像分类等方面,VGG的输入被设置为大小为224x244的RGB图像。为训练集图像上的所有图像计算平均RGB值&#xff0c;然后将该图像…

系统错误码指示确立+日志模块手动配置

1&#xff0c;系统错误码指示确立 对于前后端分离的系统设计中&#xff0c;后端建立错误码指示对于前端非常重要可以指示错误存在地方&#xff1b;以用户注册为例&#xff1b; public interface SystemCode{int SYSTEM_USER_ERROR_ADD_FAIL 10000;int SYSTEM_USER_INFO_ADD …

Miniconda3环境迁移

问题&#xff1a; conda之前安装的默认路径空间满了没法进行安装&#xff0c;为此将其进行迁移&#xff0c;但是迁移之后报错 bash: /data/anaconda3/bin/conda: /home/anaconda3/bin/python: 坏的解释器: 没有那个文件或目录解决方案&#xff1a; 1、修改~/.bashrc中的环境…

B093-springsecurity整合jwt和RSA

目录 前后端分离后springsecurity核心filter的应用场景介绍JWT令牌的组成部分JWT案例导包TestJwt RSARsaUtilsTestRSA分析图 JWTRSA导包JwtUtilsTestRSAJWT 完善spring-security整合后且不连数据库的代码案例流程分析图 前后端分离后springsecurity核心filter的应用场景介绍 账…

Java设计模式:四、行为型模式-09:模板模式

文章目录 一、定义&#xff1a;模板模式二、模拟场景&#xff1a;模板模式三、改善代码&#xff1a;模板模式3.0 引入依赖3.1 工程结构3.2 模板模式结构图3.3 爬取商品生成海报实现3.3.1 HTTP获取连接类3.3.2 定义执行顺序的抽象类3.3.3 当当爬取抽象实现类3.3.4 京东爬取抽象实…

分享2款微课录制软件,保证让你满意!

“录微课用什么软件呀&#xff0c;真的服了&#xff0c;平台自带的录屏画质太差了&#xff0c;完全看不清讲的内容&#xff0c;而且音质也不是很好&#xff0c;大家有没有微课录制的软件推荐&#xff0c;谢谢啦” 随着教育方式的转型和技术的发展&#xff0c;微课程成为了一种…

422规范详解

概述&#xff1a; 全称为EIA-TIA-422-B&#xff0c;于1994年发布。 典型电路由一个发送器和N个接收器以及一个中断匹配电阻组成。 发送器&#xff1a; 差分输出电压值在2V~10V之间。 4.1.1 发送器输出阻抗 要求A/B之间的差分阻抗≤100Ω。 4.1.2 开路特性 要求差分电压≤…

从过滤器初识责任链设计模式

下面用的过滤器都是注解方式 可以使用非注解方式,就是去web.xml配置映射关系 上面程序的执行输出是 再加一个过滤器 下面来看一段程序 输出结果 和过滤器是否非常相识 但是上面这段程序存在的问题:在编译阶段已经完全确定了调用关系,如果你想改变他们的调用顺序或者继续添加一…

时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神…

淘宝API接口:提高电商运营效率与用户体验的利器(淘宝API接口使用指南)

淘宝API接口&#xff1a;提高电商运营效率与用户体验的利器 随着电商行业的快速发展&#xff0c;淘宝作为国内最大的电商平台之一&#xff0c;不断探索和创新&#xff0c;以满足不断变化的用户需求和商家需求。其中&#xff0c;淘宝API接口便是其创新的一个重要方面。本文将深…

【代码实现】DETR原文解读及代码实现细节

1 模型总览 宏观上来说&#xff0c;DETR主要包含三部分&#xff1a;以卷积神经网络为主的骨干网&#xff08;CNN Backbone&#xff09;、以TRM(Transformer)为主的特征抽取及交互器以及以FFN为主的分类和回归头&#xff0c;如DETR中build()函数所示。DETR最出彩的地方在于&…

[羊城杯 2020] easyphp

打开题目&#xff0c;源代码 <?php$files scandir(./); foreach($files as $file) {if(is_file($file)){if ($file ! "index.php") {unlink($file);}}}if(!isset($_GET[content]) || !isset($_GET[filename])) {highlight_file(__FILE__);die();}$content $_GE…

Spring 6.0和SpringBoot 3.0新特性

目录 主要更新内容是以下几个&#xff1a; AOT编译 Spring Native GraalVM SpringBoot3生成二进制可执行文件底层流程 主要更新内容是以下几个&#xff1a; A Java 17 baselineSupport for Jakarta EE 10 with an EE 9 baselineSupport for generating native images with…

【Sentinel】核心API-Entry与Context

文章目录 一、Entry1、Entry的声明2、使用API自定义资源3、基于SentinelResource注解标记资源 二、Context1、Context介绍2、Context的初始化3、AbstractSentinelInterceptor4、ContextUtil 一、Entry 1、Entry的声明 默认情况下&#xff0c;Sentinel会将controller中的方法作…

46、TCP的“三次握手”

在上一节中&#xff0c;TCP首部常用的几个选项&#xff0c;有些选项的参数就是在通信双方在建立TCP连接的时候进行确定和协商的。所以在学习过TCP报文首部之后&#xff0c;下面我们开始学习TCP的连接建立。 TCP的一个特点是提供可靠的传输机制&#xff0c;还有一个特点就是TCP…

Spring MVC 五 - DispatcherServlet初始化过程(续)

今天的内容是SpringMVC的初始化过程&#xff0c;其实也就是DispatcherServilet的初始化过程。 Special Bean Types DispatcherServlet委托如下一些特殊的bean来处理请求、并渲染正确的返回。这些特殊的bean是Spring MVC框架管理的bean、按照Spring框架的约定处理相关请求&…