CS131学习笔记(lecture5)

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

图像梯度(gradient)

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

d f ( x ) d x = lim x 0 f ( x ) f ( Δ x ) Δ x = f ( x )

后向:
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 ]

前向:
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 ]

中心:
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 ]

举例:序列 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 ) y 可引入梯度的概念,梯度是个矢量,其方向和大小分别为 arctan f y ( x , y ) f x ( x , y ) , f y 2 ( x , y ) + f x 2 ( x , y )
举例1:令
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 ]

则由x向导数滤波器和y向导数滤波器获得x向导数 I x 和y向导数矩阵 I y ,综合求得梯度值矩阵和梯度方向矩阵。
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 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 ]

举例2:对以下左图矩阵按照图示的卷积kernel求x向导数和y向导数并作图:
这里写图片描述
可知图片中x向导数受竖线影响较大,可以刻画原图中经向边缘的性质,y向导数受横线影响较大,可以刻画原图中纬向边缘的性质。由此我们获得了一个简单的边缘检测器。

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

前面得到的简单detector有一个很致命的缺点——受噪点影响极大。原因是在某个方向上,噪点和两侧像素点的差异近似于边缘处和两侧像素点的差异。考虑到噪点只是一个孤立的点,而边缘是全平面上一些有联系的点的集合,我们采用光滑处理(smoothing)然后求导的办法,如均匀光滑(mean smoothing)和高斯滤波(Gaussian)等,然而数学上先高斯后卷积的过程( d d x ( f g ) )等价于直接和高斯滤波器的导数进行卷积( d f d g d x ),由此我们得到了一个有一定抗噪声能力的入门级edge detector。
噪点对梯度的影响
Canny提出,一个好的edge detector必须具有以下特点:
高信噪比——既要不错过边缘,又要能克服噪声的影响,即:不能把噪声检测为边缘,又忽略真正的边缘。
高定位精度——检测结果要尽可能地与真实边缘重合,检测结果不能离真实的边缘太远。
低误报率——一个边就应该用最少的像素刻画,不能一条实际3个像素宽的边,检测结果变成30个像素。
(注:这三个特点的汉译来自《计算机视觉一种现代方法》,和讲义中的直译相距甚远,但含义近似)
为达到以上效果,本课后续介绍了两个经典的edge detector。

Sobel检测器

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

G x = [ 1 0 1 2 0 2 1 0 1 ] = [ 1 2 1 ] [ 1     0     1 ]

G y = [ 1 2 1 0 0 0 1 2 1 ] = [ 1 0 1 ] [ 1     2     1 ]

求得横向导数和纵向导数之后梯度的求法同前。

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个点中存在一个比当前梯度幅值更大的点,则当前的小点抑制归零。其原理如图:
NMS
若点(x, y)的梯度方向如图中箭头所指,则选取3个点中梯度幅度最大的点作为edge(绿色线条)在当前梯度方向上的代表。于是问题来了,为什么非最大的点可以删去呢?答案很简单,因为梯度是垂直于edge的呀,一条粗线在横截面上删去若干个(不是全部)点并不会让这条线断掉,对吧?对于所有的点,在各自的梯度方向上执行nms即可删除冗余点。
课程lab中给出了一个例子,对于矩阵 [ 0.4 0.5 0.6 0.3 0.5 0.7 0.4 0.5 0.6 ] 在四个方向进行nms,可得:

θ = 0 : [ 0 0 0.6 0 0 0.7 0 0 0.6 ]

θ = 45 : [ 0.4 0.5 0.6 0 0 0.7 0 0 0.6 ]

θ = 90 : [ 0.4 0.5 0 0 0.5 0.7 0.4 0.5 0 ]

θ = 135 : [ 0 0 0.6 0 0 0.7 0.4 0.5 0.6 ]

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

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

Hough变换

做lab的时候这块死活过不去,在此细细整理一下。
HT可用于检测具有特定结构(参数方程已知)的几何图形(直线、圆圈、etc.),它在有噪点或者部分遮挡(partial occlusion)的环境中具有较好的性能。假设我们已经检测到了一些边缘点,这意味着我们已经有了一些可以部分描述检测几何对象的点,HT要做的就是把这部分恢复成一个完整的几何对象。以下以直线为例进行说明。
对于图像中的任意取定的像素点( x i , y i ),过该点的直线系可以表示为 y i = a x i + b 的形式,移项得到 b = x i a + y i ,这样x-y空间中的一个点就变成了a-b空间中的一条直线。同理,x-y空间中的一条直线也就对应于a-b空间中的一个点。且以上两组关系是一一对应的。同样的,x-y空间中的“两点确定一条线段(直线)”对应于a-b空间中的”两条线相交确定一个点”。
HT
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”(这句话不知怎么翻译,还请看懂的筒子解释下);
识别结果的长度和范围不能确定;
重合直线无法分离。

猜你喜欢

转载自blog.csdn.net/tfcy694/article/details/79732319