边缘检测(Edge Detection), 人类辨识物体实际上就是根据物体的轮廓来识别的。而这个轮廓在机器视觉领域就是边缘(Edge).

如果有最优的边缘检测算法,那么经过算法后的输出的图像跟画家素描的图像差不多。

目标:识别出图像中的突然变化(不连续)。

边缘有什么用?

  1. 提取信息,识别物体
  2. 恢复几何和视角

那些可以看做是边缘?

  1. surface normal discontinuity.
  2. depth discontinuity
  3. surface color discontinuity
  4. illumination discontinuity

边缘检测器(Edge Detector)

简单的边缘检测器

Image Gradient:

水平方向的梯度:

垂直方向的梯度:

合成梯度的幅度:

梯度的方向: , 注意,这里并不一定是90啊。 除非比值是无穷大才行啊。

如果图像中有很多噪声的话,那么梯度值得变化就很多,所以就很难判断出哪里是真的边缘。所以必须要进行滤波。

假设滤波器函数为g, 那么滤波后的图像就是原始图像f和滤波器g的卷积。然后再对平滑的图像做梯度计算,不过这里有一个小技巧可以减少运算量。

但是,这样找出的边缘比较厚。

那么好的边缘检测器需要有什么特点呢?

  1. Good Detection: the optimal detector must minimize the false positives and false negatives.
  2. Good Localization:the edges detected must be as close as possible to the real edges.
  3. Single response:the detector must return one point for each real edge.

Canny edge detector

please refer to (http://fwang.ml/computer%20vision/Canny-Edge-Detection/)[http://fwang.ml/computer%20vision/Canny-Edge-Detection/].

  • 在机器视觉领域应用最广泛的
  • 理论模型:step-edges corrupted by the additive Gaunssian noise
  • Canny展示了高斯的一阶导数非常接近能够优化信噪比和localization的平衡关系。
edge(image, 'canny');

RANSAC (Random Sample Consensus)

因为像canny这类边缘检测器检测出的边缘太复杂,而人们看某一物体的时候这些细节的边缘可能并不关心。只需要找到构成此物体的线条就可以,Line fitting.

基本思想:就是找一条线,能够最大限度的满足所有的点,使误差最小。这个思路跟machine learning中介绍的Linear regression非常相似。

步骤:

  1. 选择inlier的最大误差
  2. 选择inlier的个数
  3. 选择迭代次数
  4. 随机从样本中选择几个样本,拟合出曲线。
  5. 计算其他样本跟曲线的距离
  6. 如果距离小于最大误差,那么认为此样本属于inlier.
  7. 用所有的inlier拟合曲线
  8. 计算拟合的曲线和样本的距离之和。
  9. 比较距离之和,在迭代中选择最小值。
  10. 保存距离之和最小的曲线参数,返回。