【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.hqwc.cn/news/98107.html

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

相关文章

Unity资源无法下载 反复提示需同意Terms of Service和EULA 同意后无效的解决方案

前言 最近在玩Unity&#xff0c;跟着tutorial做点项目&#xff0c;但是在下载免费资源时&#xff0c;只有从网站上点“打开Unity”&#xff0c;才能在本地Unity Editor的Package Manager里找到这个资源&#xff08;且点一下下面的刷新就没有了&#xff09;&#xff0c;并且点击…

HTML 播放器效果

效果图 实现代码 <!DOCTYPE HTML> <html><head><title>爱看动漫社区 | 首页 </title><link href"css/bootstrap.css" relstylesheet typetext/css /><!-- jQuery --><script src"js/jquery-1.11.0.min.js"…

羊城杯2023 部分wp

目录 D0nt pl4y g4m3!!!(php7.4.21源码泄露&pop链构造) Serpent(pickle反序列化&python提权) ArkNights(环境变量泄露) Ez_misc(win10sinpping_tools恢复) D0nt pl4y g4m3!!!(php7.4.21源码泄露&pop链构造) 访问/p0p.php 跳转到了游戏界面 应该是存在302跳转…

vue使用jsencrypt实现rsa前端加密

实现 RSA 加密 介绍 vue 完成 rsa 加密传输&#xff0c;jsencrypt 实现参数的前端加密 1 安装 jsencrypt npm install jsencrypt2 编写 jsencrypt.js 在 utils 文件夹中新建 jsencrypt.js 文件&#xff0c;内容如下&#xff1a;注意点&#xff1a;一般公钥都是后端生成好的&a…

爬虫逆向实战(二十八)--某税网第一步登录

一、数据接口分析 主页地址&#xff1a;某税网 1、抓包 通过抓包可以发现登录接口是factorAccountLogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看载荷模块可以发现有一个datagram 和 一个signature加密参数 请求头是否加密&#xff1f; 通过查看“标…

Apinto 网关 V0.14 版本发布,6 大插件更新!

大家好&#xff01; 距离上次更新已经过去一段时间了&#xff0c;这段日子里我们一直在酝酿新的功能&#xff0c;本次的迭代将给大家带来 6 大插件的更新~一起来看看有哪些变化吧&#xff01; 新特性 1. 新增 额外参数v2 插件&#xff0c;支持对转发参数进行加密、拼接等操作…

串行协议——USB驱动[基础]

多年前的学习记录&#xff0c;整理整理。 一、USB协议基础 二、Linux内核USB驱动源码分析 USB中不同类型设备使用的 设备描述符(设备类\设备子类\设备协议) 配置不同,典型的以下几种:1)HID设备: Human Input Device人工输入设备, 如鼠标\键盘\游戏手柄等.2)CDC设备: Communi…

02-系统篇-内存分布

一.进程中的内存分布 进程是应用程序运行的单位&#xff0c;进程在内存中运行时&#xff0c;各个部分分布的情况如图。 1.栈内存(statck) 特点:后进先出 系统一般会对栈的大小进行限制&#xff0c;可以用命令进行查看&#xff0c;如下&#xff0c;700是进程号&#xff0c;栈被…

CentOS7上源码安装Redis6

CentOS7上源码安装Redis6 安装依赖开始安装下载安装包解压安装包编译源代码修改配置文件 启动并连接启动redis服务器本地连接远程连接 下篇预告 安装依赖 首先我们是源码包安装我们需要安装C语言编译器&#xff0c;顺便下载wget&#xff1a; yum install -y gcc wget开始安装…

Git 基本原理和常用操作

Git Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源的版本控制软件。 Git 常用操作 git 提交流程&#xff1a;工作区 -> git add 到暂存区 -> gi…

静态路由——实现两个不相连的网段通信实验

路漫漫其修远兮&#xff0c;吾将上下而求索 今天做一个简单的实现两个不相连的网段通信实验&#xff0c;本实验使用静态路由配置&#xff0c;主要 加强初学者对静态路由的理解。 实际中不可能只使用静态路由&#xff0c;还要使用诸多的其他网络协议&#xff0c;达到安全可靠的…