人工智能卷积算法
[[id_[id_162[id_33985758]13213]8482[id_[id_355042710]09681045]558[id_10[id_18[id_809017763]777411]438117]d_1631251231]id_1977794724]
卷积运算是一种常见的数学处理方式,跟加法、乘法等运算方式相似,都是通过两个输入得到一个输出结果。但是,卷积运算的特点在于它的输入是两个信号,而输出会生成一个新的信号。这种数学方法除了在信号处理领域有广泛应用外,还经常出现在概率论以及数理统计等许多其他学科中。[id_813855[id_2047231044]3]
数字信号处理与卷积运算
卷积运算符号一般用*来表示,故表达式为:
y=x*h
x是输入的量,h代表脉冲反应,y是产生的结果。卷积经常用来处理信号的相关操作。
[id_522250339]
[id_1667843430]
数字信号处理诸多场合下,输入数据包含成百上千乃至数百万个采样值。而脉冲响应数据则短得多,通常仅含几个或几百个采样值。尽管卷积运算对数据长度无特殊要求,但明确信号尺寸仍很必要。
输入信号x的采样点数量为N开yun体育官网入口登录app,编号范围从0到N-1,冲激响应信号h的采样点数量为M,编号范围从0到M-1,那么输出信号y的采样点数量是N与M之和再减去1
[id_1365116941]
卷积计算示意图
边缘卷积计算与0填充
在计算y0或y11等信号边界位置的卷积时开元ky888棋牌官网版,会出现一些困难情况。比如算y0时,要把h0和x0对齐,这时候会发现,h3、h2、h1对应的采样点应该是x(-1)、x(-2)、x(-3),但这些点实际上并不存在。同样地,算y11时,也会遇到不存在的x9、x10、x11这类情况。
对于以上所描述的卷积计算过程,我们可以通过下列代码实现:
import numpy as np
def MyConvolve(input,kernel):
#对h[n]进行180度翻转
kernel_flipped=np.array([kernel[len(kernel)-1-i] for i in range(len(kernel))])
这个等式表明,将内核数组反向排列,同样能够实现翻转效果
len_input=len(input) #x[n]的长度
len_kernel=len(kernel) #h[n]的长度
#对输入数组进行0填充来解决卷积计算过程中的边缘对齐
padding=np.zeros(len_kernel-1,dtype='int') #填充数值为0
temp_pad=np.append(padding,input)
input_pad=np.append(temp_pad,padding) #0填充后的数据
建立一个列表来存放卷积后的数据,这个列表的规模是:x[n]序列的项数加上h[n]序列的项数再减去一个单位
con_array=np.array(range(len_input+len_kernel-1))
#对x[n]与h[n]进行卷积计算
for m in range(len(con_array)):
sum_con=0
for n in range(len(kernel_flipped)):
sum_con=sum_con+input_pad[n+m]*kernel_flipped[n]
con_array[m]=sum_con
#输出卷积结果
print('Input Signal:',input)
print("Convolution Kernel:",kernel)
print('Convolution:',con_array)
if __name__=='__main__':
input=[1,3,5,7,9,11,13]
kernel=[2,3,6,8]
MyConvolve(input,kernel)
结果展示:
Input Signal: [1, 3, 5, 7, 9, 11, 13]
Convolution Kernel: [2, 3, 6, 8]
Convolution: [ 2 9 25 55 93 131 169 177 166 104]
NumPy卷积函数
NumPy库同样提供了卷积功能,其对应的方法为convolve,调用形式是numpy.convolve(a,v,mode='full').
a`:输入一维数组开yun体育app入口登录,长度为N.
v:输入的第二个一位数组,长度为M。
mode:有三个参数(full,valid,same)
全为初始设定,针对每个检测点执行卷积运算,输出数组的规模是N加M减一。在卷积的边界区域,该信号不发生重叠,因而显现边界现象
有效情况下,输出列表的元素数量等于较大集合与较小集合的元素数量之差再加一。这种情况下,得到的是完全重合的部分,不包括边界上的点,所以不会产生边界现象
同样地,返回数组的长度是M和N中的最大值,边界效应仍然存在
NumPy卷积函数示例代码:
import numpy as np
a=[1,3,5,7,9,11,13]
b=[2,4,6,8]
c1=np.convolve(a,b,mode='full')
print("full卷积计算",c1)
c2=np.convolve(a,b,mode='same')
print('same计算',c2)
c3=np.convolve(a,b,mode='valid')
print('valid计算',c3)
计算结果:
>>> import numpy as np
>>> a=[1,3,5,7,9,11,13]
>>> b=[2,4,6,8]
将数组a和数组b进行卷积运算,模式设置为全模式,结果赋值给变量c1
>>> print("full卷积计算",c1)
全卷积运算结果为 2, 10, 28, 60, 100, 140, 180, 190, 166, 104。
c2是a和b经过卷积运算得到的结果,采用相同模式处理边界,计算过程将两个序列在重叠部分进行逐点乘积求和,最终形成新的序列数据
>>> print('same计算',c2)
同值运算结果为 10, 28, 60, 100, 140, 180, 190
c3是a和b进行卷积运算的结果,运算模式为有效模式,只计算不重叠的部分,最终得到的结果存储在c3变量中。
>>> print('valid计算',c3)
valid计算 [ 60 100 140 180]
>>>
二维矩阵卷积计算
处理数字图像时,单个图像构成一个二维离散序列,我们常选取具备特定属性的二维矩阵作为样板,然后将其与图像执行卷积运算。让新生成的图像呈现出特定效果,比如产生朦胧感,增强清晰度,形成凹凸纹理等,这类工具被称作卷积核。图像和卷积核的运算方式,在根本上与前面讲过的一维信号叠合计算非常接近:把卷积核当作一个m*n的框架,在图像上一步步移动,拿图像每个点上深浅程度和对应的卷积核数值相乘,接着把所有乘出来的结果加起来,就得到卷积核中心点对应的图像深浅值,按照这种方法,依次算出所有点的运算结果。
例如,如图:
零乘以四加上零乘以零加上零乘以零再加上零乘以零,然后是一乘以零,接着是一乘以零,然后是零乘以零,再是一乘以零,最后是二乘以负四,结果等于负八
图像卷积通常不添加边缘填充,所以卷积运算会造成图像尺寸缩小(造成边缘信息缺失)。在执行卷积运算之前,卷积核必须进行180度旋转。比如某个卷积核,旋转180度后变成这个样子。对二维数组实施180度翻转,可以利用数组切片和重塑功能实现。下面是相应的示例代码。
import numpy as np
def ArrayRotate180(matrix):
new_arr=matrix.reshape(matrix.size) #将二维数组重塑为一维数组
new_arr=new_arr[::-1] #一维数组实现翻转
new_arr=new_arr.reshape(matrix.shape) #将一维数组重塑为二维数组
return new_arr
if __name__=='__main__':
m=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(ArrayRotate180(m))
结果展示:
[[9 8 7]
[6 5 4]
[3 2 1]]
二维数组卷积计算涉及矩阵运算和矩阵求和,卷积计算的步骤:
①.先将卷积核翻转180°
卷积核翻转后的中心要对准输入矩阵的第一个元素,接着计算两者相乘后的所有结果,最后把这些结果加起来,就得到了输出矩阵的第一个值,如果考虑到边缘效应,那么卷积核和输入矩阵没有接触到的部分,要用零来代替
③.依此类推,完成其他所有元素的卷积运算,直至输出结果矩阵
完成上述过程代码示例:
import numpy as np
def ArrayRotate180(matrix):
new_arr=matrix.reshape(matrix.size) #将二维数组重塑为一维数组
new_arr=new_arr[::-1] #一维数组实现翻转
new_arr=new_arr.reshape(matrix.shape) #将一维数组重塑为二维数组
return new_arr
def My2Dconv(matrix,kernel):
创建一个与原矩阵数组完全相同的副本,这个副本就是输出矩阵,并且输出矩阵中参与卷积运算的部分将会被修改。
new_martix=matrix.copy()
m,n=new_martix.shape #输入二维矩阵的行列数
p,q=kernel.shape #卷积核的行列数
kernel=ArrayRotate180(kernel) #对卷积核进行180杜翻转;
#将卷积核与输入二维矩阵进行卷积计算
for i in range(1,m):
for j in range(1,n-1):
new_martix[i,j]=(matrix[(i-1):(p-1+i),(j-1):(j+q-1)]*kernel).sum()
return new_martix
if __name__=='__main__':
input=np.array([[1,2,3,4],[5,7,8,8],[6,9,0,2],[11,22,33,44]])
kernel=np.array([[1,0,1],[-1,-1,-1]]) #示例卷积核
print(My2Dconv(input,kernel))
结果展示:
[[ 1 2 3 4]
[ 5 7 6 8]
[ 6 -14 -12 2]
[ 11 29 55 44]]
图像卷积应用实例
在处理二维矩阵卷积运算时,包括SciPy和OpenCV在内的多种第三方Python库都提供了相应工具,以下示范如何运用OpenCV自带的filter2D函数对一张输入的图像执行边缘检测操作,卷积核的选择对最终图像质量具有显著影响,比如能够对图像实施边缘化处理
,,
可实现对图像进行锐化操作.可实现对图像进行浮雕处理。
下面展示对图像锐化处理:
#图像卷积应用示例
import matplotlib.pyplot as plt
import pylab
import cv2
import numpy as np
img=plt.imread(这个图片文件位于名为csdn专用图片的文件夹里,具体路径是D盘根目录下,文件编号为cb967cce-56cd-45de-ba96-ffb05edabd8b_batchwm.jpg,属于批量水印处理的一批文件中)
plt.imshow(img)
pylab.show()
#定义卷积核
kernel=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
res=cv2.filter2D(img,-1,kernel)
plt.imshow(res)
plt.imsave('result.jpg',res)
pylab.show()
代码结果展示:
总结
卷积运算是一种针对二维矩阵数据的处理方法,理解卷积运算,有助于完成多种任务。本节的核心内容在于熟练运用filter2D()这个卷积函数。
转述自某技术博客文章,详细内容见指定链接,该链接提供了具体的技术探讨与实现步骤,对于相关领域的学习者具有参考价值。
