卷积的实现

卷积函数的定义

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实践

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值