卷积函数的定义
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.cm as cm
'''
image_array: 原灰度图像矩阵
kernel: 卷积核(过滤器)
返回值:原图像与算子进行卷积之后的结果
'''
def ImgConvolve(image_array, kernel):
image_arr = image_array.copy()
# 灰度图像矩阵的维度
img_dim1, img_dim2 = image_arr.shape
# 过滤器的维度
k_dim1, k_dim2 = kernel.shape
# 填充时增加的高和宽度
AddW = int((k_dim1-1)/2)
AddH = int((k_dim2-1)/2)
# padding填充
temp = np.zeros([img_dim1 + AddW*2, img_dim2 + AddH*2])
# 将原图拷贝到临时图片的中央,这样临时图片就是在原图的基础上padding=1的0像素的填充
temp[AddW:AddW+img_dim1, AddH:AddH+img_dim2] = image_arr[:, :]
# 初始化一张同样大小的输出图片
output = np.zeros_like(a = temp)
# 将扩充后的图和卷积核进行卷积
for i in range(AddW, AddW+img_dim1):
for j in range(AddH, AddH+img_dim2):
# 只填充了和原图像一样大小的位置
# (i-AddW)-(i+AddW+1) = 2*AddW + 1 = k_dim1正好为卷积核的维度
output[i][j] = int(np.sum(temp[i-AddW:i+AddW+1, j-AddH:j+AddH+1] * kernel))
return output[AddW:AddW+img_dim1, AddH:AddH+img_dim2]
定义卷积核
# 提取竖直方向特征
kernel_1 = np.array([
[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]
])
# 提取水平方向特征
kernel_2 = np.array([
[-1, -2, -1],
[0, 0, 0],
[1, 2, 1]
])
# Laplace扩展算子
kernel = np.array([
[1, 1, 1],
[1, -8, 1],
[1, 1, 1]
])
卷积操作
# 打开图像并转换为灰度图像
image = Image.open("timg.jpeg").convert("L")
# 将图像转换为数组
image_array = np.array(image)
# 卷积操作
sobel_x = ImgConvolve(image_array, kernel_1)
sobel_y = ImgConvolve(image_array, kernel_2)
laplace = ImgConvolve(image_array, kernel)
显示图像
plt.imshow(image_array,cmap=cm.gray)
plt.axis("off")
plt.show()
plt.imshow(sobel_x, cmap=cm.gray)
plt.axis("off")
plt.show()
plt.imshow(sobel_y, cmap=cm.gray)
plt.axis("off")
plt.show()
plt.imshow(laplace, cmap=cm.gray)
plt.axis("off")
plt.show()
运行结果
参考视频:深度学习应用开发TensorFlow实践