Laplace 算子-边界检测

墨蓝 2022-03-30 04:58 312阅读 0赞

原理

  • 当一个图像在像素值变化大的地方(比如边界),对其取 first derivative ,得到:

20190104210748294.png

second derivative 得到 :

20190104211014983.png

变化最大的地方,一阶导数最大,二阶导数为0,前者是Sobel算子所为,后者便是 Laplace 算子所为

  • 公式

因为图像是2D的,所以对两个方向求二阶导数:

20190104211723366.png


例子

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace cv;
  4. using namespace std;
  5. int main(int argc, char** argv)
  6. {
  7. Mat src, src_gray,dst;
  8. int kernel_size = 3;
  9. int scale = 1;
  10. int delta =0;
  11. int ddepth =CV_16S;
  12. const char* imageName = argc >2 ? argv[1] : "../res/beauty.jpg";
  13. src =imread(imageName,IMREAD_COLOR);
  14. if(src.empty())
  15. {
  16. cout << "can't load the image" << endl;
  17. }
  18. GaussianBlur(src,src,Size(3,3),0,0); //先滤波,将噪声去掉
  19. cvtColor(src,src_gray,COLOR_BGR2GRAY);//转化成灰度图
  20. Mat abs_dst;
  21. Laplacian(src_gray,dst,ddepth,kernel_size,scale,delta); //进行Laplace运算
  22. convertScaleAbs(dst,abs_dst); //取绝对值->8bit
  23. imshow("Laplace Demo",abs_dst);
  24. waitKey(0);
  25. return 0;
  26. };

结果:

20190104214521853.png2019010421435291.png


OpenCV API

内部调用的还是Sobel
void cv::Laplacian
(
InputArray src,      // input
OutputArray dst,     //Destination image
int ddepth,     // Desired depth of the destination image.
int ksize = 1,     // kernel size
double scale = 1,     // 比例
double delta = 0,     //偏移
int borderType = BORDER_DEFAULT      //
)

发表评论

表情:
评论列表 (有 0 条评论,312人围观)

还没有评论,来说两句吧...

相关阅读

    相关 边缘检测之Robert算子

    Robert算子,之前被用到了图像增强中的锐化,原因是作为一阶微分算子,Robert简单,计算量小,对细节反应敏感。 算子对边缘检测的作用是提供边缘候选点,Robert算子相