什么是卷积

2023-11-19

什么是卷积

卷积(convolution),是一种运算,你可以类比于加,减,乘,除,矩阵的点乘与叉乘等等,它有自己的运算规则,卷积的符号是星号*。表达式为:

连续的为
( f ∗ g ) ( n ) = ∫ − ∞ ∞ f ( x ) g ( n − x ) d x (f*g)(n) = \int_{-\infty}^{\infty}f(x)g(n-x)dx (fg)(n)=f(x)g(nx)dx
离散的为
( f ∗ g ) ( n ) = ∑ x = − ∞ ∞ f ( x ) g ( n − x ) (f*g)(n) = \sum_{x=-{\infty}}^{\infty}f(x)g(n-x) (fg)(n)=x=f(x)g(nx)
从参数上来看,x + (n-x) = n,可以类比为x + y = n,也就是说f, g的参数满足规律y = -x + n,即g的参数是f的参数先翻转再平移n。把g从右边褶到左边去,也就是卷积的的由来。然后在这个位置对两个函数的对应点相乘,然后相加,这个过程是卷积的的过程。

因此卷积的过程可以理解为:翻转,滑动,叠加。其中翻转指的是g,滑动指的是n值在不断改变。最终将他们相乘相加。

卷积的意义

任何一个公式都有它的现实意义,都需要解决实际问题,通常可以把f看成主要部分,g看成系数部分或者权重部分。而它们相乘就意味着在特定的n下,可以求出x的取值范围,进而可以算出(f*g)(n)的值。

举个例子,一个人每天在不同的时刻都有进食,同时也会时刻在消化食物,进食曲线为f,而胃里剩下的食物的比例为g,即在6点吃了食物100克,这块食物在8点时还剩4/5,在10点时还剩1/2,每一次进食都会对应一条衰减曲线,那么求在14点时胃里还剩多少食物。

我们需要计算出14点之前的每一次进食在14点时刻还剩多少,然后相加即可。我们知道0点进食的衰减了14小时,而14点进食的没有衰减,可以描述如下:

在这里插入图片描述

因为进食是离散的,所以结果就等于

f(0)*g(14) + f(1)*g(13) + ... f(14) * g(0)

看起来是拧巴着,如果将g函数沿着Y轴翻转一下。

在这里插入图片描述

看起来还是很奇怪,如果将g向右平移14呢

在这里插入图片描述

14只是个特例,要求某一个时刻的值就平移多少。14就是(f*g)(n)中的n,所以每一个n都会得到一个结果。

可见f的曲线是固定的,而g的曲线随着n的变化会移动,往往我们只会求在特定的n下的卷积值。如果波形图在x轴不是连续的,那还要分段来计算。

图像处理

我们对图像的blur操作,即降噪平滑操作,就是使用的卷积运算,最终的效果取决于卷积核的设置。以单通道卷积为例。

均值卷积核,就是认为目标像素点的值是周围值的平均数,即周围各点对它的影响是一样的,此处卷积核以3X3为例。
[ 1 9   1 9   1 9   1 9   1 9   1 9   1 9   1 9   1 9   ] \begin{bmatrix} \frac 1 9\ & \frac 1 9\ & \frac 1 9\ \\ \frac 1 9\ & \frac 1 9\ & \frac 1 9\ \\ \frac 1 9\ & \frac 1 9\ & \frac 1 9\ \end{bmatrix} 91 91 91 91 91 91 91 91 91 
高斯滤波认为各个像素点距离核中心的距离不一样,导致颜色的贡献程度不一样,因此给不同的点不同的权重。

取图像中的部分像素点
[ f ( 0 , 0 ) f ( 0 , 1 ) f ( 0 , 2 ) f ( 0 , 3 ) f ( 1 , 0 ) f ( 1 , 1 ) f ( 1 , 2 ) f ( 1 , 3 ) f ( 2 , 0 ) f ( 2 , 1 ) f ( 2 , 2 ) f ( 2 , 3 ) f ( 3 , 0 ) f ( 3 , 1 ) f ( 3 , 2 ) f ( 3 , 3 ) ] \begin{bmatrix} f(0,0) & f(0,1) & f(0,2) & f(0,3) \\ f(1,0) & f(1,1) & f(1,2) & f(1,3) \\ f(2,0) & f(2,1) & f(2,2) & f(2,3) \\ f(3,0) & f(3,1) & f(3,2) & f(3,3) \\ \end{bmatrix} f(0,0)f(1,0)f(2,0)f(3,0)f(0,1)f(1,1)f(2,1)f(3,1)f(0,2)f(1,2)f(2,2)f(3,2)f(0,3)f(1,3)f(2,3)f(3,3)
我们把这个矩阵看成f(x,y)函数,下标为参数,像素点的值为函数结果,那么要求f(1,1)处的卷积运算结果,因为现在是二维函数了,因此对应的卷积表达式为:
( f ∗ g ) ( u , v ) = ∑ f ( x , y ) g ( u − x , v − y ) (f*g)(u, v) = \sum f(x, y)g(u-x, v-y) (fg)(u,v)=f(x,y)g(ux,vy)
对应到本例u=1, v=1
( f ∗ g ) ( 1 , 1 ) = ∑ f ( x , y ) g ( 1 − x , 1 − y ) (f*g)(1, 1) = \sum f(x, y)g(1-x, 1-y) (fg)(1,1)=f(x,y)g(1x,1y)
我们来构建g(1-x, 1-y)函数,暂定为3X3的矩阵,我们知道目标点f(1,1)要对应g(0,0),如果将g(0,0)设置在核的中心,那么根据下标展开之后我们就可以构建出g
[ g ( − 1 , − 1 ) g ( − 1 , 0 ) g ( − 1 , 1 ) g ( 0 , − 1 ) g ( 0 , 0 ) g ( 0 , 1 ) g ( 1 , − 1 ) g ( 1 , 0 ) g ( 1 , 1 ) ] \begin{bmatrix} g(-1,-1) & g(-1,0) & g(-1,1) \\ g(0,-1) & g(0,0) & g(0,1) \\ g(1,-1) & g(1,0) & g(1,1) \\ \end{bmatrix} g(1,1)g(0,1)g(1,1)g(1,0)g(0,0)g(1,0)g(1,1)g(0,1)g(1,1)
有了g函数之后,就可以执行运算了,注意运算的时候 f 和 g 的参数要符合卷积公式,即
f 0 , 0 ) ∗ g ( 1 , 1 ) + f ( 0 , 1 ) ∗ g ( 1 , 0 ) + . . . f0,0)*g(1,1) + f(0,1)*g(1,0) + ... f0,0)g(1,1)+f(0,1)g(1,0)+...
其实这样就够了,但是便于理解和说明,我们将矩阵先沿着X轴翻转,再沿Y轴翻转,中心点在 g(0,0) 处,得到
[ g ( 1 , 1 ) g ( 1 , 0 ) g ( 1 , − 1 ) g ( 0 , 1 ) g ( 0 , 0 ) g ( 0 , − 1 ) g ( − 1 , 1 ) g ( − 1 , 0 ) g ( − 1 , − 1 ) ] \begin{bmatrix} g(1,1) & g(1,0) & g(1,-1) \\ g(0,1) & g(0,0) & g(0,-1) \\ g(-1,1) & g(-1,0) & g(-1,-1) \\ \end{bmatrix} g(1,1)g(0,1)g(1,1)g(1,0)g(0,0)g(1,0)g(1,1)g(0,1)g(1,1)

虽然翻转了,但是运算公式没有变化,只是从观察上更好一一对应,也更方便计算。
f 0 , 0 ) ∗ g ( 1 , 1 ) + f ( 0 , 1 ) ∗ g ( 1 , 0 ) + . . . f0,0)*g(1,1) + f(0,1)*g(1,0) + ... f0,0)g(1,1)+f(0,1)g(1,0)+...

注意,我们常说的将卷积核盖在目标像素点上面,将对应的像素点相乘相加,然而这种运算应该叫互相关运算(cross-correlation),也就是说,我们通过将g进行翻转,使得卷积运算变成了互相关运算,将翻转之后的矩阵称为卷积核,并且大家在设计卷积核的时候就是参照互相关运算来的,而不会去关心真正的卷积运算。因此在实际应用中我们直接去构建这个最终的矩阵即可。

剩下的就是计算了,将结果赋值给f(1,1),然后向右平移一格,达到边界后向下平移一格继续从左边开始卷积。你会发现整个过程中最外一层无法被算到,没关系,将原图像向外扩大一圈像素点并设置为0(因为它们本身就不存在,因此对中心像素点没有贡献)。

通过设置不同的卷积核来达到不同的结果,这是机器视觉的基础操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是卷积 的相关文章

随机推荐

  • 树莓派的杂七杂八

    一 交叉编译jpeg 9a 生成的库为libjpeg so 先从官网下载交叉编译器 直接解压到本地 将bin目录加入到系统变量中后 进入目录执行 configure CC arm none linux gnueabi gcc enable
  • 如何在 Flink 1.9 中使用 Hive?

    Flink on Hive 介绍 SQL 是大数据领域中的重要应用场景 为了完善 Flink 的生态 发掘 Flink 在批处理方面的潜力 我们决定增强 FlinkSQL 的功能 从而让用户能够通过 Flink 完成更多的任务 Hive 是
  • 字符串 有效的字母异位词

    LC 有效的字母异位词 给定两个字符串 s 和 t 编写一个函数来判断 t 是否是 s 的字母异位词 注意 若 s 和 t 中每个字符出现的次数都相同 则称 s 和 t 互为字母异位词 func isAnagram s String t S
  • 华为云云耀云服务器L实例评测|使用Docker部署Leanote笔记工具

    华为云云耀云服务器L实例评测 使用Docker部署Leanote笔记工具 一 前言 1 1 云耀云服务器L实例介绍 1 2 Leanote简介 二 本次实践介绍 2 1 本次实践简介 2 2 本次环境规划 三 购买云耀云服务器L实例 3 1
  • Vue2基本知识

    记录Vue2基本知识 从引入vue js文件开始 然后提出问题 1 我们使用vue后怎样将外部数据传递给我们的DOM对象 2 DOM对象中的数据如果改变 如何通知外部数据改变 最后对问题分析得出答案 完整记录vue2中基础指令知识 提供完整
  • 一文教你在 centos7 下安装 Oracle19 C(完整版)

    前言 安装 Oracle 一直是本人工作以来想要做的事情 但是一直都没有安装成功 本人有一个习惯 所有的软件基本上都安装在centos系统下 这样 一方面是 在日常工作中 都是linux环境 另一方面 装在linux虚拟中 万一哪天你想退出
  • 04-7_Qt 5.9 C++开发指南_QTreeWidget和QDockWidget

    文章目录 1 实例功能简述 2 源码 2 1 可视化UI设计 2 2 mainwindow h 2 3 mainwindow cpp 1 实例功能简述 本节介绍 QTreeWidget QDockWidget 的使用 以及用 QLabel
  • osg漫游器

    在三维中常见的就是漫游整个场景 所谓漫游就是 观察者的视线从一个位置移动到另外一个位置或者在希望的方向上移动 在OSG中漫游可以通过改变观察者 相机 的位置和姿态来实现 三维世界中的模型的相对位置和形态不会发生变化 只是观察者的角度和位置发
  • c++学习笔记-指定二维vector大小

    在对二维vector如 vector lt
  • 阅读笔记篇卷首语

    2023年8月31日 周四晚上 我决定开设这个专栏 因为我知道有些文章可以改变人生 值得去细读
  • 【unity3D】创建TextMeshPro(TMP)中文字体(解决输入中文乱码问题)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于游戏开发的学习笔记 本篇是unity的TMP中文输入显示乱码的解决方式 创建 TextMeshPro 中文字体 遇到的问题描述 解决方式 Font Asset Creator 面板扩展
  • linux基本命令大全

    基本命令 关机 shutdown h halt init 0 poweroff 重启 shutdown r reboot init 6 pwd 查看工作目录 ls 查看指定目录的内容 l 列表显示 a 显示所有 包括隐藏文件 h 人性化的显
  • 【QT学习笔记】QAction和QToolButton的使用

    QAction可以在QT Creator中Action Editor中创建 QAction创建之后的两个使用方式 放到tool bar中 跟QToolButton绑定 ui gt tBtnListIni gt setDefaultActio
  • 虚拟服务器如何传东西,虚拟服务器如何传东西

    虚拟服务器如何传东西 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 计费项包括存储费和流量费 存储费根据存储库的不同进行
  • Reinforcement Learning 强化学习(四)

    Task03 本次学习主要参照Datawhale开源学习及强化学习蘑菇书Easy RL 第4章 策略梯度 Policy Gradient 4 1 策略梯度算法 在强化学习中有 3 个组成部分 演员 actor 环境 environment
  • odoo tree form 视图禁止创建、修改、删除、复制

  • 用标准C语言初始化线性表,c语言实现线性表的初始化,创建,查找,删除

    1 第一步定义线性表结构 typedef struct ElementType data MaxSize int length Lineartable 2 第二步线性表初始化 初始化线性表 Lineartable INITAL Linear
  • Go 每日一库之 gjson

    快速使用 先安装 go get github com tidwall gjson 后使用 package main import fmt github com tidwall gjson func main json name first
  • Hackinglab(鹰眼)——解密关

    目录 1 以管理员身份登录系统 2 邂逅对门的妹纸 3 万恶的Cisco 4 万恶的加密 5 喜欢泡网吧的小明 6 异常数据 7 md5真的能碰撞嘛 8 小明爱上了一个搞硬件的小姑凉 9 有签名限制的读取任意文件 10 美丽的邂逅与密码器的
  • 什么是卷积

    什么是卷积 卷积 convolution 是一种运算 你可以类比于加 减 乘 除 矩阵的点乘与叉乘等等 它有自己的运算规则 卷积的符号是星号 表达式为 连续的为 f g