Opencv图像处理---Laplace运算

理论

  • 在边缘区域中,像素强度显示出“跳跃”或强度的高度变化。 获得强度的一阶导数,我们观察到边缘的特征是最大值,如图所示:Opencv图像处理---Laplace运算_第1张图片
  • 您可以观察到二阶导数为零! 因此,我们也可以使用此标准来尝试检测图像中的边缘。 但请注意,零不仅会出现在边缘(它们实际上可能出现在其他无意义的位置); 这可以通过在需要时应用过滤来解决。Opencv图像处理---Laplace运算_第2张图片

Laplacian 算子

  • 我们推断出二阶导数可用于检测边缘。 由于图像是2D,我们需要在两个维度上采用导数,拉普拉斯算子在这里很方便。
  • 拉普拉斯算子由以下定义:
  • 拉普拉斯算子由OpenCV函数cv :: Laplacian实现。 实际上,由于拉普拉斯算子使用图像的梯度,因此它在内部调用Sobel算子来执行其计算。

代码

代码流程

  • 加载图像
  • 通过应用高斯模糊消除噪声,然后将原始图像转换为灰度
  • 将拉普拉斯算子应用于灰度图像并存储输出图像
  • 在窗口中显示结果
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include 
#include 
using namespace cv;
int main( int, char** argv )
{
  Mat src, src_gray, dst;
  int kernel_size = 3;
  int scale = 1;
  int delta = 0;
  int ddepth = CV_16S;
  const char* window_name = "Laplace Demo";
  src = imread( argv[1] );
  if( src.empty() )
    { return -1; }
  GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
  cvtColor( src, src_gray, COLOR_RGB2GRAY );
  namedWindow( window_name, WINDOW_AUTOSIZE );
  Mat abs_dst;
  Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( dst, abs_dst );
  imshow( window_name, abs_dst );
  waitKey(0);
  return 0;
}

解释

  • 创建一些所需的变量:
  • 加载源图像:
  • 应用高斯滤波来减少噪音:
  • 使用cv :: cvtColor将图像转换为灰度
  • 将拉普拉斯算子应用于灰度图像:
  1. src_gray:输入图像
  2. dst:目标(输出)图像
  3. ddepth:目标图像的深度。 由于我们的输入是CV_8U,我们定义ddepth = CV_16S以避免溢出
  4. kernel_size:要在内部应用的Sobel运算符的内核大小。
  5. scale,delta和BORDER_DEFAULT:我们将它们保留为默认值。
  • 将拉普拉斯算子的输出转换为CV_8U图像:
  • 在窗口中显示结果:

结果

  • 在编译上面的代码之后,我们可以运行它作为参数给出图像的路径。 例如,使用输入Opencv图像处理---Laplace运算_第3张图片
  • 我们得到以下结果。 注意奶牛的树木和轮廓是如何定义的(除了强度非常相似的区域,即奶牛头部周围)。 此外,请注意树木后面的屋顶(右侧)是众所周知的标记。 这是因为该区域的对比度较高。
  • ​​​​​​​Opencv图像处理---Laplace运算_第4张图片

你可能感兴趣的:(OpenCV教程)