opencv#28 图像卷积

图像卷积

图像卷积是图像处理中最为基础的操作之一,其常用在图像的边缘检测,图像的去噪声以及图像压缩等领域。

图像卷积主要步骤:


Step1:将卷积模板旋转180°。

Step2:卷积模板移动到对应位置。

Step3:模板内求和,保存求和结果。

Step4:滑动卷积模板,处理所有结果。

  卷积函数在这里称卷积模板卷积模板通常是一个方形的卷积,同时也是一个奇数的卷积,卷积模板通常使用的是一个中心对称的形式。

  例如上图,在将模板旋转180°时,需要确定一个旋转中心,也就是我们卷积模板的中心,围绕这个中心旋转180°得到的结果便是我们需要进行卷积操作的结果。由于,我们常用的卷积模板是一个中心对称的模板,所以我们常看到在进行卷积时,无需进行180°的操作, 但是,我们要清楚,卷积首先重要的第一步是对模板进行旋转,否则,当我们使用非中心对称模板的时候,那么我们再对卷积模板进行旋转之后,得到的结果与原结果不一致,此时进行卷积旋转和不旋转的结果时不同的,之后将我们的模板移动到需要进行卷积图像或矩阵的对应位置,例如上图,我们将模板移动到像素值为7的中心区域上,我们将卷积模板完整覆盖在此区域上,第三步,将模板覆盖的区域与模板求和,首先是对应位置求乘积 ,也就是1*1+2*2+3*1....依次相乘再相加,得到的结果便是我们卷积之后的结果,将此结果替换掉原先待卷积矩阵中,这样得到的结果便是我们卷积之后的矩阵的结果。之后将卷积模板移动到下一位,也就是将中心位置覆盖在像素值为8的区域,继续对应位置相乘再相加得到的结果为96,这个96就替换掉原先图像中的8,依次运行下去,每一步都进行替换。   这里可以发现,在移动的时候,我们的中心像素只能覆盖我们原先像素的中心位置,其边缘位置是没有办法进行处理的,如上图,我们卷积后的结果只有中心3*3的像素进行了改变,而其他周围的像素是没有进行改变的,我们知道,对于图像来说,最边缘的一行和一列像素对图像整体的信息表达没有太多的作用,但是有的时候我们依然想得到一个边缘经过处理的结果,因此,我们将原图像边缘进行扩充一行一列像素,那么此时再进行卷积运算时,我们的卷积模板中心就可以覆盖在我们原图像中最边缘区域上,这样,我们可以在边缘上依次移动,得到结果,这里面对于边缘填充有很多种方法,例如,可以用全是0来填充,也可以复制最边缘的值进行填充。当我们的卷积模板为5*5的形式,那么我们对于边缘扩充就要两行两列,这样才能保证最边缘的图像能够被我的卷积模板中心所覆盖。

  可以发现,进行卷积后,像素值变得很大,扩大了很多倍数,若像素值是0~255之间,当中心像素为25时,可能计算结果就会超过最大值,那么就会影响卷积结果,因此在卷积操作的时候,我们还需要进行归一化的操作,就是将卷积模板进行归一化,将模板中每一个数除以模板中所有系数之和得到归一化后的结果,这样得到的结果就可以保证不会经过卷积后数值不会越界。

图像卷积函数

filter2D()

void cv::filter2D(InputArray   src,OutputArray  dst,int          ddepth,InputArray   kemel,Point        anchor = Point(-1,-1),double       deta = 0,int          borderType = BORDER_DEFAULT)

·src:输入图像。

·dst:输出图像,与输入图像具有相同的尺寸和通道数。(经过卷积后的图像,由于卷积运算可能会出现小数,因此输入和输出图像的数据类型可能会不同)

·ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。(例如输入图像是8U形式,那么输出图像就可包含8U,但是若输入的是一个32F的形式,那么输出图像中就不可能包含8U形式,因为经过处理后得到的结果精度一定比没有经过处理的精度高。)

·kernel:卷积核(卷积模板),CV_32FC1(浮点类型单通道矩阵)类型的矩阵(通常矩阵形式是一个奇数的正方形矩阵)。

·anchor:内核的基准点(锚点),默认值(-1,-1)代表内核基准点位于kernel的中心位置。

·delta:偏值,在计算结果中加上偏值(默认情况下此值为0,也就是卷积后的结果是没有进行偏移的)。

·borderType:像素外推法选择标志(也就是对图像进行外围扩充的形式)。

在了解上函数后,发现并没有进行卷积模板的旋转,因此我们需要人在进行卷积函数时,人为旋转180°。

示例
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv; //opencv的命名空间
using namespace std;//主函数
int main()
{//待卷积矩阵uchar points[25] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 };Mat img(5, 5, CV_8UC1, points);//卷积模板(需要32FC1形式,所以要设置为float)Mat kernel = (Mat_<float>(3, 3) << 1, 2, 1,2, 0, 2,1, 2, 1);Mat kernel_norm = kernel / 12;//卷积模板归一化Mat result, result_norm; //未归一化的卷积结果和归一化的卷积结果filter2D(img, result, CV_32F, kernel, Point(-1, -1), 2, BORDER_CONSTANT);filter2D(img, result_norm, CV_32F, kernel_norm, Point(-1, -1), 2, BORDER_CONSTANT);cout << "result" << endl << result << endl;//图像卷积Mat lena = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png");if (lena.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}Mat lena_filter;filter2D(lena, lena_filter, -1, kernel_norm, Point(-1, -1), 2, BORDER_CONSTANT);imshow("lena_filter", lena_filter);waitKey(0);//等待函数用于显示图像return 0;}

运行程序后,发现图像卷积最大的作用是可以对图像进行模糊,模糊的作用可以减小噪声,同时也可以增加后续处理的精度,这里面虽然进行了边缘扩充,但是对于整个图像来说并没有影响我们观看图像所能获得的信息。

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

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

相关文章

MySQL 8.3 发布,具体有哪些新增和删减?

MySQL 8.3 主要更新&#xff1a;用于标记事务分组的 GTID、JSON EXPLAIN 格式增强、一些功能删除等。 MySQL 是一款广泛使用的开源的关系型数据库管理系统&#xff0c;已推出其最新版本 MySQL 8.3。它带来了新功能和一些删除&#xff0c;有望简化数据库操作。让我们来看看有哪些…

R语言简介

1.R语言 R语言是一种数学编程语言&#xff0c;主要用于统计分析、绘图和数据挖掘。 2.R语言特点 免费、开源&#xff0c;兼容性好&#xff08;Windows、MacOS或Linux)。具有多种数据类型&#xff0c;如向量、矩阵、因子、数据集等常用数据结构。多用于交互式数据分析&#x…

FOR XML PATH 函数与同一分组下的字符串拼接

FOR XML PATH 简单介绍 FOR XML PATH 语句是将查询结果集以XML形式展现&#xff0c;通常情况下最常见的用法就是将多行的结果&#xff0c;拼接展示在同一行。 首先新建一张测试表并插入数据&#xff1a; CREATE TABLE #Test (Name varchar(70),Hobby varchar(70) );insert #T…

#GPU|LLM|AIGC#集成显卡与独立显卡|显卡在深度学习中的选择与LLM GPU推荐

区别 核心区别&#xff1a;显存&#xff0c;也被称作帧缓存。独立显卡拥有独立显存&#xff0c;而集成显卡通常是没有的&#xff0c;需要占用部分主内存来达到缓存的目的 集成显卡&#xff1a; 是集成在主板上的&#xff0c;与主处理器共享系统内存。 一般会在很多轻便薄型的…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(16)-Fiddler如何充当第三者,再识AutoResponder标签-上篇

1.简介 Fiddler充当第三者&#xff0c;主要是通过AutoResponder标签在客户端和服务端之间&#xff0c;Fiddler抓包&#xff0c;然后改包&#xff0c;最后发送。AutoResponder这个功能可以算的上是Fiddler最实用的功能&#xff0c;可以让我们修改服务器端返回的数据&#xff0c…

【Web前端开发基础】CSS的结构伪类选择器、伪元素、浮动

CSS的浮动 目录 CSS的浮动一、学习目标二、文章内容2.1 结构伪类选择器2.2 伪元素2.3 标准流2.4 浮动2.5 清除浮动2.6 拓展&#xff08;BFC&#xff09; 三、综合案例3.1 小米模块案例3.2 网页导航案例 一、学习目标 能够使用结构伪类选择器在HTML中选元素能够说出标准流元素的…

Operation

contents 服务器一、相关概念1.1 云服务器与实例1.2 关于域名解析延时与80端口1.3 关于备案1.4 关于SSL证书1.5 关于SSL证书的签发1.6 关于SSL证书的部署1.7 关于LNMP和LAMP1.8 关于bt面板 二、单服务器单一级域名多网站2.1 创建多个二级域名2.2 解析二级域名绑定到服务器上2.3…

GPT科研应用与AI绘图及论文高效写作

详情点击链接&#xff1a;GPT科研应用与AI绘图及论文高效写作 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己…

Debezium发布历史83

原文地址&#xff1a; https://debezium.io/blog/2020/02/19/debezium-camel-integration/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 和 Apache Camel 的集成场景 二月 19, 2020 作者&#xff1a…

【漏洞复现】Hikvision综合安防管理平台report文件上传漏洞

Nx01 产品简介 Hikvision&#xff08;海康威视&#xff09;是一家在中国颇具影响力的安防公司&#xff0c;其网络摄像头产品在市场上占据了相当大的份额。综合安防管理平台基于“统一软件技术架构”理念设计&#xff0c;采用业务组件化技术&#xff0c;满足平台在业务上的弹性扩…

联邦学习:密码学 + 机器学习 + 分布式 实现隐私计算,破解医学界数据孤岛的长期难题

联邦学习&#xff1a;密码学 机器学习 分布式 提出背景&#xff1a;数据不出本地&#xff0c;又能合力干大事联邦学习的问题联邦学习架构 分布式机器学习&#xff1a;解决大数据量处理的问题横向联邦学习&#xff1a;解决跨多个数据源学习的问题纵向联邦学习&#xff1a;解决…

基于XG24-EK2703A的BLE HID蓝牙键盘+鼠标复合设备功能开发(BLE+HID+FreeRTOS+Gecko SDK)

目录 项目介绍硬件介绍项目设计开发环境及工程参考总体流程图硬件基本配置应用初始化按键中断回调定时器回调按键响应任务蓝牙事件回调BLE HIDReport Map及报文键盘设备鼠标设备复合设备 发送字符串上/下滚动 功能展示项目总结 &#x1f449; 【Funpack3-1】基于XG24-EK2703A的…