文章目录
一、概念理解
卷积:通过两个函数f和g生成第三个函数的一种数学运算,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。
卷积核:图像处理时,给定输入图像,输入图像中一个小区域中像素加权平均后成为输出图像中的每个对应像素,其中权值由一个函数定义,这个函数称为卷积核。
多通道:CNN中的一次性卷积要处理的多组数据
特征图:在cnn的每个卷积层,数据都是以三维形式存在的。你可以把它看成许多个二维图片叠在一起(像豆腐皮一样),其中每一个称为一个feature map。
特征选择:寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。
二、原理
1.均值滤波和高斯滤波
高斯滤波器虽然元素总和也为1,但每个位置的权重不一样,权重在行和列上的分布均服从高斯分布,故称高斯滤波器。高斯分布的标准差越大,则模糊程度越大。一个3 × 3 3\times33×3标准差为1的高斯滤波器如下所示:
2.锐化卷积核
锐化卷积核从名字就可以看出,主要作用就是对图片进行锐化操作,也就是让图像的边缘更加锐利。图像的边缘往往就是变化较大的地方,也就是图像的高频部分,因此锐化卷积核就是一种高通滤波器。一个3 × 3 3\times33×3的锐化卷积核如下所示:
可见该卷积核就是计算中心位置像素与周围像素的差值,差值越大则表示该元素附近的变化越大(频率越大),输出值也就越大,因此是高频滤波器的一种。锐化卷积核元素总和如果是0,则有提取图像边缘信息的效果。
三、编程实现
1.经典卷积核,实现灰度图的边缘检测、锐化、模糊。
边缘检测:
sobel_kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
锐化:
sobel_kernel = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
模糊:
sobel_kernel = np.array([[1, 2, 1],
[2, 4, 2],
[1, 2, 1]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel / 16
2.调整经典卷积核参数
边缘检测:
sobel_kernel = np.array([[-3, -3, -3],
[-3, 24, -3],
[-3, -3, -3]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
锐化:
sobel_kernel = np.array([[0, -2, 0],
[-6, 9, -9],
[0, -2, 0]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
模糊:
sobel_kernel = np.array([[3, 1, 3],
[1, 24, 1],
[3, 1, 3]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel / 38
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
边缘检测和模糊时候改变参数没感觉怎么变化,不过锐化时候感觉挺明显,图片颜色有点变化
3.使用不同尺寸图片
边缘检测:
锐化:
模糊:
对比了一下1和3,个人认为应该是图片像素越低卷积出来的结果越接近
4.探索更多类型卷积核
学的太浅有点探索不出来
5.尝试彩色图片边缘检测
尝试了半天没弄出来想要的结果,只会把结果变成单一的颜色或者简单颜色
总结
通过本次编程了解了一些有关CNN的知识,觉得挺神奇的可以通过各种各样的卷积核把一张图片展示的越来越逼真,总体感觉还可以,希望下次可以做得更好。