OpenCV2马拉松第15圈——边缘检测(Laplace算子,LOG算子)

收入囊中

  • 拉普拉斯算子
  • LOG算子(高斯拉普拉斯算子)
  • OpenCV Laplacian函数
  • 构建自己的拉普拉斯算子
  • 利用拉普拉斯算子进行图像的锐化

葵花宝典

OpenCV2马拉松第14圈——边缘检测(Sobel,prewitt,roberts)  我们已经认识了3个一阶差分算子

拉普拉斯算子是二阶差分算子,为什么要加入二阶的算子呢?试想一下,如果图像中有噪声,噪声在一阶导数处也会取得极大值从而被当作边缘。然而求解这个极大值也不方便,采用二阶导数后,极大值点就为0了,因此值为0的地方就是边界。

有图有真相!

上面是一阶导数,下面是二阶导数

基本理论公式:                                  

离散形式:

  
   
图5-9  拉普拉斯的4种模板

拉普拉斯算子会放大噪声,因此我们采用了LOG算子,就是高斯拉普拉斯算子,先对图像进行高斯模糊,抑制噪声,再求二阶导数,二阶导数为0的地方就是图像的边界。

初识API

API不用解释了,和Sobel完全一样!

C++: void Laplacian(InputArray src,
OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType=BORDER_DEFAULT)
 
  • src – Source image.
  • dst – Destination image of the same size and the same number of channels as src .
  • ddepth – Desired depth of the destination image.
  • ksize – Aperture size used to compute the second-derivative filters. See getDerivKernels() for
    details. The size must be positive and odd.
  • scale – Optional scale factor for the computed Laplacian values. By default, no scaling is applied. See getDerivKernels() for
    details.
  • delta – Optional delta value that is added to the results prior to storing them in dst .
  • borderType – Pixel extrapolation method. See borderInterpolate() for
    details.

This is done when ksize > 1 . When ksize == 1 ,
the Laplacian is computed by filtering the image with the following  aperture:

荷枪实弹

我们先调用API来实现

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main( int, char** argv )
{

  Mat src, src_gray;
  int kernel_size = 3;
  const char* window_name = "Laplace Demo";

  src = imread( argv[1] );
  GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
  cvtColor( src, src_gray, CV_RGB2GRAY );
  namedWindow( window_name, CV_WINDOW_AUTOSIZE );

  Mat dst, abs_dst;
  Laplacian( src_gray, dst, CV_16S, kernel_size);
  convertScaleAbs( dst, abs_dst );

  imshow( window_name, abs_dst );
  waitKey(0);
  return 0;
}

效果图:

下面,我们用之前讲过的自定义滤波实现,采用

1 1 1
1 -8 1
1 1 1

这种形式的算子,代码如下

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;   

int main( int, char** argv )
{
	Mat src,gray,Kernel;

    src = imread( argv[1] );
    GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
    cvtColor( src, gray, CV_RGB2GRAY );
    namedWindow("dstImage", 1);  

    Kernel = (Mat_<double>(3,3) << 1, 1, 1, 1, -8, 1, 1, 1, 1);
    Mat grad,abs_grad;
    filter2D(gray, grad, CV_16S , Kernel, Point(-1,-1));
    convertScaleAbs( grad, abs_grad );

    imshow("dstImage", abs_grad);
    waitKey();
    return 0;
} 

效果图就不发了,跟上面差不多

举一反三

拉普拉斯算子有没有跟多的应用,当然有,比如图像锐化。

由于拉普拉斯是一种微分算子,它可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像。拉普拉斯锐化的基本方法可以由下式表示:

锐化代码

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;   

int main( int, char** argv )
{
    Mat src,gray;

    src = imread( argv[1] );
    GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
    cvtColor( src, gray, CV_RGB2GRAY );
    namedWindow("srcImage", 1);
    namedWindow("dstImage", 1);  

    Mat grad,abs_grad;
    Laplacian( gray, grad, CV_16S, 3);
    convertScaleAbs( grad, abs_grad );
    Mat sharpped = gray + abs_grad;

    imshow("srcImage", gray);
    imshow("dstImage", sharpped);
    waitKey();
    return 0;
} 

效果图:

有放大噪声(很难避免)

计算机视觉讨论群162501053

转载请注明:http://blog.csdn.net/abcd1992719g

OpenCV2马拉松第15圈——边缘检测(Laplace算子,LOG算子)

时间: 2024-12-08 02:24:43

OpenCV2马拉松第15圈——边缘检测(Laplace算子,LOG算子)的相关文章

OpenCV2马拉松第17圈——边缘检测(Canny边缘检测)

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检测 掌握Canny算法基本理论 分享Java的实现 葵花宝典 在此之前,我们先阐述一下canny检测的算法.总共分为4部分. (1)处理噪声 一般用高斯滤波.OpenCV使用如下核 (2)计算梯度幅值 先用如下Sobel算子计算出水平和竖直梯度 我在OpenCV2马拉松第14圈--边缘检测(Sobel,prewitt,robert

OpenCV2马拉松第14圈——边缘检测(Sobel,prewitt,roberts)

收入囊中 差分在边缘检测的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检测到底有什么用呢?先看下面的图片 作为人,我们可以很容易发现图中红圈有边界,边界处肯定是非常明显,变化陡峭的,在数学中,什么可以表示变化的快慢,自然就是导数,微分了. 想像有如下的一维图片. 红圈处变化最陡峭,再看导数图 红圈在最高值,也就是导数可以很好表示边缘,因为变化很剧烈 图像中的Sobel算子 是离散差分算子. 结合了

OpenCV2马拉松第16圈——边缘检测(形态学梯度)

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV函数进行形态学梯度操作 自定义结构矩阵进行形态学梯度操作 葵花宝典 在此之前,如果你还没接触过灰度图像形态学膨胀与腐蚀,希望你能仔细阅读灰度图像形态学膨胀与腐蚀 本质上,灰度与二值并不差异,二值不过是0与255,膨胀与腐蚀的操作都是一样的 形态学梯度的定义如下: 形态梯度 dst=morph_grad(src,element)=dilate(src,ele

OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)

收入囊中 拉普拉斯算子 LOG算子(高斯拉普拉斯算子) OpenCV Laplacian函数 构建自己的拉普拉斯算子 利用拉普拉斯算子进行图像的锐化 葵花宝典 在OpenCV2马拉松第14圈--边缘检測(Sobel,prewitt,roberts)  我们已经认识了3个一阶差分算子 拉普拉斯算子是二阶差分算子.为什么要增加二阶的算子呢?试想一下,假设图像中有噪声,噪声在一阶导数处也会取得极大值从而被当作边缘.然而求解这个极大值也不方便.採用二阶导数后,极大值点就为0了.因此值为0的地方就是边界.

openCV2马拉松第19圈——Harris角点检测(自己实现)

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的connerHarris实现角点检测 自己实现Harris算法 下面是自己实现的一个效果图 因为阀值设置比较高,所以房屋周围没有找出来 葵花宝典 在此之前,我们讲过边缘的检测,边缘检测的基本原理就是x方向或者y方向梯度变化很大,角点,顾名思义,就是两个方向的梯度变化都很大. 左1,平滑区域,没有边缘和角点

OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检測 掌握Canny算法基本理论 分享Java的实现 葵花宝典 在此之前,我们先阐述一下canny检測的算法.总共分为4部分. (1)处理噪声 一般用高斯滤波.OpenCV使用例如以下核 (2)计算梯度幅值 先用例如以下Sobel算子计算出水平和竖直梯度 我在OpenCV2马拉松第14圈--边缘检測(Sobel,prewitt,ro

OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)

收入囊中 差分在边缘检測的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检測究竟有什么用呢?先看以下的图片 作为人,我们能够非常easy发现图中红圈有边界,边界处肯定是非常明显,变化陡峭的,在数学中,什么能够表示变化的快慢,自然就是导数,微分了. 想像有例如以下的一维图片. 红圈处变化最陡峭,再看导数图 红圈在最高值,也就是导数能够非常好表示边缘,由于变化非常剧烈 图像中的Sobel算子 是离散差分

OpenCV2马拉松第27圈——SIFT论文,原理及源码解读

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28913101 简介 SIFT特征描述子是David G. Lowe 在2004年的ijcv会议上发表的论文中提出来的,论文名为<<Distinctive Image Featuresfrom Scale-Invariant Keypoints>>.这是一个很强大的算法,主要用于图像配准和物体识别等领域,但是其计算量相比也比较大,性价

OpenCV2马拉松第10圈——直方图反向投影(back project)

收入囊中 灰度图像的反向投影 彩色图像的反向投影 利用反向投影做object detect 葵花宝典 什么是反向投影?事实上没有那么高大上! 在上一篇博文学到,图像能够获得自己的灰度直方图. 反向投影差点儿相同是逆过程,由直方图得到我们的投影图. 步骤例如以下: 依据模版图像,得到模版图像的灰度直方图. 对灰度直方图对归一化,归一化后是个概率分布,直方图的积分是1 依据概率分布的直方图,求输入图像的投影图,也就是对每个像素点,我们依据灰度值,能够得到其概率 得到的投影图是介于[0,1]之间的,为