边缘检测
什么叫边缘?
"You can easily notice that in an edge, the pixel intensity changes in a notorious way."
边缘就是像素亮度剧烈变化的地方。
怎么检测边缘?
"A good way to express changes is by using derivatives. A high change in gradient indicates a major change in the image."
导数就用来描述变化,梯度变化越大图像改变越多。
一:Sobel算子
(一)理论依据:
假设我们有一副有一维图像,图像中灰度值的跳跃点就是边缘,如图1所示。
图1 一维图像中的边缘为“跳跃点”
图2 对一维图像求导,最高点为边缘点
"locating pixel locations where the gradient is higher than its neighbors (or to generalize, higher than a threshold)."
梯度比邻域像素或者特定阈值大的像素点就是边缘。
(二):Sobel算子
在水平x方向求导:
在竖直y方向求导:
梯度的运算和近似运算公式:
(运算公式)
(近似公式)
也即是说检测过程只需要对分别进行了x和y方向求导的输出图像用近似梯度相加合并得到最终图像。
二:Laplace算子
对上图2再求导得到图3所示的二阶导数图像:
图3 二阶导数
可以看到现在我们一阶导数检测边缘为边缘的地方像素变为0 ,所以我们可以认为从非零到0是一个边缘(图3的左上部分,亮度由暗变亮)同时0到非零是一个边缘(图3 的右下部分,原图是亮度亮由暗)。
也就是说拉普拉斯算子可以检测出双边缘!
【这里推荐一篇博客,可以对这个有较好的解释:http://blog.csdn.net/xiaowei_cqu/article/details/7829481】
三:Canny边缘检测
(一)1996年由John F. Canny提出的Canny边缘检测,是边缘检测算法中的最优良算法。
Canny算法旨在满足三个特性:
低错率:对边缘做出检测,并且不把不是的检测为边缘
高定位性:检测出的边缘和实际边缘位置的距离最小
小响应性:边缘最好只被标识一次
(二)Canny算法的步骤:
1:高斯平滑消去噪声
2:计算梯度的强度(幅值)和方向
A:用一下公式运行一次Sobel算子
B:用一下公式计算幅值和方向
最好能将角度控制在0,45,90,135度左右
3:非极大值抑制
这样除去了不是边缘的像素,留下的是候选的边缘
4:滞后阈值: 最后一步,Canny 使用了滞后阈值,滞后阈值需要两个阈值(高的和低的阈值):
1:如果某一像素位置的梯度超过 高阈值, 该像素被保留为边缘
b.如果某一像素位置的梯度小于 低阈值, 该像素被排除
c.如果某一像素位置的梯度在两个阈值之间,该像素仅仅在连接到一个高于高阈值的像素时被保留。
Canny 推荐的高低阈值比在 2:1 到3:1之间。