人工智能卷积算法
[[id_1[id_32[id_1804294596]79483][id_654031594]6248088[id_1246491760]d_[id_933781607][id_[id_593258221]2750587]36469595]id_1478198711]
卷积运算本质上属于一种基础数学手段,其运作方式与加法、乘法等运算相似,均涉及两个输入以产生一个输出结果。其独特之处在于,卷积运算处理的是两个信号kaiyun全站网页版登录,并生成一个全新的信号作为输出。该运算不仅广泛应用于信号处理领域,还频繁应用于概率论、数理统计等多个学科分支。在线性系统中,卷积能够展现输入信号、冲激响应和输出信号三者之间的相互联系。输入信号经过冲激响应的处理,最终会形成输出信号。
[id_940181252]
卷积运算符号一般用*来表示,故表达式为:
y=x*h
x是输入的量,h代表脉冲反应,y是产生的结果。卷积经常用来实现信号的处理,比如进行滤波操作。
(a)低通滤波器
[id_19541747[id_1045430857]]
数字信号处理诸多场合下,输入数据包含成百上千乃至数百万个测量值。而脉冲响应数据则要简短得多,通常仅含数个或数百个测量值。尽管卷积过程对数据规模不加约束,但明确数据大小仍然至关重要。
输入信号x包含N个采样点,下标范围从0到N-1,冲激响应信号h包含M个采样点,下标范围从0到M-1,那么输出信号y的采样点总数为N与M之和再减去1
卷积公式与计算过程
卷积计算示意图
边缘卷积计算与0填充
计算y0或y11等信号边界点的卷积会出现困难。比如求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))])
这个表达式同样能够实现翻转功能
[id_1149131667]=len(input) #x[n]的长度
len_kernel=len(kernel) #h[n]的长度
#对输入数组进行0填充来解决卷积计算过程中的边缘对齐
padding=np.zeros(len_kernel-1,dtype='int') [id_1317785939]
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包中同样含有卷积功能kaiyun全站app登录入口,其函数定义如下:numpy.convolve(a,v,mode='full'),这个函数能够实现卷积运算。
a`:输入一维数组,长度为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经过卷积运算得到的结果,运算模式为相同模式,计算结果长度与a和b相同
>>> print('same计算',c2)
same运算结果为 10, 28, 60, 100, 140, 180, 190
c3是a和b经过卷积运算后得到的结果,运算模式为有效值,计算过程中只考虑了两个序列重合的部分,最终输出的数组长度等于两个输入数组长度的和减去1
>>> print('valid计算',c3)
valid计算 [ 60 100 140 180]
>>>
二维矩阵卷积计算
数字图像处理过程中,单张图像表现为一个二维离散序列,我们常会选用具备特定属性的二维矩阵作为样板,再跟图像执行卷积运算让新图像呈现出特定效果,比如产生朦胧感,增强清晰度,或是形成凹凸纹理,这类工具统称为卷积核。图像和卷积核的运算方法,在根本上与前面提到的一维信号叠加过程相似:把卷积核当作一个m*n的框架,依次在图像上移动,取图像每个像素点的亮度,同卷积核对应位置的数值相乘,接着把所有乘积加起来,作为框架中心像素对应点的亮度,依次类推,算出所有像素点的运算结果。
例如,如图:
零乘以四加上零乘以零,再加上零乘以零,然后加上零乘以零,接着是一乘以零,然后是一乘以零,再加上零乘以零,然后是一乘以零,最后是二乘以负四,结果等于负八
图像卷积通常不添加边缘填充,所以卷积过程可能会使图像尺寸减小,造成边缘信息丢失。在执行卷积运算前,卷积核必须进行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°
卷积核翻转后的中心要对准输入矩阵的第一个元素,然后计算它们相乘后的所有值,把这些值加起来就是结果矩阵的第一个值,如果考虑边缘问题,卷积核和输入矩阵没有接触的部分要当成0来处理
③.依此类推,完成其他所有元素的卷积运算,直至输出结果矩阵
完成上述过程代码示例:
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函数对输入的图像执行边缘识别操作kaiyun全站登录网页入口,核函数的选择对最终图像质量影响显著,比如能够通过特定核实现图像的边缘化处理
,,
可实现对图像进行锐化操作.可实现对图像进行浮雕处理。
下面展示对图像锐化处理:
#图像卷积应用示例
import matplotlib.pyplot as plt
import pylab
import cv2
import numpy as np
img=plt.imread(那个位于D盘根目录下csdn专用图片文件夹里的文件,它的名字是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()卷积功能,是这一节的核心内容。
转自某个技术博客,具体网址为https://blog.csdn.net/qq_59931372/article/details/128680803,内容进行了重新整理和表述,目的是为了方便更多人理解和学习相关技术知识,同时保留了原始信息的完整性和准确性。