OpenCV 4.10.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。
    • scale, deltaBORDER_DEFAULT:我们将其保留为默认值。

将输出转换为<em>CV_8U</em> 图像

显示结果

结果

  1. 在编译完上面的代码后,我们可以运行它,并给出一个图像路径作为参数。例如,使用作为输入
  1. 我们得到以下结果。注意树木和奶牛的轮廓几乎定义得很好(除了强度非常相近的区域,即奶牛头部周围)。另外,注意树木后面的房顶(右侧)非常明显。这是因为该区域的对比度更高。