首页 > 其他 > 详细

OpenCV学习笔记(八) 边缘检测

时间:2014-03-04 02:49:02      阅读:711      评论:0      收藏:0      [点我收藏+]

边缘检测

对图像进行边缘检测之前,一般都需要先进行降噪(可调用GaussianBlur函数)。

Sobel算子 与 Scharr算子

都是一个离散微分算子 (discrete differentiation operator),用来计算图像灰度函数的近似梯度。结合了高斯平滑和微分求导。Sobel算子与Scharr算子的内核不同,Sobel内核产生误差比较明显,Scharr更为准确一些。

Sobel算子的计算步骤:

  1. 在两个方向求导:将原图分别与两个3x3的内核进行卷积计算,得到Gx与Gy
  2. 在图像的每一点,结合Gx与Gy求出近似 梯度 :

bubuko.com,布布扣 或者 bubuko.com,布布扣 (简单公式)

1
2
3
4
5
6
7
8
9
10
11
12
/// 求 X方向梯度
//Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
convertScaleAbs( grad_x, abs_grad_x );
 
/// 求Y方向梯度
//Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
convertScaleAbs( grad_y, abs_grad_y );
 
/// 合并梯度(近似)
addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );
  • src_gray: 在本例中为输入图像,元素类型 CV_8U
  • grad_x/grad_y: 输出图像.
  • ddepth: 输出图像的深度,设定为 CV_16S 避免外溢。
  • x_orderx 方向求导的阶数。
  • y_ordery 方向求导的阶数。

Laplace算子

 计算的是二阶导数。由于 Laplacian使用了图像梯度,它内部调用了 Sobel 算子。Laplacian 算子 的定义:

bubuko.com,布布扣

1
2
Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
convertScaleAbs( dst, abs_dst );
  • src_gray: 输入图像。
  • dst: 输出图像
  • ddepth: 输出图像的深度。 因为输入图像的深度是 CV_8U ,这里我们必须定义 ddepth = CV_16S 以避免外溢。
  • kernel_size: 内部调用的 Sobel算子的内核大小,此例中设置为3。
  • scaledelta 和 BORDER_DEFAULT: 使用默认值。

Canny边缘检测

被很多人认为是边缘检测的 最优算法。在Sober算子步骤后添加以下步骤:

  • 非极大值 抑制。 这一步排除非边缘像素, 仅仅保留了一些细线条(候选边缘)。
  • 滞后阈值: 最后一步,Canny 使用了滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值):
    1. 如果某一像素位置的幅值超过  阈值, 该像素被保留为边缘像素。
    2. 如果某一像素位置的幅值小于  阈值, 该像素被排除。
    3. 如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于  阈值的像素时被保留。

Hough变换

OpenCV学习笔记(八) 边缘检测,布布扣,bubuko.com

OpenCV学习笔记(八) 边缘检测

原文:http://www.cnblogs.com/ericxing/p/3578478.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!