边缘检测(Edge Detection), 人类辨识物体实际上就是根据物体的轮廓来识别的。而这个轮廓在机器视觉领域就是边缘(Edge).
如果有最优的边缘检测算法,那么经过算法后的输出的图像跟画家素描的图像差不多。
目标:识别出图像中的突然变化(不连续)。
边缘有什么用?
- 提取信息,识别物体
- 恢复几何和视角
那些可以看做是边缘?
- surface normal discontinuity.
- depth discontinuity
- surface color discontinuity
- illumination discontinuity
边缘检测器(Edge Detector)
简单的边缘检测器
Image Gradient:
水平方向的梯度:
垂直方向的梯度:
合成梯度的幅度:
梯度的方向: , 注意,这里并不一定是90啊。 除非比值是无穷大才行啊。
如果图像中有很多噪声的话,那么梯度值得变化就很多,所以就很难判断出哪里是真的边缘。所以必须要进行滤波。
假设滤波器函数为g, 那么滤波后的图像就是原始图像f和滤波器g的卷积。然后再对平滑的图像做梯度计算,不过这里有一个小技巧可以减少运算量。
但是,这样找出的边缘比较厚。
那么好的边缘检测器需要有什么特点呢?
- Good Detection: the optimal detector must minimize the false positives and false negatives.
- Good Localization:the edges detected must be as close as possible to the real edges.
- 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非常相似。
步骤:
- 选择inlier的最大误差
- 选择inlier的个数
- 选择迭代次数
- 随机从样本中选择几个样本,拟合出曲线。
- 计算其他样本跟曲线的距离
- 如果距离小于最大误差,那么认为此样本属于inlier.
- 用所有的inlier拟合曲线
- 计算拟合的曲线和样本的距离之和。
- 比较距离之和,在迭代中选择最小值。
- 保存距离之和最小的曲线参数,返回。