1. 编写通用的矩阵卷积的函数,输入100*100的随机矩阵和3*3, 5*5, 7*7的随机卷积核,完成卷积操作。
函数参数:def General_Conv(imatx, imaty, kernel, padding):,
其中imatx和imaty为输入随机矩阵大小,kernel为随机卷积核大小,padding为填充模式,0为不填充,1为全填充0。
import matplotlib.pyplot as plt
import numpy as np
import pylab
def General_Conv(imatx, imaty, kernel, padding):
k_array = np.random.rand(kernel, kernel) # 卷积核矩阵
i_array = np.random.randint(0, 256,(imatx, imaty)) # 随机数矩阵
gap = kernel//2 # 计数空缺的行数和列数
new_array = np.zeros(shape=(imatx, imaty)) # 在原来的随机数矩阵外围补零
if padding == 0: # 不填充
b_array = np.zeros(shape=(imatx - gap*2, imaty - gap*2)) # 定义一个矩阵存放卷积以后的值
for i in range(gap, imatx - gap):
for j in range(gap, imaty - gap):
m_array = i_array[i - gap:i + gap + 1, j - gap:j + gap + 1]
b_array[i-gap][j-gap] = int(np.sum(k_array * m_array))
for x in range(imatx-2*gap):
for y in range(imaty-2*gap):
new_array[x+gap][y+gap] = b_array[x][y] # 将原来的随机数矩阵填入
return new_array
if padding == 1: # 填充0
b_array = np.zeros(shape=(imatx + gap*2, imaty + gap*2)) # 在原来的随机数矩阵外围补零
for i in range(imatx):
for j in range(imaty):
b_array[i+gap][j+gap] = i_array[i][j] # 将原来的随机数矩阵填入
for i in range(gap, imatx+1):
for j in range(gap, imaty+1): # gap下标实际上是第gap+1个元素的位置
m_array = b_array[i-gap:i+gap+1, j-gap:j+gap+1]
new_array[i-gap-1][j-gap-1] = int(np.sum(k_array * m_array)) # 为什么-1
return new_array
img_new = np.uint8(General_Conv(400,300,3,1))
print(img_new)
plt.imshow(img_new) # 卷积结果可视化
pylab.show()
print('*'*40)
img_new = np.uint8(General_Conv(10,10,3,0))
print(img_new)
plt.imshow(img_new) # 卷积结果可视化
pylab.show()