一, 简单描述卷积、卷积核、多通道、特征图、特征选择概念。
1,卷积:是通过两个函数,f和g生成第三个函数的一种数学运算,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分,针对像素点的空间依赖性来对图像进行处理的一种技术。
2, 卷积核:是一个二维矩阵,矩阵中的数值为对图像中与卷积核同样大小的子块像素点进行卷积计算时所采用的权重,包含高度(height)、宽度(width))、深度(depth)三个维度,并包含一个参数(维度):通道数(channels),其中深度这一维度只有在三维卷积时才有实际意义。
3, 多通道:多通道卷积时,卷积核各通道同步滑动,卷积核的各通道与输入特征图的对应通道同步卷积,例如三通道就是RGB三原色的,一幅完整的图像,是由红绿蓝三个通道组成的,他们共同作用产生了完整的图像。
4,特征图:由图像提取出的特征值组成的方图。
5,特征选择:从已经有的特征中选择若干有效的特征使图片最优。
二,探究不同卷积核的作用,研究背后的原理。
1,边缘检测:标识数字图像中亮度变化明显的点,这些点往往是轮廓或边缘。
卷积核:
效果:
2,锐化:快速聚焦模糊边缘,提高图像中某一部位的清晰度或者焦距程度,使图像特定区域的色彩更加鲜明。
卷积核:
效果:
3,模糊:处理图中与周围亮度差异过大的点,使其和周围点相似,以此消除或模糊轮廓。
卷积核:
效果:
三、编程实现:
1,经典卷积核,实现灰度图的边缘检测、锐化、模糊。
代码:
import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
import torch.nn.functional as F
from PIL import Image
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容
# https://blog.csdn.net/weixin_40123108/article/details/83510592
file_path = '321.jpeg'
im = Image.open(file_path).convert('L') # 读入一张灰度图的图片
im = np.array(im, dtype='float32') # 将其转换为一个矩阵
print(im.shape[0], im.shape[1])
plt.imshow(im.astype('uint8'), cmap='gray') # 可视化图片
plt.title('原图')
plt.show()
im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
conv1 = nn.Conv2d(1, 1, 3, bias=False) # 定义卷积
sobel_kernel = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值
edge1 = conv1(Variable(im)) # 作用在图片上
x = edge1.data.squeeze().numpy()
print(x.shape) # 输出大小
plt.imshow(x, cmap='gray')
plt.show()
原图:
①,边缘检测
sobel_kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]], dtype='float32') # 定义轮廓检测算子
②,锐化
sobel_kernel = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1,0]], dtype='float32') # 定义轮廓检测算子
③,模糊
sobel_kernel = np.array([[0.0625, 0.125, 0.0625],
[0.125, 0.25, 0.125],
[0.0625, 0.125,0.0625]], dtype='float32') # 定义轮廓检测算子
2,调整经典卷积核参数,测试并总结。
①,边缘检测增加中心权重边缘更加清晰
sobel_kernel = np.array([[-1,-1, -1],
[-1, 12, -1],
[-1, -1,-1]], dtype='float32')
②,锐化提升周围权重,锐化度增加
sobel_kernel = np.array([[0,5, 0],
[5, 5, 5],
[0, 5,0]], dtype='float32')
③,模糊卷积核增大周围权重,模糊度增加
sobel_kernel = np.array([[3, 5, 3],
[5, 0.25, 5],
[3, 5,3]], dtype='float32')
3,使用不同尺寸图片,测试并总结。
4,探索更多类型卷积核。
①,emboss
卷积核:
效果:
②,bottom sobel
卷积核:
效果:
③,left sobel
卷积核:
效果:
5,尝试彩色图片边缘检测。