利用OpenCV4.9制作自己的线性滤波器!

news2024/12/26 11:11:31

 返回:OpenCV系列文章目录(持续更新中......)

上一篇:OpenCV4.9使用 inRange 的阈值操作

下一篇 :OpenCV系列文章目录(持续更新中......)

目标

在本教程中,您将学习如何:

  • 使用 OpenCV 函数 filter2D()建您自己的线性过滤器。

理论

注意:

下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。

相关

从非常一般的意义上讲,关联是图像的每个部分与运算符(内核)之间的操作。

什么是内核?

内核本质上是一个固定大小的数值系数数组,以及该数组中的锚点,该锚点通常位于中心。

与内核的关联是如何工作的?

假设您想知道图像中特定位置的结果值。相关性的值按以下方式计算:

  1. 将内核锚点放在确定的像素上,内核的其余部分覆盖图像中相应的局部像素。
  2. 将核系数乘以相应的图像像素值,然后对结果求和。
  3. 将结果放置在输入图像中锚点的位置。
  4. 通过扫描整个图像上的内核,对所有像素重复该过程。

以等式的形式表示上述过程,我们将得到:

幸运的是,OpenCV 为您提供了 filter2D()函数,因此您不必编写所有这些操作。

这个程序是做什么的?

  • 加载图像
  • 执行规范化的框筛选器。例如,对于大小为 (size = 3) 的内核,内核为:

该程序将对大小为 3、5、7、9 和 11 的内核执行过滤器操作。

  • 筛选器输出(包括每个内核)将在 500 毫秒内显示

代码:

C++

教程代码如下行所示。

您也可以从这里下载

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
 
using namespace cv;
 
int main ( int argc, char** argv )
{
 // Declare variables
 Mat src, dst;
 
 Mat kernel;
 Point anchor;
 double delta;
 int ddepth;
 int kernel_size;
 const char* window_name = "filter2D Demo";
 
 const char* imageName = argc >=2 ? argv[1] : "lena.jpg";
 
 // Loads an image
 src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image
 
 if( src.empty() )
 {
 printf(" Error opening image\n");
 printf(" Program Arguments: [image_name -- default lena.jpg] \n");
 return EXIT_FAILURE;
 }
 
 // Initialize arguments for the filter
 anchor = Point( -1, -1 );
 delta = 0;
 ddepth = -1;
 
 // Loop - Will filter the image with different kernel sizes each 0.5 seconds
 int ind = 0;
 for(;;)
 {
 // Update kernel size for a normalized box filter
 kernel_size = 3 + 2*( ind%5 );
 kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);
 
 // Apply filter
 filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
 imshow( window_name, dst );
 
 char c = (char)waitKey(500);
 // Press 'ESC' to exit the program
 if( c == 27 )
 { break; }
 
 ind++;
 }
 
 return EXIT_SUCCESS;
}

解释

C++

加载图像

 const char* imageName = argc >=2 ? argv[1] : "lena.jpg";
 
 // Loads an image
 src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image
 
 if( src.empty() )
 {
 printf(" Error opening image\n");
 printf(" Program Arguments: [image_name -- default lena.jpg] \n");
 return EXIT_FAILURE;
 }

初始化参数

 // Initialize arguments for the filter
 anchor = Point( -1, -1 );
 delta = 0;
 ddepth = -1;

循环

执行无限循环,更新内核大小,并将线性滤波器应用于输入图像。让我们更详细地分析一下:

  • 首先,我们定义过滤器将使用的内核。在这里:
 // Update kernel size for a normalized box filter
 kernel_size = 3 + 2*( ind%5 );
 kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);

第一行是将kernel_size更新为以下范围内的奇数值:[3,11]。第二行实际上是通过将其值设置为填充1's 的矩阵并通过将其除以元素数对其进行归一化来构建内核的。

  • 设置完内核后,我们可以使用函数 filter2D()生成过滤器:
 // Apply filter
 filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
  • 参数表示:
    • src:源图片
    • dst:目标图像
    • ddepthdst 的深度。负值(如 \(-1\))表示深度与源相同。
    • kernel:要通过图像扫描的内核
    • anchor:锚点相对于其内核的位置。位置 Point(-1, -1) 默认表示中心。
    • delta:在关联期间要添加到每个像素的值。默认情况下,它是 \(0\)
    • BORDER_DEFAULT:我们默认允许此值(以下教程中的更多详细信息)
  • 我们的程序将实现一个 while 循环,每 500 毫秒,我们过滤器的内核大小将在指示的范围内更新。

结果

  1. 编译上面的代码后,您可以执行它,并给出图像的路径作为参数。结果应为显示被归一化滤镜模糊的图像的窗口。每 0.5 秒,内核大小就会发生变化,如下面的一系列快照所示:

参考文献:

1:《Making your own linear filters!》---- Ana Huamán


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

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

相关文章

Android JetPack Compose+Room----实现搜索记录功能

文章目录 需求概述功能展示实现搜索功能使用的技术1.Android Jetpack room2.Android JetPack Compose 代码实现编写搜索界面接入Room实现搜索功能的管理引入依赖定义包结构定义操作表的Dao类定义数据库的基础配置定义数据库的Dao管理类使用数据库升级 源码地址 需求概述 搜索功…

java:Java中的抽象类

什么是抽象类: 我们知道,类用来模拟现实的事物,一个类模拟一类事物,某个类的一个实例化对象可以模拟某个属于该类的具体事物。类中描绘了该类所有对象的共同的特性,当一个类中给出的信息足够全面时候,我们就…

算法练习|Leetcode189轮转数组 ,Leetcode56合并区间,Leetcode21合并两个有序链表,Leetcode2两数相加,sql总结

目录 一、Leetcode189轮转数组题目描述解题思路方法:切片总结 二、Leetcode56合并区间题目描述解题思路方法:总结 三、Leetcode21合并两个有序链表题目描述解题思路方法:总结 四、Leetcode2两数相加题目描述解题思路方法:总结 sql总结: 一、Leetcode189轮转数组 题目描述 给定…

【GIS教程】ArcGIS做日照分析(附练习数据下载)

我国对住宅日照标准的规定是:冬至日住宅底层日照不少于1小时或大寒日住宅层日照不少于2小时(通常以当地冬至日正午12时的太阳高度角作为依据)。因冬至日太阳高度角最低,照射范围最小,如果冬至日12:00建筑物底层能够接收到阳光,那么…

Go语言中通过数据对齐降低内存消耗和提升性能

数据对齐是一种安排数据分配方式以加速 CPU 访问内存的方法。 不了解这个概念会导致额外的内存消耗甚至性能下降。 要了解数据对齐的工作原理,让我们首先讨论没有它会发生什么。假设我们分配两个变量,一个 int32 类型的 (32 B) 和…

OJ:数字三角形(搜索)

🎁个人主页:我们的五年 🔍系列专栏:每日一练 🌷追光的人,终会万丈光芒 🌷1.问题描述: ⛳️题目描述: 示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路…

指针的使用以及运算、二级指针、造成野指针的原因以及解决方法、指针和数组相互使用

第七章,指针的学习 目录 前言 一、指针的概念 二、指针的类型 三、野指针 四、指针的运算 五、指针和数组的关系以及使用 六、指针数组 七、二级指针 总结 前言 这章主要学习的是指针方面的知识,这节只是简单了解一下指针,并不会深…

使用HTML和CSS和PHP实现一个简单的简历制作项目

实 验 目 的 掌握HTML表单作用,以及action和method属性; 掌握HTML输入域作用、类型、标签,以及name和value属性; 掌握$_REQUEST变量的作用、语法和使用; 掌握注释,以及变量的作用、命名、赋值和输出&#…

SpringBoot项目错误:找不到主类(解决办法)

清理和重新编译项目即可,在项目中点击右键Maven-Reload project,之后再重新运行就行了

MySQL、Oracle查看最大连接数和当前连接数

文章目录 1. MySQL2. Oracle 1. MySQL -- 查看最大连接数 show variables like max_connections; select max_connections; -- select * from performance_schema.session_variables where VARIABLE_NAME in (max_connections); -- select * from performance_schema.global…

SpringCloud 基础配置

1.SpringCloud配置 目前是2024了,笔者也是开始学习SpringCloud 下面是给大家总结的微服务需要的各种依赖的版本 首先我们说一个重点强调 约定 > 配置 > 编码 千万不要一把梭,上来就是干代码,千万记得配置一定得对 2.微服务工程Base构建 首先我们创建父工程 创建出来直接把…

嵌入式Linux开发

(17 封私信 / 1 条消息) 嵌入式Linux应用 - 搜索结果 - 知乎 (zhihu.com)

37. UE5 RPG创建自定义的Ability Task

在前面的文章中,我们实现了一个火球术的一些基本功能,火球术技能的释放,在技能释放后,播放释放动画,在动画播放到需要释放火球术的位置时,将触发动画通知,在动画通知中触发标签事件,…

课时100:正则表达式_基础实践_基础知识

3.1.1 基础知识 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 需求 我们之前的一些操作,很大程度上都是基于特定的关键字来进行实践的,尤其是面对一些灵活的场景,我们因为过于限定一些关键字&am…

线性代数基础2矩阵

矩阵是什么 矩阵就是二维数组,下面是一个 m 乘 n 的矩阵,它有 m 行,n 列,每行每列上面都有元素,每个元素都有行标i 和列标 j, a ij 。简称m n矩阵,记作: 注意a11的索引是 A[0,0]。…

多模态视觉语言模型:BLIP和BLIP2

1. BLIP BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation BLIP的总体结构如下所示,主要包括三部分: 单模态编码器(Image encoder/Text encoder):分别进…

论文笔记:UrbanGPT: Spatio-Temporal Large Language Models

1 intro 时空预测的目标是预测并洞察城市环境随时间和空间不断变化的动态。其目的是预见城市生活多个方面的未来模式、趋势和事件,包括交通、人口流动和犯罪率。虽然已有许多努力致力于开发神经网络技术,以准确预测时空数据,但重要的是要注意…

卷王问卷考试系统/SurveyKing调查系统源码

SurveyKing是一个功能强大的开源调查问卷和考试系统,它能够快速部署并适用于各个行业。 这个系统提供了在线表单设计、数据收集、统计和分析等功能,支持20多种题型,提供多种创建问卷的方式和设置。 项 目 地 址 : runruncode.c…

[阅读笔记16][Orca-2]Teaching Small Language Models How to Reason

接下来是Orca-2,这篇是微软在23年11月发表的论文,在Orca-1的基础上又进行了一些改进。 作者希望教会Orca-2各种推理策略,例如逐步思考、回忆然后回答、先回忆再推理再回答、直接生成回答等等策略。并且Orca-2应该能针对不同任务应该使用最合适…

安装Zipkin

官网:https://zipkin.io/pages/quickstart.html Jar包方式 下载 方式一:百度网盘下载 链接:https://pan.baidu.com/s/1PRV1RamJ8IWX32IJb7jw3Q?pwde8vu 提取码:e8vu 方式二:Central Repository: io/zipkin/zipk…