OpenCV核心模块核心提炼(三) —— 边缘检测之拉普拉斯

理论

  1. 在上一个教程中,我们学习了如何使用Sobel算子。这是基于以下事实:在边缘区域中,像素强度显示出“跳跃”或强度的高度变化。获得强度的一阶导数,我们观察到边缘的特征是最大值,如图中所示:

    以前的理论
  2. 那么.....如果我们采用二阶导数会发生什么?

    二阶导数

    您可以观察到二阶导数为零!因此,我们也可以使用此标准来尝试检测图像中的边缘。但请注意,零不仅会出现在边缘(它们实际上可能出现在其他无意义的位置); 这可以通过在需要时应用过滤来解决。

拉普拉斯算子

  1. 从上面的解释,我们推断出二阶导数可用于检测边缘。由于图像是“ 2D ”,我们需要在两个维度上采用导数。拉普拉斯算子在这里很方便。
  2. 拉普拉斯算子被定义为:

拉普拉斯(f)= \ dfrac {\ partial ^ {2} f} {\ partial x ^ {2}} + \ dfrac {\ partial ^ {2} f} {\ partial y ^ {2}}

  1. Laplacian算子由OpenCV函数Laplacian实现。实际上,由于拉普拉斯算子使用图像的梯度,因此它在内部调用Sobel算子来执行其计算。

说明

  1. 创建一些所需的变量:

    Mat src, src_gray, dst;
    int kernel_size = 3;
    int scale = 1;
    int delta = 0;
    int ddepth = CV_16S;
    char* window_name = "Laplace Demo";

     

  2. 加载源图像:

    src = imread( argv[1] );
    
    if( !src.data )
      { return -1; }

     

  3. 应用高斯模糊来减少噪音:

    GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );

     

  4. 使用cvtColor将图像转换为灰度

    cvtColor( src, src_gray, CV_BGR2GRAY );

     

  5. 将拉普拉斯算子应用于灰度图像:

    Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );

    参数在哪里:

    • src_gray:输入图像。
    • dst:目标(输出)图像
    • ddepth:目标图像的深度。由于我们的输入是CV_8U,我们定义ddepth = CV_16S以避免溢出
    • kernel_size:要在内部应用的Sobel运算符的内核大小。我们在这个例子中使用3。
    • scaledeltaBORDER_DEFAULT:我们将它们保留为默认值。
  6. 将拉普拉斯算子的输出转换为CV_8U图像:

    convertScaleAbs( dst, abs_dst );

     

  7. 在窗口中显示结果:

    imshow( window_name, abs_dst );

     

结果

  1. 在编译上面的代码之后,我们可以运行它作为参数给出图像的路径。例如,使用输入:

    原始测试图像
  2. 我们得到以下结果。注意奶牛的树木和轮廓是如何定义的(除了在强度非常相似的区域,即在牛的头部周围)。此外,请注意树木后面的屋顶(右侧)是众所周知的标记。这是因为该区域的对比度较高。

    原始测试图像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值