【OpenCV C++20 学习笔记】自定义线性滤波-filter2D

news2024/11/15 14:05:40

自定义线性滤波

  • 原理
    • 相关
    • 卷积核
    • 线性滤波操作
  • API
  • 实例

原理

相关

线性滤波的是指就是相关,即计算图像中的每个部分和卷积核(kernel)的相关结果。

卷积核

卷积核本质上是一个固定大小的系数数组,数组中的某个元素被作为锚点(一般是数组的中心),如下图:
卷积核

线性滤波操作

上面讲了线性滤波的实质就是计算相关,相关计算的具体步骤如下:

  1. 将卷积核的锚点放在某个目标像素上,卷积核的其他部分就会覆盖目标像素的邻近像素;
  2. 将卷积核上的系数与被覆盖的像素的值相乘,然后将积加总;
  3. 将加总的和赋予目标像素
  4. 对图像上的所有像素都应用以上步骤,直到每个像素都被当作目标像素进行了计算。

用数学公式来表示以上步骤:
H ( x , y ) = ∑ i = 0 M i − 1 ∑ j = 0 M j − 1 I ( x + i − a i , y + j − a j ) K ( i , j ) H(x,y)=\displaystyle \sum_{i=0}^{M_i-1} \displaystyle \sum_{j=0}^{M_j-1} I(x+i-a_i, y+j-a_j)K(i, j) H(x,y)=i=0Mi1j=0Mj1I(x+iai,y+jaj)K(i,j)

  • H ( x , y ) H(x,y) H(x,y)为图像第x行、第y列像素,即目标像素,的计算结果;
  • K ( i , j ) K(i,j) K(i,j)为卷积核第i行,第j列的系数;
  • M i , M j M_i, M_j Mi,Mj分别为卷积核的总行数和总列数;
  • a i , a j a_i, a_j ai,aj分别为卷积核中锚点的行数和列数;
  • I ( x + i − a i , y + j − a j ) I(x+i-a_i, y+j-a_j) I(x+iai,y+jaj)为目标像素的邻近像素。

虽然公式看上去有点复杂,但是好在OpenCV给我们提供了一个便利的API来实现线性滤波的算法。

API

在OpenCV中可以用filter2D()函数来实现线性滤波操作。其函数原型如下:

void cv::filter2D(InputArray	src,
				OutputArray		dst,
				int				ddepth,
				InputArray		kernel,
				Point			anchor = Point(-1, -1),
				double			delta = 0,
				int				borderType = BORDER_DEFAULT)
  • src:输入图片
  • dst:输出图片,与输入图片有相同的尺寸和颜色通道数
  • ddepth:输出的数据格式,-1表示与原图保持同样的数据格式
  • kernel:卷积核数组
  • anchor:锚点坐标,默认为(-1, -1),即卷积核的中心
  • delta:可选的偏移值
  • borderType:图片边缘的扩充方式(由于卷积核的锚点无法覆盖图像边缘的像素,所以必须以某种方法扩充原图,使得锚点能够覆盖原有的边缘),默认为镜像扩充

实例

这里使用各种尺寸的归一化滤波作为例子。一个3*3的归一化滤波卷积核如下:
K = 1 3 ⋅ 3 [ 1 1 1 1 1 1 1 1 1 ] K=\frac{1}{3 \cdot 3} \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} K=331 111111111

使用著名的lena图片作为例子。
为了能够展示不同尺寸的卷积核带来的归一化滤波效果,这里使用了一个循环来进行迭代。在循环体内将卷积核的尺寸依次循环地设置为55, 77, 99, 1111, 13*13。具体代码如下:

#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;

int main() {
	Mat src{ imread("lena.jpg") };

	Point anchor{ Point(-1, -1) };	//锚点为卷积核中心
	double delta{ 0 };				//偏移值为0
	int ddepth{ -1 };				//输出数据类型与原图一致

	int ind{ 0 }, kernel_size;
	Mat kernel, dst;
	for (;;) {
		kernel_size = 3 + 2 * (ind % 5);	//卷积核的尺寸为5,7,9,11,13,不断循环
		kernel = Mat::ones(kernel_size, kernel_size, CV_32F)
			/ static_cast<float>(kernel_size * kernel_size);	//创建归一化滤波的卷积核

		//自定义滤波操作
		filter2D(src,
			dst,
			ddepth,
			kernel,
			anchor,
			delta,
			BORDER_DEFAULT);

		//显示结果图片
		imshow("filter2D", dst);
		char c = static_cast<char>(waitKey(500));
		if (c == 27)	//按ESC则退出
			break;

		ind++;
	}
}

效果如下:

  1. 5*5的归一化滤波结果
    5*5归一化滤波结果
  2. 7*7归一化滤波结果
    7*7归一化滤波结果
  3. 9*9归一化滤波结果
    9*9归一化滤波结果
  4. 11*11归一化滤波结果
    11*11归一化滤波结果
  5. 13*13归一化滤波结果
    13*13归一化滤波结果
    可以看到卷积核越大,滤波后的图片越模糊。

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

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

相关文章

C++之从C过渡(上)

C之从C过渡 前言 暂时告别C语言&#xff0c;我们走进C。对于有C语言基础&#xff0c;初学C的我们来说&#xff0c;在正式学习C的主体内容之前&#xff0c;我们需要先有一个过渡&#xff0c;本文中会总结过渡需要了解的零散知识&#xff0c;主要是语法。 正文 C的第一个程序 …

终于用PC串口显示出esp32 串口输出hello world

硬件&#xff1a; esp32模块 rs232 转ttl 3.3v 电平转换器 3.3v 外接电源 esp32 tx 脚接转换器rx, rx脚接转换器tx esp32 使用uart2 现在就可以用pc作为上位机通过串口控制esp32&#xff0c;用pc串口调试软件作为esp的输出监控器显示esp的各种运算结果。 #include &qu…

使用visual studio2019创建dll导出自定义类

系列文章目录 文章目录 系列文章目录前言一、具体操作步骤1.创建动态链接库工程(DLL)2.头文件声明3.实现文件定义4.生成dll工程5 使用dll总结 前言 程序对动态链接库dll、静态链接库lib想必都很熟悉了&#xff0c;网上也有很多的相关介绍。但网上介绍的一般都是C语言函数介绍&…

javascript 的奇技巧淫二

文章目录 1 、标记模板文字2、使用 Object.entries() 和 Object.fromEntries()3、用于唯一元素的 Set 对象4、对象中的动态属性名称5、使用 bind() 进行函数柯里化6、使用 Array.from() 从类似数组的对象创建数组7、可迭代对象的 for…of 循环8、使用 Promise.all() 实现并发 P…

SpringBoot下载resources目录下的文件

1.引入SpringBoot和hutool依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.22</version></dependency>2.在项目resources目录下放入模版文件&#xff0c;结构如下&#xff1a…

JavaScript基础(30)_事件的冒泡、事件的委派

事件的冒泡(Bubble) 所谓的冒泡指的是事件的向上传导&#xff0c;当后代元素上的事件被触发时&#xff0c;其祖先元素的“相同事件”也会被触发。 取消事件冒泡 在开发中大部分情况冒泡都是有用的&#xff0c;如果不希望发生事件冒泡可以通过事件对象来取消冒泡。取消冒泡代码…

数字货币走势分析两点最关键,比特币BTC竞猜策略共享

目前虚拟货币市场成为各界关注的焦点&#xff0c;比特币的未来也会随着相关的决策和政策而产生变化&#xff0c;多位专家是看好这个市场的潜力的。如果比特币随后可以得到更多开采和推广的话&#xff0c;全球加密货币领域的高度还会提升。目前各方对于比特币和加密货币咨询和了…

OpenAI降低人们的期望值 今年秋季的DevDay不会公布GPT-5

去年&#xff0c;OpenAI 在旧金山举行了一场声势浩大的新闻发布会&#xff0c;会上该公司发布了一系列新产品和工具&#xff0c;其中包括类似 App Store 的GPT 商店。不过&#xff0c;今年的活动将更加低调。本周一&#xff0c;OpenAI 表示它将改变 DevDay 大会的形式&#xff…

使用visual studio code远程连接虚拟机

1. 安装Remote-SSH插件 打开vscode&#xff0c;在“扩展商店”中搜索“Remote-SSH”&#xff0c;然后点击“安装”即可&#xff0c;如图所示。 2. 配置SSH 如图所示&#xff0c;点击“远程资源管理器”&#xff0c;点击“新建远程”&#xff0c;然后在输入框中输入如下指令。…

革新出行体验:音频定位导航系统引领智能导航新时代

在科技日新月异的今天&#xff0c;出行方式正经历着前所未有的变革。从传统的纸质地图到GPS视觉导航&#xff0c;再到如今日益兴起的音频定位导航系统&#xff0c;每一次进步都极大地提升了人们的出行便捷性与安全性。音频定位导航系统&#xff0c;作为智能导航领域的创新之作&…

css仿el-tabs标签页效果

需求&#xff1a;el-tabs很多时候需要改间距或者下划线上还要加组件什么的比较麻烦&#xff0c;手写一个自己根据需求更改即可 1.效果 2.主要代码详解 主要代码如下&#xff1a;active是下划线&#xff0c;activeitem是选中后改变字体颜色&#xff0c; item- (index 1),用ite…

用.net core简易搭建webapi托管到IIS

1、从官网下载.NET Core 托管捆绑包 https://learn.microsoft.com/zh-cn/aspnet/core/tutorials/publish-to-iis?viewaspnetcore-8.0&tabsvisual-studio 2、新建ASP.NET Core WEB API项目 新建控制器TestController并生成GetInfo方法 3、发布 目标路径选择 2)显示所有…

花小钱、办大事的巴黎奥运会,能学点啥?|易搭云

“获得奥运会举办权的竞争几乎和体育赛事本身一样激烈。”众所周知&#xff0c;奥运会不仅能带来巨大的经济效益&#xff0c;更是国家实力和文化底蕴的彰显。时隔百年&#xff0c;奥运会的主会场又回到了巴黎&#xff0c;以浪漫著称的巴黎&#xff0c;奥运会突出的关键词却变成…

使用Cisco进行模拟RIP路由协议配置

实验四 RIP路由协议配置 文章目录 实验四 RIP路由协议配置1.实验目的2.实验流程3.RIPv1实验步骤4.RIPv2实验步骤 1.实验目的 1&#xff09;理解RIP路由的原理 2&#xff09;掌握RIP路由的配置方法 2.实验流程 开始→布置拓扑→配置IP地址→配置并验证RIPv1→配置并验证RIPv2…

SQL-锁

一.锁的介绍 锁是计算机协调多个进程或线程并发访问一资源的机制。在数据中,除传统的计算资源(CPU,RAM,I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因…

[io]进程间通信 -信号概念、分类、工作原理

概念、工作原理&#xff1a; 信号是一种异步通信机制&#xff0c;用于在不同进程之间传递事件信息 信号的产生&#xff1a;包括对前台进程用户输入&#xff08;CtrlC&#xff09;、系统状态变化硬件异常&#xff08;如内存访问错误&#xff09;、终端系统调用&#xff08;kil…

【JVM基础13】——垃圾回收-详细聊一下G1垃圾回收器

目录 1- 引言&#xff1a;G1垃圾回收器2- ⭐核心&#xff1a;详解 G1 垃圾回收器2-1 概述G1垃圾回收器2-2 新生代垃圾回收 Young Collection第一次新生代垃圾回收第二次新生代垃圾回收 2-3 并发标记阶段 Young Collection Concurrent Mark2-4 Mixed Collection&#xff08;混合…

中影国际影城使用的多联机空调集中管理系统

多联机空调集中管理系统 建筑能耗约占我国经济总能耗的30&#xff05;&#xff0c;而空调能耗占据建筑物总能耗的50%-70%&#xff0c;即中央空调的能耗约占国民经济能耗的两成。多联机集中控制管理系统&#xff0c;在节能降耗方面具有杰出的性能。 项目案例&#xff1a;中影国…

安卓控件RecyclerVieW

文章目录 导入依赖简单使用实现横向滚动瀑布式 RecyclerView是官方在5.0之后新添加的控件&#xff0c;推出用来替代ListView和GridView的列表控件。为了保证RecyclerView在所有Android系统版本上都能使用。Google将RecyclerView控件定义在了AndroidX中&#xff0c;只需要在项目…

三品PLM项目管理系统与CAD集成的实施指南

随着信息化技术的飞速发展&#xff0c;PLM产品生命周期管理系统与CAD三维计算机辅助设计软件的集成已成为企业研发创新的关键。本文将探讨PLM与三维CAD集成的重要性、实施要素、策略以及实际应用案例&#xff0c;为企业信息化建设提供参考。 PLM与三维CAD集成&#xff1a;信息化…