一、简单描述卷积、卷积核、多通道、特征图、特征选择概念。
卷积:使用一个长宽为kernel_size的卷积核在长宽为input_size的原始图片上扫描,每次移动步长为stride,为保证原始图片上靠近边缘的像素也能同非边缘像素一样被有效利用,给原始图片四周填充padding像素的边缘。则输出特征图大小output_size计算公式为:
卷积核:卷积核实际上是一个滤波器,在卷积神经网络中其参数是可学习的,对于一个通道数为c的输入特征图,需要的卷积核的size为(c, k, k),其中k是卷积核长宽。卷积核的可学习参数还有一个bias,其size为(c, ),即卷积核的每个channel对应一个bias。
多通道:假设输入特征图channel为m,要求输出特征图channel为n,则需要n个size为(m, k, k)的卷积核。
特征选择:不同的卷积核对输入特征图上不同的pattern的响应不同,所以一个卷积核可以输出一张某pattern的响应强度特征图。
二、探究不同卷积核的作用,研究背后的原理。
※ 滤波器可以看成一个“模式检测器”,当扫描到的图像区域符合这个滤波器的“模式”,这个滤波器就会输出一个较强的信号。
模糊滤波核:滤波器输出的像素等于其3×3区域的像素按照高斯分布的权值加权平均,即输出的每个像素不仅受到输入像素的影响,还均匀收到其周围像素的影响,起到了平滑模糊的效果。
下图是一个高斯滤波核
锐化滤波核:和模糊相反,锐化是放大相邻像素之间差异的一种手段,如果一个像素和周围像素较为接近但不相等,锐化后它们之间的差异会变大,有利于增强模糊的细节。
下图是具有一阶提升系数的拉普拉斯锐化滤波核
边缘强化滤波核:边缘检测是图像处理任务中的重要手段,图像可以看成是一个关于x,y的二维函数,边缘可以看成是这个二维函数的梯度,诸如sobel这样的边缘检测算子可以捕捉到这种梯度信息。
下面是left sobel滤波核
三、编程实现
1. 经典卷积核,实现灰度图的边缘检测、锐化、模糊。
import torch
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 读取灰度图
img = Image.open("github.jpg").convert('L')
plt.imshow(img, cmap='gray')
plt.show()
img = np.array(img, dtype='float32').reshape(1, 1, img.size[1], img.size[0])
img = torch.from_numpy(img)
# 定义卷积层,单通道输入,单通道输出,因此需要1个3*3的卷积核
conv_layer = torch.nn.Conv2d(
in_channels=1,
out_channels=1,
kernel_size=3,
stride=1,
padding=1
)
# 边缘检测卷积核
outline_kernel = [[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]]
# 锐化卷积核
# sharpen_kernel = [[0, -1, 0],
# [-1, 5, -1],
# [0, -1, 0]]
# 模糊卷积核
# blur_kernel = [[0.0625, 0.125, 0.0625],
# [0.125, 0.25, 0.125],
# [0.0625, 0.125, 0.0625]]
kernel = torch.from_numpy(np.array(outline_kernel, dtype='float32').reshape(1, 1, 3, 3))
conv_layer.weight.data = kernel
# 推理
img_output = conv_layer(img)
# 展示
plt.imshow(img_output.data.squeeze().numpy(), cmap='gray')
plt.show()
原图:
边缘检测:
锐化:
模糊:
2. 调整经典卷积核参数,测试并总结。
经测试,如果让卷积核各参数求和值越大于1,则处理后的图像整体更亮。
模糊卷积核的高斯分布越分散,则处理后的图像越模糊。
3. 使用不同尺寸图片,测试并总结。
经测试,由于卷积核本身较小,因此只能作用于较小尺度,所以小尺寸图片看起来效果会好些。但是图片尺寸对于卷积实际上是无影响。
4. 探索更多类型卷积核。
浮雕效果:
bottom sobel:
放一张图像各类滤波的关系图
5. 尝试彩色图片边缘检测。
图像一般是具有R、G、B三个色彩通道的,然而不能对与每个通道单独进行边缘检测然后将结果合并,因为每个通道检测出来的边缘都不一样。
采用卷积核将RGB3个通道分别边缘检测并融合为一个通道的的结果如下(效果似乎不太好):
关于彩色图边缘检测这里给出了一个方法,【图像处理】彩色图像边缘检测_artzers的博客-CSDN博客_彩色边缘检测彩色图像边缘检测https://blog.csdn.net/lpsl1882/article/details/51802006
Canny边缘检测是当前效果最好的边缘检测算法,它被集成在了图像处理库OpenCV当中,下边是借助Canny方法对于彩色图像进行边缘检测。
canny方法只能处理灰度图像,因此一般要先将彩色图像转换为灰度图像。