边缘检测

边缘表示了一个图像的重要信息,hin重要

Paste_Image.png

边缘检测目标:
确定图像中突然变化的部分
为啥边缘检测:
后续可以提取信息,识别物体,恢复几何图形

Paste_Image.png

边缘的起源
表面不连续

Paste_Image.png

深度不连续

Paste_Image.png

平面颜色的变化

Paste_Image.png

还有光照的不连续

确定边缘##

边缘是图像像素快速变化的地方

Paste_Image.png

图像的梯度,梯度是矢量,有大小有方向

Paste_Image.png
Paste_Image.png
Paste_Image.png

图像梯度栗子

Paste_Image.png

这种通过图像梯度的方法检测边缘固然好,然而未经去噪处理的图像辣鸡

Paste_Image.png

显然梯度难以看出边缘在哪儿
解决方案:首先先平滑图像,也即使得图像中每个像素和他周围的像素接近

Paste_Image.png

此时最后一张图中的峰值即为我们认为的边缘位置
由卷积的微分特性

Paste_Image.png
Paste_Image.png

在图像中我们实际使用的是二维高斯正太函数

Paste_Image.png

使用高斯平滑滤波器的缺点:
降噪的同时,会使得边缘变宽,这实际上是一种tradeoff

Paste_Image.png

一些实现方面的细节
实际上像素梯度幅度并不是一个冲击函数,而更像一个单位方波函数,这使得我们在选取作为边缘的点时很棘手
我们怎么样才能把选取的边界点连起来形成曲线呢?
在说明上述问题之前,我们首先说明一个好的边缘检测器所具备的特征。
(1)对噪声鲁棒,既不多检测边缘点,又不少检测边缘点。
(2)好的定位,边缘点尽可能和实际边缘位置接近
(3)别太粗,一个实际边界点只有一个边缘点输出。

Paste_Image.png

大名鼎鼎的Canny 边缘检测##

(1)首先计算DoG(Derivative of Gaussian)

Paste_Image.png

(2)获取每个像素梯度的幅度和方向
(3)非极大值抑制

Paste_Image.png

非最大抑制是回答这样一个问题:“当前的梯度值在梯度方向上是一个局部最大值吗?“

所以,要把当前位置的梯度值与梯度方向上两侧的梯度值进行比较。梯度方向垂直于边缘方向。但实际上,我们只能得到C点邻域的8个点的值,而梯度方向上的值并不在其中,要得到这两个值就需要对该两个点两端的已知灰度进行线性插值,这要用到其梯度方向,这是Canny算法中要求解梯度方向矩阵的原因。

(4)双阈值法(Hysteresis thresholding)把边缘点连起来
设置两个阈值,一个高阈值一个低阈值
高阈值说明筛选比较严格,则选取的边缘点比较少,这些一定是边的组成,但可能边不连续
低阈值则会筛选很多边缘点,有的是边的组成,有的不是。
对于高阈值边不连续的情况,我们选取梯度正交的方向的低阈值点作为边界,例如下图中的r或者s

Paste_Image.png

细节问题
高斯平滑函数方差的选择对结果的影响

Paste_Image.png

大的方差检测大致的边缘。
小的方差会检测出来很多细节

除了canny这种梯度求边界的算法外,我们还可以根据颜色聚类、语义分析或者他们的组合来进行边界求解,这些算法和人类手工选取边界效果对比如下

Paste_Image.png

RANSAC##

Random Sample Consensus
假设我们上面找到了边界点,那么我们想从这些边界点中你和几条边界“直线”,改怎么做?
问题的难点在于我们不知道哪些点是属于哪些边的。
所以现在问题化为:
我们有一些我们需要的点来拟合一条直线,但是这些点又掺进去许多非此直线的数据(噪声、其他直线等等),那么我们怎样选择适合这条直线的点来找到这条直线。
也即这种方法将所有的点分为两类,inline(用来拟合) outline(是噪声)

Paste_Image.png

显然最小二乘法不再适用,因为这种方法会考虑所有数据对结果的影响。
这里我么内采用RANSAC方法,我们随机选点拟合直线,如果在这条直线误差范围内的点足够多,那么我们认为这是一个好的拟合。

Paste_Image.png

关于迭代次数的选择,自然是越多越好,但多的话浪费时间,所以这里我们估一个大概值

Paste_Image.png

选择k让这个值小于0.05.

你可能感兴趣的:(边缘检测)