Opencv图像识别从零到精通(20)---laplace LOG DOG边缘检测

来源:互联网 发布:日本动画制作软件 编辑:程序博客网 时间:2024/06/06 01:59

         经过了上一篇的简单的边缘检测,现在来看一下二阶导数的边缘检测,分别是Laplace LOG DOG,看到他们心里还是有点遗憾,要是自己能加快一点学习的步伐,在面试的时候也许就可以轻松回答了,亲爱的你们只是来的晚了2天。希望和我一样的同学,要加快脚步,认真学习了。废话不再多说,让我看看是怎么回事。

一、Laplacian

    Laplacian算子定义为






表示成模板的形式就是 。Laplacian算子另外一种形式是,也经常使用。Laplace算子是一种各向同性算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。

二、LOG

      看到这里,可能觉得按照习惯上面我少了Laplace的代码, 这是因为Laplace算子对噪声很敏感,所有要进行高斯滤波然后再laplace,过度到LOG,似乎也很舒服。

对于高斯先要有个基础



这里我用图片画出来,一个是好理解,还有就是和下面的DOG进行比较



<span style="font-size:18px;">#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include "opencv2/imgproc/imgproc.hpp"#include <iostream>int main(){  cv::Mat srcImage=      cv::imread("lena.jpg", 0);  if (!srcImage.data)          return -1; // 高斯平滑  //加上高斯平滑效果边缘检测效果更好,原因未知  GaussianBlur(srcImage, srcImage, cv::Size(3,3),     0, 0, cv::BORDER_DEFAULT);  cv::Mat dstImage;  // 拉普拉斯变换  Laplacian(srcImage, dstImage, CV_16S, 3);  convertScaleAbs( dstImage, dstImage);      cv::imshow("srcImage", srcImage);  cv::imshow("dstImage", dstImage);  cv::waitKey(0);  return 0;  }</span>

三、DOG

       高斯差分算子,看着名字就能知道是2个高斯差,因为LOG滤波器有无限长的拖尾,若取得很大尺寸,将使得计算不堪重负。但随着:的增加,LOG滤波器幅值迅速下降,当r大于一定程度时,可以忽略模板的作用,这就为节省计算量创造了条件。实际计算时,常常取n*n大小的LOG滤波器,近似n=3σ。另外,LOG滤波器可以近似为两个指数函数之差,即DOG ( Difference Of twoGaussians functions)。


图像画出来就是



<span style="font-size:18px;">GaussianBlur(img,img_G0,Size(3,3),0);  GaussianBlur(img_G0,img_G1,Size(3,3),0);  Mat img_DoG = img_G0 - img_G1;  normalize(img_DoG,img_DoG,255,0,CV_MINMAX);  </span>


四、matlab辅助

<span style="font-size:18px;">I=imread("lena.jpg");</span>
<span style="font-size:18px;">I=rgb2gray(I)I1=edge(I,'log');figure,imshow(I1)</span>
   
图像识别算法交流 QQ群:145076161,欢迎图像识别与图像算法,共同学习与交流

1 0