《什么是卷积卷积有什么用.docx》由会员分享,可在线阅读,更多相关《什么是卷积卷积有什么用.docx(9页珍藏版)》请在第一文库网上搜索。
1、什么是卷积卷积有什么用1 .卷积的定义:在泛函分析中,卷积、旋积或摺积(英语:COnVoIUtion)是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。简单定义:卷积是分析数学中一种重要的运算。设:F(X),g(*)是R1上的两个可积函数,作积分:Jf()g(x-)d可以证明,关于几乎所有的实数X;上述积分是存在的。这样,随着X的不同取值,这个积分就定义了一个新函数力包,称为函数/与g的卷积,记为h(x)=(f*g)(x).容易验证,(f*g)(x)=(g*f)(x),并且&*力仞仍为可积函数。这就是说,把卷积代替乘法,11(R
2、1)空间是一个代数,甚至是巴拿赫代数。卷积与傅里叶变换有着密切的关系。利用一点性质,即两函数的傅里叶变换的乘积等于它们卷积后的傅里叶变换,能使傅里叶分析中许多问题的处理得到简化。由卷积得到的函数共一般要比F和g都光滑。特别当g为具有紧致集的光滑函数,f为局部可积时,它们的卷积f*g也是光滑函数。利用这一性质,对于任意的可积函数K都可以简单地构造出一列逼近于F的光滑函数列fsi这种方法称为函数的光滑化或正则化。卷积的概念还可以推广到数列、测度以及广义函数上去。卷积是两个变量在某范围内相乘后求和的结果。如果卷积的变量是序列x(n)和h(n),则卷积的结果8y(n)=Zxih(n-z)=x(n)*h
3、(n)口I其中星号*表示卷积。当时序n=0时,序列h(-i)是h(i)的时序i取反的结果;时序取反使得h(i)以纵轴为中心翻转180度,所以这种相乘后求和的计算法称为卷积和,简称卷积。另外,n是使hQi)位移的量,不同的n对应不同的卷积结果。如果卷积的变量是函数x(t)和h(t),则卷积的计算变为(/)=fx(p)h(t-p)dp=h(t)J-)其中P是积分变量,积分也是求和,t是使函数h(-p)位移的量,星号*表示卷积。2 .卷积在工程和数学上都有很多应用:统计学中,加权的滑动平均是一种卷积。概率论中,两个统计独立变量X与丫的和的概率密度函数是X与丫的概率密度函数的卷积。声学中,回声可以用源
4、声与一个反映各种反射效应的函数的卷积表示。电子工程与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得。物理学中,任何一个线性系统(符合叠加原理)都存在卷积。介绍一个实际的概率学应用例子。假设需求到位时间的到达率为PoiSSOn(入)分布,需求的大小的分布函数为D(.),则单位时间的需求量的分布函数为F(x):F(x)=Dax)ekkA=I其中D(k)(x)为k阶卷积。卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。Cast1man的书对卷积讲得很详细。高斯变换就是用高斯函数对图像进行卷积。高斯算子可以直接从离散高斯函数得到
5、:for(i=0;iN;i+)for(j=0;jN;j+)gi*N+j=exp(-(i-(N-1)2)2+(j-(N-1)2)2)(2*de1ta2);sum+=gi*N+j;)再除以sum得到归一化算子N是滤波器的大小,de1ta自选首先,在提到卷积之前,必须提到卷积出现的背景。卷积是在信号与线性系统的基础上或背景中出现的,脱离这个背景单独谈卷积是没有任何意义的,除了那个所谓褶反公式上的数学意义和积分(或求和,离散情况下)。信号与线性系统,讨论的就是信号经过一个线性系统以后发生的变化(就是输入输出和所经过的所谓系统,这三者之间的数学关系)。所谓线性系统的含义,就是,这个所谓的系统,带来的输出
6、信号与输入信号的数学关系式之间是线性的运算关系。因此,实际上,都是要根据我们需要待处理的信号形式,来设计所谓的系统传递函数,那么这个系统的传递函数和输入信号,在数学上的形式就是所谓的卷积关系。卷积关系最重要的一种情况,就是在信号与线性系统或数字信号处理中的卷积定理。利用该定理,可以将时间域或空间域中的卷积运算等价为频率域的相乘运算,从而利用FFT等快速算法,实现有效的计算,节省运算代价。C+语言代码:1234567891O1112131415161718voidconvo1ution(f1oat*input1,f1oat*input2,f1oat*output,intmm,intnn)f1oa
7、t*xx=newf1oatmm+nn-1;/doconvo1utionfor(inti=O;imm+nn-1;i+)(xxi=O.O;for(intj=O;jO&i-jnn)xxi+=input1j*input2i-j;)/setva1uetotheoutputarrayfor(inti=O;imm;i+)outputi=xxi+(nn-1)/2;de1etexx;)3 .卷积在图像处理上的应用在图像处理中,卷积操作指的是使用一个卷积核对图像中的每个像素进行一系列操作。卷积核(算子)是用来做图像处理时的矩阵,图像处理时也称为掩膜,是与原图像做运算的参数。卷积核通常是一个四方形的网格结构(例如3
8、*3的矩阵或像素区域),该区域上每个方格都有一个权重值。使用卷积进行计算时,需要将卷积核的中心放置在要计算的像素上,一次计算核中每个元素和其覆盖的图像像素值的乘积并求和,得到的结构就是该位置的新像素值。以下两个算子中演示了具体的卷积计算过程。定义:g=/8%g(i,)=2f(i+J+1)h(k,1)即kJ,其中h称为相关核(Kerne1).步骤:1)滑动核,使其中心位于输入图像g的(i,j)像素上2)利用上式求和,得到输出图像的(i,j)像素值3)充分上面操纵,直到求出输出图像的所有像素值【例】原始像素矩阵为:卷积模板h为:计算输出图像的(2,4)元素=1*8+8*1+15*6+7*3+14*
9、5+16*7+13*4+20*9+22*2=585如图所示:WhIeSofrre1ationkerne1Imagepbce1va1uesCenterofkerne1定义:g=f*h,(j)=/(k,j-I)Mk,1)=Ef(k,1)h(i-k,j-I)步骤:-1)-2)-3)-4)将核围绕中心旋转180度滑动核,使其中心位于输入图像g的(i,j)像素上利用上式求和,得到输出图像的(Kj)像素值充分上面操纵,直到求出输出图像的所有像素值例:计算输出图像的(2,4)元素=1*2+8*9+15*4+7*7+14*5+16*3+13*6+20*1+22*8=575如图所示:Va1uesofrotate
10、dvo1utbnkerne11724I2B915423577G1/461?20,22810121921311182S29Imagepixe1va1ues.Centerofkerne1四、边缘效应当对图像边缘的进行滤波时,核的一部分会位于图像边缘外面。W1iatva1ies1ioutitheseOubdeMxekhave?Ceaterofkerse1常用的策略包括:-1)使用常数填充:imfi1ter默认用0填充,这会造成处理后的图像边缘是黑色的。-2)复制边缘像素:T3=imfi1ter(I,h,rep1icate*);ThesepDte1va1uesorerepIkatec1fromboun
11、daryPixek1)低通滤波器(常用于计算模糊后的效果)2)高斯滤波器(常用于计算高斯模糊后的效果)高斯模糊的卷积核也是一个正方形的滤波核,其中每个元素通过以下公式计算得出:(G(Cm=2+2y22该公式中。是标准方差(一般取值为1),X和y分别对应了当前位置到卷积核中心的整数距离。通过这个公式,就可以计算出高斯核中每个位置对应的值。为了保证流波后的图像不会变暗,需要对高斯核中的权重进行归一化。3)边缘检测(常用于计算图像边缘或者说梯度值)我们将对下面这张图进行模糊处理:以下为computeshader中关于卷积处理的代码:numthreads(32,32,1)voidDimMain(uin
12、t3id:SVDiSpatchThreadID)f1oatsumR=0;f1oatsumG=0;f1oatsumB=0;f1oatsumA=0;for(inti=-1;i=1;i+)for(intj=-1;j=1;j+)sumR+=texBuffer(id.x+i)*texWidthO+(id.y+j).r*conVo1utionTempBuffer(i+1)*3+(j+1);sumG+=texBuffer(id.x+i)*texWidthO+(id.y+j).g*conVo1utionTempBuffer(i+1)*3+(j1);sumB+=texBuffer(id.x+i)*texWidt
13、hO+(id.y+j).b*conVo1utionTempBuffer(i+1)*3+(j+1);sumA+=texBuffer(id.x+i)*texWidthO+(id.y+j).a*conVo1utionTempBuffer(i+1)*3+(j1);)texBufferid.x*texWidth0+id.y.r=sumR;texBufferid.x*texWidth0+id.y.g=sumG;texBufferid.x*texWidthO+id.y.b=sumB;texBufferid.x*texWidthO+id.y.a=sumA;Resu1tid.xy=f1oat4(sumR,sum
14、G,sumB,sumA);)效果如图所示:图中可以明显的看到左右两边有明显的黑色线条,原图中是没有这样的黑色的,产生这种效果的原因是本文中之前提到过的边缘效应。下面我将修改一部分代码去除边缘效应带来的影响,这里使用的是相邻像素的值方法。代码如下:numthreads(32,32,1)voidDimMain(uint3id:SVDiSpatchThreadID)f1oatsumR=O;f1oatsumG=0;f1oatsumB=0;f1oatsumA=0;for(inti=-1;i=1;i+)(for(intj=-1:jtexWidth0*texWidth0-1)(sumR+=texBuffer(id.x+i)*texWidthO+(id.y+j)-texWidthO.r*Convo1utionTempBuffer(i+1)*3+(j+1);sumG+=texBuffer(id.x+i)*texWidthO+(id.y+j)-texWidthO.g*convo1utionTempBuffer(i+1)*3+(j+1);sumB+=texBuffer(id.x+i)*texWidthO