根据 Stanford CS131 课程写的笔记(大部分为 note 翻译),英语水平一般,如有错误请评论指正
Lecture 5 Edge Detection
Edge Detection in Mammals
Hubel & Wiesel
两个人的实验表明,猫的视觉神经在碰到特定方向的边缘时,会产生反应。
Biederman
Biederman 的实验表明,人们在只看到物品一半的轮廓时,仍能识别物体且速度不受影响。这给计算机视觉提供了一个想法:即使只展现图像的一部分,一个系统理论上应该能够识别整个物品。
Walther, Chai, Caddigan, Beck & Fei-Fei
一群研究者发现大脑的低层次在识别轮廓方面更强,而高层次对颜色识别能力更强。
Edge Detection for Computer Vision
边缘检测的目的是检测图像中的不连续部分。直观来讲,图像的大部分语义学和形状信息可以在图像边缘被编码。边缘可以帮助我们提取信息、识别物体、恢复几何和视角。
Types of Discrete Derivative(离散导数) in 1D
主要有三类,它们的公式和对应的滤波器为:
Backward
dfdx=f(x)−f(x−1)=f′(x)[0,1,−1] d f d x = f ( x ) − f ( x − 1 ) = f ′ ( x ) [ 0 , 1 , − 1 ]Forward
dfdx=f(x)−f(x+1)=f′(x)[−1,1,0] d f d x = f ( x ) − f ( x + 1 ) = f ′ ( x ) [ − 1 , 1 , 0 ]Central
dfdx=f(x+1)−f(x−1)=f′(x)[1,0,−1] d f d x = f ( x + 1 ) − f ( x − 1 ) = f ′ ( x ) [ 1 , 0 , − 1 ]
Discrete Derivative in 2D
Gradient vector
∇f(x,y)=[fxfy] ∇ f ( x , y ) = [ f x f y ]Gradient magnitude
|∇f(x,y)|=f2x+f2y−−−−−−√ | ∇ f ( x , y ) | = f x 2 + f y 2Gradient direction
θ=tan−1(dfdydfdx) θ = t a n − 1 ( d f d y d f d x )
Example
矩阵的梯度可以近似为用基于中心离散倒数方程的相邻像素拓展到 2D。一个水平滤波器如下:
当这个滤波器覆盖在像素 x[m,n] x [ m , n ] 上,可以产生一个输出。这个输出近似于于像素 (m,n) ( m , n ) 在水平方向上的梯度,这个滤波器检测水平边缘,同样需要一个单独的内核检测垂直边缘。
Simple Edge Detectors
Characterizing Edges
描述边缘是检测边缘的第一步,是为了边缘可以被识别。首先,定义边缘为图片的强度函数快速变化的位置,也是导数较大的位置。
Image Gradient
图片的梯度可以被定义为
同时,方向与边缘强度可以被定义为
梯度向量的方向指向强度变化最快的方向,如上图所示。下图为将梯度应用于图像后的结果。
Effects of Noise
如果边缘噪音过多,偏导数可能无法很好的检测边缘,如下图。
为了减少噪音影响,图片首先要光滑化。光滑化是重新计算像素值,使得该像素值和周围像素更相似的过程。光滑化是通过将滤波器和图像卷积来实现的(例如:高斯核)。
当然,光滑化也有损失:模糊了边缘;较大的滤波器会导致边缘损失和图片有用的细节损失。
总而言之,合适的光滑化可以促进边缘检测。在光滑化 f f 后,就可以计算 ,顶峰处为边缘。
Gaussian Blur
高斯模糊是用高斯函数减少图片噪音的结果。它是一个低通滤波器,用于降低高频率信号。
一维
二维
Designing a Good Edge Detector
一个可行的边缘检测器必须有以下性质:
检测效果好
必须最小化检测为误报(false positives, 由噪音导致的假性边缘)和漏报率(false negatives,漏掉真的边缘)的可能性。
定位好
检测的边缘位置必须与原图实际边缘吻合。检测器还必须在检测哪些像素位于边缘上保持一致。
Silent response
检测器必须最小化真正边缘附近的局部极大值,即每个真正的边缘点只返回一个点。它应该要告知这里有一个特定的边缘,而不是将一个边缘分散为数个边缘。换句话说,只有真正的边缘会被捕捉到。
下图是正确的边缘;1 稳健性差;2 定位差;3 过多响应