【代码】
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
class Conv2D(tf.keras.layers.Layer):
def __init__(self, kernel_size, step_len, kernel):
super().__init__()
self.kernel_size = kernel_size # 卷积核大小
self.step_len = step_len # 步长,但此处并未在卷积中实际使用
self.kernel = np.array(kernel) # 确保kernel是numpy数组
def call(self, inputs):
new_image = []
for i in range(0, inputs.shape[0] - self.kernel_size[0] + 1, self.step_len): # 修正步长逻辑
print(i, inputs.shape[0])
Line_data = []
for j in range(0, inputs.shape[1] - self.kernel_size[1] + 1, self.step_len): # 同样修正步长逻辑
# 使用numpy的dot函数或np.sum(inputs[...]*self.kernel)代替np.mean
# 因为卷积通常使用加权和而不是平均值
conv_result = np.sum(inputs[i:i+self.kernel_size[0], j:j+self.kernel_size[1]] * self.kernel)
Line_data.append(conv_result)
# 这里需要将Line_data转换为二维数组以匹配原始图像的维度(考虑步长)
new_image.append(Line_data)
new_image = np.array(new_image)
return new_image
# 实例化自定义卷积层
Conv2DLayer = Conv2D([3, 3], 1, kernel=[[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
#image = "paidaxing.jpg" #第一张图片
image = "malou.jpg"
image_data = plt.imread(image)
print(image_data.shape) # 这将显示图像的尺寸和颜色通道数
# 如果image_data是RGB,我们只取第一个通道(红色)作为灰度图像
input_data = image_data[:, :, 0]
plt.imshow(Conv2DLayer(input_data), cmap='gray') # 使用灰度图色彩映射
plt.show()
paidaxing.jpg
卷积后:
malou.jpg
卷积后: