机器视觉 之 卷积

卷积样例图

卷积,英文名称为Convolution

卷积在工程领域有非常重要的作用。在图像处理方面, 图像过滤,图像求导,模板匹配等各种操作均会用到卷积。

我们打算把卷积部分的内容写在前面。卷积分为几种, 空域卷积, 时域卷积, 频域卷积

下文只讲解空域卷积的部分,而空域又分为一维卷积和二维卷积。

一维卷积

王大锤的幸福生活

以下是一个很暴力的例子

作为资深技术宅的大锤, 性格内向, 耿直, 不太会说话。

年到中年的时候遇到了他的另一半胜男。

胜男是个女汉子, 跆拳道黑带, 脾气特别暴。

因为大锤嘴欠,经常说错话,说错话胜男就会在他头上打一下, 打一下就会起包。

打人 去死 撕逼

假设包的高度是X, 随着天数变动, 包的高度会慢慢消去, 第二天会变成0.6X , 第三天会变成0.2X , 第四天就消肿了。

那矩阵G 就等于 [1, 0.6, 0.2] 值得一提的是, 第四天前的包不会对当前产生影响。

假定胜男每天最多打一次, 每次不会重复在同一个位置上。

周一

胜男正在看电视吃零食,问大锤:我最近感觉自己衣服变紧了

大锤:都这么胖了还吃?

......

胜男在大锤头上打了一个10cm的包

周三

胜男: 你之前谈了几个女朋友啊?

大锤:一个,两个, 三个 ... 十个, 完了手指不够用了。

......

胜男在大锤头上打了一个12cm的包

周四

胜男: 我又不漂亮, 你为什么会喜欢我?

大锤:当时光线昏暗, 没看清楚。

......

胜男在大锤头上打了一个8cm的包

我们用一维矩阵X来记录一周内(周末休息)大锤被打的次数。

X = [10, 0, 12, 8, 0]

我们再定义一个变量S来记录大锤脑袋上每天所有包的长度之和.我们如何求?

计算某一天的长度和S , 那么Sn=1Xn+0.6Xn1+0.2Xn2 S_n = 1*X_n + 0.6 * X_{n-1} + 0.2 * X_{n-2}

本质上是一定范围内的加权求和, 那么数学上又没有定义这种运算呢?

这个时候我们就用到了卷积 , 符号是* , G 记录权重,称之为卷积核Kernel

S=XG S = X * G

具体运算过程如下:

头上的包总长度S运算过程

二维卷积

卷积公式

img

其中K是奇数, 公式感觉有点难懂, 没关系, 我们画图来说明

公式对应的中心点为(0,0)

假设卷积核为3*3 ,那么k 就等于1, 坐标系如下图所示

卷积坐标系

举个例子

Image对象也就是F

卷积IMAGE

卷积核H

卷积核样例_KERNEL

我们拿G[1,1]举例子

G[1,1]=u=11v=11H[u,v]F[1u,1v] G[1, 1] = \sum_{u=-1}^{1}\sum_{v=-1}^{1} H[u, v] * F[1-u, 1-v]

G[1,1]=H[1,1]F[2,2]+H[1,0]F[2,1]+H[1,1]F[2,0] G[1,1] = H[-1, -1] * F[2, 2] + H[-1, 0] * F[2, 1] + H[-1, 1]*F[2, 0]

+H[0,1]F[1,2]+H[0,0]F[1,1]+H[0,1]F[1,0] + H[0, -1] * F[1, 2] + H[0, 0] * F[1, 1] + H[0, 1]*F[1, 0]

+H[1,1]F[0,2]+H[1,0]F[0,1]+H[1,1]F[0,0] + H[1, -1] * F[0, 2] + H[1, 0] * F[0, 1] + H[1, 1]*F[0, 0]

G[1,1]=11+01+11+00+11+01+10+00+11=4 G[1, 1] = 1*1 + 0*1 + 1*1 + 0*0 + 1*1 + 0*1 + 1*0 + 0*0 +1*1 = 4

这里要强调一点, 就是我们选取的这个卷积核比较特别, 原因是H为实对称矩阵

实对称矩阵的特性就是ai,j=aj,i a_{i, j} = a_{j, i}, 也就是说当卷积核为H时,FH F*H 其实等同于FH F \bigotimes H .

\bigotimes 这个符号,是cross-correlation的意思, 互相关。他们的区别,就是对卷积核做一下转置就变成了互相关操作, 暂时不细讲

卷积过程

途中的橙色部分的下标其实是H的转置

点击查看 图

其实这个图是带有一点误导的,原因是这个采用的卷积核比较特殊,为对称矩阵

对称矩阵 方形矩阵,转置矩阵和自身相等 aij=aji a_{ij} = a_{ji}

也就是说, 如果是对称矩阵的话, 卷积与互相关运算出来的结果是相同的

卷积运算过程中边界处理

Size问题

左边是卷积后扩大

中间是卷积和中心点对准各个角点,大小不变

右边, 卷积后图片缩小

convolution_boundary_issue

实际上我们做卷积的时候用的是中间的那个, 要保持图像大小不变。

边界空白区域的处理

按照上图中间的卷积起始点, 有一部分是没有值的, 我们要怎么处理?

纯色填充 pure一种是将边界设定为一种纯色, 全为白或者为黑, 会留下黑边或者白边, 在进行直线检测的时候,也会给你带来意外的困扰。

平铺 wrap around 主要针对有周期性的图像平铺, 适用范围较窄

边缘复制 copy edge 是将边界的颜色拓展, 如下图所示

convolution_boundary_issue_2

镜像填充 reflect across edge 是将图片镜像, 用于填充边界,如下图所示

convolution_boundary_issue_3

2D卷积在图像处理中的应用

卷积在图像处理领域经常被用于如下功能

  • 低通滤波
  • 高通滤波
  • 平移和差分边缘检测
  • 匹配滤波和边缘检测
  • 边缘检测
  • 梯度方向边缘检测

不同的功能搭配不同的模板,详情可以见小熊不去实验室 的博客

http://blog.csdn.net/yangtrees/article/details/8740933

我们这里只举一个高斯模糊的例子, 其他的内容将在今后的教程中涉及, 莫急。

高斯模糊

我先来说一下模糊的思想, 当图片中存在噪声的时候, 或者我们想对其做模糊处理的时候, 如何设定当前值,而又自然地变换, 肯定是根据这个像素点周边的像素取值, 做一个加权平均,这个权值的不同, 就是不同的模糊卷积核。当我们采用二位的高斯分布的权值作为我们的卷积核的时候, 这就是高斯模糊。

具体的操作流程如下 : 参考高斯模糊-阮一峰博客

相信会PS的同学,肯定用过高斯模糊了,但是它到底是个啥呢?

高斯模糊, 首先要从高斯分布/正态分布说起

f(x)=1/(σ2π)e(xμ)2/(2σ2) f(x) = 1/(\sigma * \sqrt{2*\pi}) * e^{-(x-\mu)^2/(2*\sigma^{2})}

μ=0 \mu = 0, μ \mu 其实是均值的意思

参数我们改成两个, 分别是x坐标与y坐标

改造后的公式为

二维高斯函数

f(x)=1/(σ22π)e(x2+y2)/(2σ2) f(x) = 1/(\sigma^2 * {2*\pi}) * e^{-(x^2 + y^2)/(2*\sigma^{2})}

卷积坐标系

它的分布图像为

img

假定σ=1.5 \sigma = 1.5 将我们的坐标参数带入

img

然后我们对其做归一化处理, 也就是所有的值加起来=1

img

这就是我们用于做高斯模糊的卷积核

假定原来的图像像素点为

img

对其用卷积核做卷积运算的时候

img

运算结果如下

img

三个值,相加就是红色区域的高斯模糊之后的值。

效果一览

img

Reference

  1. 阮一峰 高斯模糊的图片

http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

  1. Udacity - Computer Vision课程

本文中的部分图片为课程截图

  1. 知乎 - 如何通俗易懂地解释卷积?

https://www.zhihu.com/question/22298352

一维卷积的情节设计思路参考知乎中的讨论

卷积样例图_3_RGB三通道

Copyright 杭州云江科技有限公司 2017 all right reserved,powered by Gitbook该文件修订时间: 2019-04-06 01:27:51

results matching ""

    No results matching ""