OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
拉普拉斯算子

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

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

目标

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

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

理论

  1. 在上一个教程中,我们学习了如何使用 *Sobel 算子*。它基于这样一个事实:在边缘区域,像素强度显示“跳跃”或强度的高变化。获得强度的第一导数后,我们观察到边缘的特征是最大值,如下图所示
  1. 那么……如果我们取二阶导数会发生什么?

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

拉普拉斯算子

  1. 从上面的解释中,我们可以推断出二阶导数可用于 *检测边缘*。由于图像是“二维”的,我们需要在两个维度上都求导数。在这里,拉普拉斯算子派上用场。
  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。
    • scale, deltaBORDER_DEFAULT: 我们将它们保留为默认值。

将输出转换为CV_8U图像

显示结果

结果

  1. 编译上面的代码后,我们可以运行它,并给出图像的路径作为参数。例如,使用以下输入
  1. 我们得到以下结果。注意树木和奶牛的轮廓是如何被大致清晰地定义的(除了强度非常相似的区域,即奶牛头部周围)。另外,请注意树后房屋的屋顶(右侧)被明显地标记出来。这是因为该区域的对比度更高。