讲义链接:http://vision.stanford.edu/teaching/cs131_fall1718/files/05_edges.pdf

图像梯度(gradient)

由于图像中平面的截止、深度的截止以及图案的构成都是以边缘(edge)为基础的,所以边缘检测成为识别图像包含信息和重建几何观测的一个重要手段。我们不难想到,借助数学中的导数工具,即可在矩阵某一维度导数突变处获得图像边缘信息。一维连续和离散导数定义式和滤波器函数如下:
连续:

df(x)dx=lim△x→0f(x)−f(Δx)Δx=f‘(x) d f ( x ) d x = lim △ x → 0 f ( x ) − f ( Δ x ) Δ x = f ‘ ( x )

\dfrac{df(x)}{dx}=\lim_{\triangle x\to0}\dfrac{f(x)-f(\Delta x)}{\Delta x}=f^`(x)
后向:

df(n)dn=f(n)−f(n−1)1=f(n)−f(n−1)=f‘(n),卷积kernel:[0,1,−1] d f ( n ) d n = f ( n ) − f ( n − 1 ) 1 = f ( n ) − f ( n − 1 ) = f ‘ ( n ) , 卷 积 k e r n e l : [ 0 , 1 , − 1 ]

\dfrac{df(n)}{dn}=\dfrac{f(n)-f(n-1)}{1}=f(n)-f(n-1)=f^`(n),卷积kernel:[0, 1, -1]
前向:

df(n)dn=f(n)−f(n+1)1=f(n)−f(n+1)=f‘(n),卷积kernel:[−1,1,0] d f ( n ) d n = f ( n ) − f ( n + 1 ) 1 = f ( n ) − f ( n + 1 ) = f ‘ ( n ) , 卷 积 k e r n e l : [ − 1 , 1 , 0 ]

\dfrac{df(n)}{dn}=\dfrac{f(n)-f(n+1)}{1}=f(n)-f(n+1)=f^`(n),卷积kernel:[-1, 1, 0]
中心:

df(n)dn=f(n+1)−f(n−1)1=f(n+1)−f(n−1)=f‘(n),卷积kernel:[1,0,−1] d f ( n ) d n = f ( n + 1 ) − f ( n − 1 ) 1 = f ( n + 1 ) − f ( n − 1 ) = f ‘ ( n ) , 卷 积 k e r n e l : [ 1 , 0 , − 1 ]

\dfrac{df(n)}{dn}=\dfrac{f(n+1)-f(n-1)}{1}=f(n+1)-f(n-1)=f^`(n),卷积kernel:[1, 0, -1]
举例:序列 f(n)=10,15,10,10,25,20,20,20 f ( n ) = 10 , 15 , 10 , 10 , 25 , 20 , 20 , 20 f(n)=10,15,10,10,25,20,20,20
则三种导数分别为:
前向导数:0, 5, -5, 0, 15, -5, 0, 0.
后项导数:-5, 5, 0, -15, 5, 0, 0, 0.
中心导数:0,-5, -5, 20, -5, -15, 5,0
由矩阵f(x, y)中x方向和y方向的导数 ∂f(x,y)∂x ∂ f ( x , y ) ∂ x \dfrac{\partial f(x,y)}{\partial x}和 ∂f(x,y)∂y ∂ f ( x , y ) ∂ y \dfrac{\partial f(x,y)}{\partial y}可引入梯度的概念,梯度是个矢量,其方向和大小分别为 arctanfy(x,y)fx(x,y),f2y(x,y)+f2x(x,y)−−−−−−−−−−−−−−√ arctan ⁡ f y ( x , y ) f x ( x , y ) , f y 2 ( x , y ) + f x 2 ( x , y ) \arctan \dfrac{f_y(x,y)}{f_x(x,y)}, \sqrt{f_y^2(x,y)+f_x^2(x,y)}。
举例1:令

I=⎡⎣⎢⎢⎢⎢⎢⎢10101010101010101010202020202020202020202020202020⎤⎦⎥⎥⎥⎥⎥⎥ I = [ 10 10 20 20 20 10 10 20 20 20 10 10 20 20 20 10 10 20 20 20 10 10 20 20 20 ]

I=\left[\begin{matrix}10 & 10 & 20 & 20 & 20\\10 & 10 & 20 & 20 & 20\\10 & 10 & 20 & 20 & 20\\10 & 10 & 20 & 20 & 20\\10 & 10 & 20 & 20 & 20\\\end{matrix}\right]
则由x向导数滤波器和y向导数滤波器获得x向导数 Ix I x I_x和y向导数矩阵 Iy I y I_y,综合求得梯度值矩阵和梯度方向矩阵。

Ix=⎡⎣⎢⎢⎢⎢⎢⎢0000001010100010101000000000000⎤⎦⎥⎥⎥⎥⎥⎥ I x = [ 0 0 0 0 0 0 10 10 0 0 0 10 10 0 0 0 10 10 0 0 0 0 0 0 0 ]

I_x=\left[\begin{matrix}0 & 0 & 0 & 0 & 0\\0 & 10 & 10 & 0 & 0\\ 0 & 10 & 10 & 0 & 0\\0 & 10 & 10 & 0 & 0\\0 & 0 & 0 & 0 & 0\\\end{matrix}\right]

Iy=⎡⎣⎢⎢⎢⎢⎢⎢0000000000000000000000000⎤⎦⎥⎥⎥⎥⎥⎥ I y = [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]

I_y=\left[\begin{matrix}0 & 0 & 0 & 0 & 0\\0 & 0 & 0 & 0 & 0\\0 & 0 & 0 & 0 & 0\\0 & 0 & 0 & 0 & 0\\0 & 0 & 0 & 0 & 0\\\end{matrix}\right]
举例2:对以下左图矩阵按照图示的卷积kernel求x向导数和y向导数并作图:

可知图片中x向导数受竖线影响较大,可以刻画原图中经向边缘的性质,y向导数受横线影响较大,可以刻画原图中纬向边缘的性质。由此我们获得了一个简单的边缘检测器。

一个简单的边缘检测器(edge detector)

前面得到的简单detector有一个很致命的缺点——受噪点影响极大。原因是在某个方向上,噪点和两侧像素点的差异近似于边缘处和两侧像素点的差异。考虑到噪点只是一个孤立的点,而边缘是全平面上一些有联系的点的集合,我们采用光滑处理(smoothing)然后求导的办法,如均匀光滑(mean smoothing)和高斯滤波(Gaussian)等,然而数学上先高斯后卷积的过程( ddx(f∗g) d d x ( f ∗ g ) \dfrac{d}{dx}(f*g))等价于直接和高斯滤波器的导数进行卷积( df∗dgdx d f ∗ d g d x df*\dfrac{dg}{dx}),由此我们得到了一个有一定抗噪声能力的入门级edge detector。

Canny提出,一个好的edge detector必须具有以下特点:
高信噪比——既要不错过边缘,又要能克服噪声的影响,即:不能把噪声检测为边缘,又忽略真正的边缘。
高定位精度——检测结果要尽可能地与真实边缘重合,检测结果不能离真实的边缘太远。
低误报率——一个边就应该用最少的像素刻画,不能一条实际3个像素宽的边,检测结果变成30个像素。
(注:这三个特点的汉译来自《计算机视觉一种现代方法》,和讲义中的直译相距甚远,但含义近似)
为达到以上效果,本课后续介绍了两个经典的edge detector。

Sobel检测器

搜了一下wiki和其他博客,Sobel算子的内容并不是很深奥,横向卷积算子和纵向卷积算子分别如下:

Gx=⎡⎣⎢121000−1−2−1⎤⎦⎥=⎡⎣⎢121⎤⎦⎥[1  0  −1] G x = [ 1 0 − 1 2 0 − 2 1 0 − 1 ] = [ 1 2 1 ] [ 1 0 − 1 ]

G_x=\left[ \begin{matrix} 1&0&-1\\ 2&0&-2\\ 1&0&-1 \end{matrix} \right]= \left[ \begin{matrix} 1\\ 2\\ 1 \end{matrix} \right] \left[ \begin{matrix} 1\ \ 0 \ \ -1 \end{matrix} \right]

Gy=⎡⎣⎢10−120−210−1⎤⎦⎥=⎡⎣⎢10−1⎤⎦⎥[1  2  1] G y = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] = [ 1 0 − 1 ] [ 1 2 1 ]

G_y=\left[ \begin{matrix} 1&2&1\\ 0&0&0\\ -1&-2&-1 \end{matrix} \right]= \left[ \begin{matrix} 1\\ 0\\ -1 \end{matrix} \right] \left[ \begin{matrix} 1\ \ 2 \ \ 1 \end{matrix} \right]
求得横向导数和纵向导数之后梯度的求法同前。

Canny检测器

来源:J. Canny, A Computational Approach To Edge Detection, IEEE Trans. Pattern Analysis and Machine Intelligence, 8:679-714, 1986
Canny detector是CV中几乎最常用的edge detector之一,算法如下:

1.使用Sobel operator计算矩阵中各点的梯度,得到规模等同于原图的梯度值矩阵和梯度方向矩阵。
2.采用“非极大抑制(no-maxium suppression,nms)”的方法删除冗余点。
3.使用“滞后阈值(hysteresis thresholding)”的方法确定真正的边缘点并连接。

非极大抑制
顾名思义,”非极大抑制“即”删除一个点集中不是最大的那些点“。自然,该算法的输入应当是一些点集和每个点的可量化性质的值。输出应当是这些点集的一个子集。
承前述,在Canny detector中,输入了一个图像矩阵、梯度幅值矩阵和梯度方向矩阵。为了简化计算,将所有任意的梯度方向就近近似到“水平(0°)、竖直(90°)、斜上(45°)、斜下(135°)”四个方向。对于给定的方向d,对于图像中的某一个点,其周围4个方向上一共有8个点,若方向d上的2个点中存在一个比当前梯度幅值更大的点,则当前的小点抑制归零。其原理如图:

若点(x, y)的梯度方向如图中箭头所指,则选取3个点中梯度幅度最大的点作为edge(绿色线条)在当前梯度方向上的代表。于是问题来了,为什么非最大的点可以删去呢?答案很简单,因为梯度是垂直于edge的呀,一条粗线在横截面上删去若干个(不是全部)点并不会让这条线断掉,对吧?对于所有的点,在各自的梯度方向上执行nms即可删除冗余点。
课程lab中给出了一个例子,对于矩阵 ⎡⎣⎢0.40.30.40.50.50.50.60.70.6⎤⎦⎥ [ 0.4 0.5 0.6 0.3 0.5 0.7 0.4 0.5 0.6 ] \left[ \begin{matrix} 0.4&0.5&0.6\\ 0.3&0.5&0.7\\ 0.4&0.5&0.6 \end{matrix} \right]在四个方向进行nms,可得:

θ=0时:⎡⎣⎢0000000.60.70.6⎤⎦⎥ θ = 0 时 : [ 0 0 0.6 0 0 0.7 0 0 0.6 ]

\theta=0时: \left[\begin{matrix} 0&0&0.6\\ 0&0&0.7\\ 0&0&0.6 \end{matrix} \right]

θ=45时:⎡⎣⎢0.4000.5000.60.70.6⎤⎦⎥ θ = 45 时 : [ 0.4 0.5 0.6 0 0 0.7 0 0 0.6 ]

\theta=45时: \left[\begin{matrix} 0.4&0.5&0.6\\ 0&0&0.7\\ 0&0&0.6 \end{matrix} \right]

θ=90时:⎡⎣⎢0.400.40.50.50.500.70⎤⎦⎥ θ = 90 时 : [ 0.4 0.5 0 0 0.5 0.7 0.4 0.5 0 ]

\theta=90时: \left[\begin{matrix} 0.4&0.5&0\\ 0&0.5&0.7\\ 0.4&0.5&0 \end{matrix} \right]

θ=135时:⎡⎣⎢000.4000.50.60.70.6⎤⎦⎥ θ = 135 时 : [ 0 0 0.6 0 0 0.7 0.4 0.5 0.6 ]

\theta=135时: \left[\begin{matrix} 0&0&0.6\\ 0&0&0.7\\ 0.4&0.5&0.6 \end{matrix} \right]
滞后双阈值
经过筛选的点还需要通过一关才有可能作为最终的edge点。首先设置一低一高两个阈值。这些点中,梯度值小于低阈值的点将被判定不是edge上的点而被忽略;梯度值大于高阈值的点,必然被判定为bedge上的点,称为“strong pixel”(注意这里strong是绝对的);对于梯度值在两阈值中之间的点,观察其周围的8个点,若存在这样一个strong pixel,则判定该点在edge上;若所有的点都不是stong pixel,则判定该点不再edge上。

本节的最后讨论了Sobel operator中Gaussian方差 σ σ \sigma 对检测结果的影响。直观上来说,较大的 σ σ \sigma 可能会是原图像滤波后更加“平滑”(或者“模糊”),因此会使edge更加难以被检测出,观察实验结果可验证以上猜想。

Hough变换

做lab的时候这块死活过不去,在此细细整理一下。
HT可用于检测具有特定结构(参数方程已知)的几何图形(直线、圆圈、etc.),它在有噪点或者部分遮挡(partial occlusion)的环境中具有较好的性能。假设我们已经检测到了一些边缘点,这意味着我们已经有了一些可以部分描述检测几何对象的点,HT要做的就是把这部分恢复成一个完整的几何对象。以下以直线为例进行说明。
对于图像中的任意取定的像素点( xi x i x_i, yi y i y_i),过该点的直线系可以表示为 yi=axi+b y i = a x i + b y_i=ax_i+b的形式,移项得到 b=−xia+yi b = − x i a + y i b=-x_ia+y_i,这样x-y空间中的一个点就变成了a-b空间中的一条直线。同理,x-y空间中的一条直线也就对应于a-b空间中的一个点。且以上两组关系是一一对应的。同样的,x-y空间中的“两点确定一条线段(直线)”对应于a-b空间中的”两条线相交确定一个点”。

HT算法如下:

Input:edge detector产生的一些点坐标。output:图中一个完整object的标注。
1. 量化参数空间:把a-b空间划分成一些小的cell,对每个cell维护一个从0开始的counter;
2. 输入点必然对应于a-b空间内的一些线;
3. 对于2中的这些线,两两相交必然存在一些交点(a’b’);
4. 每一个交点所在的cell的counter分别增加1;
5. 对count超过某一threshold的cell恢复到原x-y空间中,即为检测出的一条直线。

当然了,如果用极坐标描述原图中的点,同样能得到理想的结果。lab中包含了相应的内容,此处不再赘述。一个例子如下:https://youtu.be/4zHbI-fFIlI?t=3m35s
总结一下HT:

好处:
概念在直觉上容易理解;
易于实现;
受部分缺失的信息影响不大;
应用广泛,凡是可以写出参数方程的object均可实现;
不好处:
参数越多计算量越大;
一次只能找出一种object;
Can be “fooled” by “apparent lines”(这句话不知怎么翻译,还请看懂的筒子解释下);
识别结果的长度和范围不能确定;
重合直线无法分离。

CS131学习笔记(lecture5)相关推荐

  1. CS131学习笔记#1

    CS131学习笔记#1 此篇是根据CS131(2020fall) assignment one 总结的学习笔记. 1 卷积(Convolutions) 1.1 卷积定义 在数学上,卷积的定义为: (f ...

  2. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  3. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  5. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  6. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  7. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  8. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  9. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

最新文章

  1. INTERVAL数据类型-007学习笔记
  2. 【转】【C#】判断两个文件是否相同
  3. C++习题 虚函数-计算图形面积
  4. 【渝粤教育】电大中专办公设备使用与维护 (2)_1作业 题库
  5. Linux C学习---递归函数
  6. 【EOJ Monthly 2018.10 - A】oxx 的小姐姐们(模拟,水题,填充矩阵,输出格式有坑)
  7. 【华为云动态】华为云DevCloud助力DevOps标准体系建设
  8. Initializer Lists
  9. Android-SEAndroid权限问题指南
  10. golang chan
  11. zotero本地常见插件配置,新电脑配置zotero,新手入门
  12. CSV文件用Excel打开各种问题
  13. 编辑器之神——vim编辑器
  14. 漫谈测试成长之探索——测试排期
  15. 逆袭之路——python 数据库字符编码与配置、存储引擎、字段类型及约束条件【day46】
  16. thinksns开源微博系统 V3上传漏洞
  17. win10家庭版远程桌面控制解决
  18. 数采物联仪表照片抓拍AI图像识别软件使用说明
  19. 微众银行DSS部署单机-普通版
  20. jzxx1099 2的100次方

热门文章

  1. 加密密钥暴力破解所需时间
  2. 谷歌浏览器插件Automa_5.数据存储及保存
  3. (三)【数学建模】Matlab BP神经网络
  4. mysql tee使用_MYSQL tee的功能测试
  5. 怎么用计算机开方知识点,高中数学知识点:开平方根的方法和步骤
  6. 第一届机电汇产业联盟供需对接会成功举办
  7. RabbitMQ订单超时(面试问答)
  8. 网秦发布2017年第一季度、第二季度及第三季度财报
  9. 求字符串长度【三种解题思路】
  10. (软件工程)——概要设计说明书