OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
拉普拉斯算子

上一个教程: Sobel 导数
下一个教程: Canny 边缘检测器

原始作者Ana Huamán
兼容性OpenCV >= 3.0

目标

在本教程中,您将学习如何

  • 使用 OpenCV 函数 Laplacian() 实现 *拉普拉斯算子* 的离散模拟。

理论

  1. 在上一教程中,我们学习了如何使用 *Sobel 算子*。其原理是,在边缘区域,像素强度会显示出“跳跃”或剧烈变化。获取强度的第一个导数时,我们观察到边缘的特征是出现最大值,如下图所示
  1. 那么……如果我们取二阶导数会发生什么呢?

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

拉普拉斯算子

  1. 从上面的解释中,我们可以推断出二阶导数可以用于 *检测边缘*。由于图像是“2D”的,我们需要在两个维度上取导数。在这里,拉普拉斯算子就派上用场了。
  2. 拉普拉斯算子 定义为

    \[Laplace(f) = \dfrac{\partial^{2} f}{\partial x^{2}} + \dfrac{\partial^{2} f}{\partial y^{2}}\]

  3. 拉普拉斯算子在 OpenCV 中通过函数 Laplacian() 实现。事实上,由于拉普拉斯算子使用了图像的梯度,它在内部调用 *Sobel* 算子来执行其计算。

代码

  1. 此程序的作用是什么?
    • 加载图像
    • 通过应用高斯模糊来去除噪声,然后将原始图像转换为灰度图
    • 将拉普拉斯算子应用于灰度图像并存储输出图像
    • 在窗口中显示结果

解释

声明变量

加载源图像

降噪

灰度化

拉普拉斯算子

  • 参数为
    • src_gray:输入图像。
    • dst: 目标(输出)图像
    • ddepth:目标图像的深度。由于我们的输入是 CV_8U,我们将 ddepth 定义为 CV_16S 以避免溢出。
    • kernel_size:内部应用的 Sobel 算子的核大小。在此示例中我们使用 3。
    • scaledeltaBORDER_DEFAULT:我们保留其默认值。

将输出转换为 CV_8U 图像

显示结果

结果

  1. 编译上述代码后,我们可以通过提供图像路径作为参数来运行它。例如,使用以下输入:
  1. 我们得到以下结果。请注意,树木和奶牛的轮廓近似清晰(除了强度非常相似的区域,例如奶牛头部周围)。此外,请注意树木后面(右侧)房屋的屋顶被显著标记。这是因为该区域的对比度较高。