参考链接:
http://www.cnblogs.com/freeblues/p/5738987.html
http://blog.csdn.net/chaipp0607/article/details/72236892?locationNum=9&fps=1
神经网络中的卷积层,它的原理就来源于图像卷积
概述
卷积
在信号处理领域有极其广泛的应用, 也有严格的物理和数学定义. 本文只讨论卷积在数字图像处理中的应用.
在数字图像处理中, 有一种基本的处理方法:线性滤波
. 待处理的平面数字图像可被看做一个大矩阵, 图像的每个像素对应着矩阵的每个元素, 假设我们平面的分辨率是 1024*768
, 那么对应的大矩阵的行数
= 1024
, 列数
=768
.
用于滤波的是一个滤波器小矩阵(也叫卷积核
), 滤波器小矩阵一般是个方阵, 也就是 行数
和 列数
相同, 比如常见的用于边缘检测的 Sobel 算子
就是两个 3*3
的小矩阵.
进行滤波就是对于大矩阵中的每个像素, 计算它周围像素和滤波器矩阵对应位置元素的乘积, 然后把结果相加到一起, 最终得到的值就作为该像素的新值, 这样就完成了一次滤波.
上面的处理过程可以参考这个示意图:
图像卷积计算示意图:
对图像大矩阵和滤波小矩阵对应位置元素相乘再求和的操作就叫卷积
(Convolution
)或协相关
(Correlation
).
协相关
(Correlation
)和卷积
(Convolution
)很类似, 两者唯一的差别就是卷积
在计算前需要翻转卷积核
, 而协相关
则不需要翻转.
以 Sobel 算子为例
Sobel 算子
也叫 Sobel 滤波
, 是两个 3*3
的矩阵, 主要用来计算图像中某一点在横向/纵向
上的梯度, 看了不少网络上讲解 Sobel 算子
的文章, 发现人们常常把它的横向梯度矩阵和纵向梯度矩阵混淆. 这可能与 Sobel 算子
在它的两个主要应用场景中的不同用法有关.
Sobel 算子的两个梯度矩阵: Gx 和 Gy
这里以 Wiki
资料为准, Sobel 算子
有两个滤波矩阵: Gx
和 Gy
, Gx
用来计算横向的梯度, Gy
用来计算纵向的梯度, 下图就是具体的滤波器:
- 注意:这里列出的这两个梯度矩阵对应于横向从左到右, 纵向从上到下的坐标轴, 也就是这种:
原点
O -------> x轴
|
|
|
V y轴
Sobel 算子的用途
它可以用来对图像进行边缘检测, 或者用来计算某个像素点的法线向量. 这里需要注意的是:
- 边缘检测时:
Gx
用于检测纵向边缘,Gy
用于检测横向边缘. - 计算法线时:
Gx
用于计算法线的横向偏移,Gy
用于计算法线的纵向偏移.
计算展开
假设待处理图像的某个像素点周围的像素如下:
左上 | 上 | 右上 |
---|---|---|
左 | 中心像素 | 右 |
左下 | 下 | 右下 |
那么用 Gx
计算展开为:
横向新值 = (-1)*[左上] + (-2)*[左] + (-1)*[左下] +