【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块钱分…

DP读书:鲲鹏处理器 架构与编程(十二)鲲鹏软件实战案例Docker+KVM的部署

10min速通了解鲲鹏软件实战案例 云服务器源码移植与编译配置云服务器Porting Advisor代码移植搭建交叉编译环境x86云服务器交叉编译 OpenSSL鲲鹏云服务器上编译 OpenSSL Docker的安装与应用安装DockerDocker运行与验证Docker常用命令卸载Docker安装适配鲲鹏架构的Docker镜像 KV…

C语言模拟最简单的计算机

C语言模拟最简单的计算机 以下内容参考南大“计算机系统基础”实验&#xff1a;不停计算的机器 概述 如下面的伪代码所示&#xff0c;计算机运行程序的过程为取指令–>运行指令–>更新PC的值。 while (1) {从PC指示的存储器位置取出指令;执行指令;更新PC; }取指(inst…

Flink中RPC实现原理简介

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

3 | Java Spark 配置和 数据筛选

下面将演示如何使用 Apache Spark 的 Java API 来加载数据、筛选出偶数,并计算它们的总和。Apache Spark 是一个强大的分布式计算框架,适用于大规模数据处理任务。 创建 Maven 项目 首先,我们需要创建一个 Maven 项目,以便管理依赖项。在项目的 pom.xml 文件中添加以下 S…

feign调用失败 feign.RetryableException: xxx-service executing GET http://xxx/test

一。 问题引入 升级springcloud的版本后 突然发现 以前正常的feign调用也报错了 升级后的各组件版本如下 spring cloud 2021.0.5 spring cloud alibaba 2021.0.5.0 spring boot 2.6.13 错误日志如下 feign.RetryableException: xxx-service executing GET http://xxx-servic…

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的应用场景介绍 账…

15 验证差分时钟输入转单端

供给FPGA的时钟有单端时钟&#xff0c;也有差分时钟&#xff0c;当输入是差分时钟时&#xff0c;需要将差分时钟转换为单端时钟输出来作为FPGA的系统工作时钟。 本次使用锁相环来实现差分到单端时钟的转换。 FPGA代码实现如下&#xff1a; TOP层 timescale 1ns / 1ps // // …

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;微课程成为了一种…

【面试经典150题】跳跃游戏

题目链接 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 1 < nums…

422规范详解

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

Ansible 常用命令50条

以下是 Ansible 常用的 50 条命令&#xff1a; ansible --version: 查看 Ansible 版本信息。ansible all -m ping: 检查所有主机的连通性。ansible-playbook playbook.yml: 运行指定的 Ansible Playbook 文件。ansible-doc module_name: 查看指定模块的帮助文档。ansible-conf…

Hadoop服务脚本

#!/bin/bash process("NameNode" "SecondaryNameNode" "DataNode" "NodeManager" "ResourceManager") JAVA_HOME"/opt/software/jdk1.8.0_371" HADOOP_HOME"/opt/software/hadoop-3.3.6"# 定义颜色的AN…

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

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