图像边缘检测初步

来源:互联网 发布:jira linux 破解版 编辑:程序博客网 时间:2024/06/04 18:49

基本边缘检测算子

边缘检测算子与前面提到的平滑算子有一个区别是平滑算子的所有系数求和结果为1,这是因为要保证一个常值信号进来进行滤波后其结果仍是常值信号,而边缘检测算子的所有系数求和结果一定为0,因为如果是一个常值信号则他是没有边缘的。且边缘检测算子分为x方向和y方向。
边缘检测的本质是进行微分,在实际中常用差分。
- Sobel算子卷积核
这里写图片描述
- Prewitt算子卷积核
这里写图片描述
- Laplace算子
这里写图片描述
上式的意思是:先对原始图像做高斯滤波(即与G(x,y)做卷积),然后对其结果求2次梯度(即2阶导数)。上式可推导为先对高斯滤波器求2阶导数后再与原始图像做卷积。将高斯滤波器的2阶导数记为LoG,则以后简化为常值LoG与原始图像f(x,y)的卷积。上面左图中最上方曲线g0即为高斯函数,g1为其1阶导数,g2为其2阶导数。右图是进行了卷积之后的结果,即Laplace算子。
而Laplace算子的作用,由于边缘一定存在着灰度的跳变,一维求导后原先的灰度跳变就会表现为梯度值的跳变,二维求导后其应该表现为过0的曲线。故由二阶导数的性质看其是否过0即可检测出原图是否是边缘。

Canny算子

上面提到的几种简单算子存在以下问题:

  • 会放大图像中的噪声,因为原图中噪声与正常值的符号通常是相反的,而在进行微分或差分的过程中并不能消掉这种符号相反的值反而会加大(如1-(-1) =2而非0)。故在以上方法中会放大图像的噪声。
  • 边缘的断裂,实际应用中由于光线的影响会导致边缘的断裂。
  • 边缘的虚检,即原图中非边缘的部分检测(渐变灰度的部分)为边缘。

而Canny算子可以有效的改善以上几种情况,并可以自动连通一定程度内的断裂的边缘。其算法步骤如下:

  1. 平滑图像同时计算微分
  2. 计算梯度(幅值和方向)
  3. 梯度幅值进行非极大值抑制
  4. 自动边缘连接

具体说明如下:

1.同时平滑与微分:
这里写图片描述
既然前面提到微分会加大图像中的噪声,那么首先对图像做平滑处理就不难理解了。使用高斯函数的一阶导数与原图像做卷积得到平滑后的结果。其高斯函数的一阶导数也可以用前面提到的Sobel算子。
注意x方向与y方向要分别进行计算,分别得到x方向的水平边缘图与y方向的垂直边缘图。
这里写图片描述

2.得到梯度幅值和方向
由上面的结果可以进一步求出梯度幅值和方向,如下所示:
这里写图片描述
注意上图中的arctan后应该是Ey/Ex,图中写倒了。。
在得到方向的值之后,再做一步方向的离散化处理:
这里写图片描述
根据方向角度值与上图将其离散化为0,1,2,3。

3.梯度幅值的非极大值抑制
这一步首先要做的是细化梯度幅值图像中的屋脊带,只保留幅值局部变化最大的点。这句话的意思其实就是只保留局部的极大值点。第二步是使用一个3x3领域作用于幅值阵列的所有点。在每一点上,邻域的中心像素与沿梯度方向的两个幅度幅值的插值结果进行比较,仅保留极大值点。

4.边缘连接
对上一步得到的图像使用低、高阈值τ 1,τ 2进行阈值化,得到三幅图像:
这里写图片描述
T1对应假边缘,去除;
T3对应真边缘,全部保留;
T2连接:邻接像素中是否有属于T3的像素

原创粉丝点击