0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV边缘检测算子Laplace、LoG详解

OpenCV学堂 来源: Java与Android技术栈 2023-12-21 16:34 次阅读

在该系列的第八篇文章中,我们曾介绍过一阶导数和二阶导数对分析边缘的结论:

一阶导数通常在图像中产生较粗的边缘;

二阶导数对精细细节,如细线、孤立点和噪声有较强的响应;

二阶导数在灰度斜坡和灰度台阶过渡处会产生双边缘响应;

二阶导数的符号可用于确定边缘的过渡是从亮到暗还是从暗到亮。

一阶导数算子(例如 Sobel 算子)通过对图像求导来确定图像的边缘,数值绝对值较高的点对应了图像的边缘。如果继续求二阶导,原先数值绝对值较高的点对应了过零点。因此,也可以通过找到二阶导数的过零点来检测边缘。在某些情况下,找二阶导数的过零点可能更容易。

09e1709a-97fa-11ee-8b88-92fbcf53809c.jpg

一阶导数和二阶导数.png

Part11. Laplace 算子

之前我们曾介绍过二阶导数的 Laplace 算子可以通过差分近似来简化,其公式为

它的卷积核:

09e8be5e-97fa-11ee-8b88-92fbcf53809c.jpg

拉普拉斯核.png

这是它的 4 邻域卷积核。

11.1 Laplace 算子的扩展

Laplace 算子是具有旋转不变性的各向同性的算子。

将 4 邻域的 Laplace 算子旋转 45° 后,与原算子相加,就可以得到 8 邻域的算子。

09f4398c-97fa-11ee-8b88-92fbcf53809c.jpg

扩展的拉普拉斯算子.png

这是它的 8 邻域卷积核。这个算子表示一个像素周围一圈 8 个像素的和与中间像素 8 倍的差,作为拉普拉斯计算结果。

另外,还有两个拉普拉斯卷积核,分别是对 4 邻域卷积核和 8 邻域卷积核取反。

0a00edf8-97fa-11ee-8b88-92fbcf53809c.jpg

扩展的拉普拉斯算子2.png

21.2 图像的模糊检测

使用拉普拉斯变换对图像进行模糊检测的步骤大致如下:

对图像进行拉普拉斯变换,检测水平和垂直边缘

然后对拉普拉斯变换后输出的图像求方差

如果图像足够清晰,输出图像的方差会大于给定阈值

如果图像相对模糊,则拉普拉斯变换在图像中并不能检测到足够的细节,边缘就越少,从而导致输出图像的方差小于给定阈值

该过程需要选择合适的阈值。

拉普拉斯算子能突出显示图像中包含快速梯度变化的区域,这些区域往往与边缘有关。因此,如果一幅图像的方差较高,说明图像中存在广泛的边缘响应,包括类边和非类边,这是一幅正常聚焦图像的代表。但如果方差很低,那么表明图像中的边缘响应很小,几乎没有边缘存在。因此,通过比较方差与预设阈值的大小,可以判断图像是否模糊。

按照上面的步骤实现了一个模糊检测的函数:

boolisImageBlurry(constchar*inputFile,doublethreshold)
{
Matsrc=imread(inputFile);
if(src.empty()){
printf("Imagenotloaded
");
returnfalse;
}

Matgray;
cvtColor(src,gray,COLOR_BGR2GRAY);
Matdst,absDst;
cv::Laplacian(gray,dst,CV_16S,3);
cv::convertScaleAbs(dst,absDst);

Matmean,stddev;
doublem=0,sd=0;
meanStdDev(absDst,mean,stddev);
m=mean.at(0,0);
sd=stddev.at(0,0);
doubleresult=sd*sd;
std::cout<< "m: " << m << std::endl;
    std::cout << "StdDev: " << result << std::endl;
    return result <= threshold;
}

然后写一个程序来判断一下这张图是否是模糊的

模糊的手机图片.jpeg

intmain(intargc,char*argv[])
{
stringfileName=".../test.jpeg";
boolresult=isImageBlurry(fileName.c_str(),11.0);
cout<< "result =" << result <

输出结果:

m:2.5213
StdDev:6.31374
result=1

说明是模糊的图片。

Laplace 算子对噪声敏感,通常不适用于存在噪声的图像。

Part22. LoG 算子

LoG(Laplacian of Gaussian)边缘检测算子是 David Courtnay Marr 和 Ellen Hildreth 在 1980 年共同提出的,也称为 Marr-Hildreth 算子,它根据图像的信噪比来求检测边缘的最优滤波器。该算法先对图像进行高斯平滑处理,然后再与 Laplacian 算子进行卷积。稍后来解释为何是这样的。

先来回顾一下二维高斯函数的公式:

高斯函数的一阶导数和二阶导数,在很多算子中都会用到。例如一阶导数应用在 Canny 算子,二阶导数应用在 LoG 算子等等。

简单推导一下它的一阶导数:

同理:

还有推导一下它的二阶导数:

同理:

将高斯函数代入拉普拉斯算子,可得 LoG 算子:

Marr-Hildreth 算法如下:

首先让 LoG 核与一幅输入图像卷积:

寻找 g(x,y) 的过零点来确定 f(x,y) 的边缘位置。因为拉普拉斯变换和卷积都是线性运算,因此上式可以改成

其中,f(x,y) 是输入图像,g(x,y) 是输出图像。

这样正好解释了之前说的,该算法先对图像进行高斯平滑处理,然后再与 Laplacian 算子进行卷积。因为先使用高斯滤波器对图像进行平滑处理,可以减少噪声和细节,然后使用拉普拉斯算子对滤波后的图像进行边缘检测。

它的优点是可以有效去除噪声,同时保留图像中的真实边缘。相比 Laplace 算子,LoG 算子具有更好的边缘定位能力和抗噪声。但是它也存在一些缺点,计算量相对较大。

下图是负 LoG 算子的三维图像,看上去很像“墨西哥草帽”。所以,在业界也被称为墨西哥草帽小波(Mexican hat wavelet)。

0a2cb924-97fa-11ee-8b88-92fbcf53809c.jpg

负 LoG 算子的三维图像.png

Mexican Hat.jpg

负 LoG 算子可用 5*5 的模版近似表示

0a5daad4-97fa-11ee-8b88-92fbcf53809c.jpg

LoG卷积核.png

下面用高斯模糊和拉普拉斯变换来实现 LoG :

intmain(intargc,char*argv[])
{
Matsrc=imread(".../street.jpg");
imshow("src",src);

Matdst,gray,edge;
cv::GaussianBlur(src,dst,cv::Size(3,3),0,0);//高斯模糊去除噪声
cv::cvtColor(dst,gray,cv::COLOR_BGR2GRAY);//灰度化
cv::Laplacian(gray,edge,CV_16S,3);//使用拉普拉斯算子提取边缘
cv::convertScaleAbs(edge,edge);

imshow("LoG",edge);

waitKey(0);
return0;
}

Part33. 总结

本文介绍了 Laplace 算子、LoG 算子,它们都是二阶导数的边缘算子。

特别是 LoG 算子在 Laplace 算子的基础上引入了高斯滤波,可以在一定程度上克服噪声的影响。但它仍旧有一定的局限性,不过这种思想的引入对后续图像特征研究起到了积极作用,被很多后续的算法所采纳。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1063

    浏览量

    40041
  • 边缘检测
    +关注

    关注

    0

    文章

    91

    浏览量

    18105
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40786
  • 算子
    +关注

    关注

    0

    文章

    15

    浏览量

    7239

原文标题:OpenCV 笔记(10):常用的边缘检测算子—— Laplace、LoG

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于Canny边缘检测算子的图像检索算法

    【摘要】:针对依赖传统Canny算子的基于边缘的图像检索系统所存在的不足,提出一种基于Canny边缘检测的图像检索算法。使用改进的Canny算子
    发表于 04-24 10:03

    【DragonBoard 410c试用体验】之OpenCV中canny算子边缘检测

    方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。Canny 算子的目标是找到一个最优的边缘检测算法,让我们看一下最优边缘
    发表于 09-11 23:24

    基于Qualcomm FastCv的边缘检测算详解

    ,Canny,Laplacian,Log 以及二阶方向导数等算子检测法。1.边缘检测在图像中,边缘
    发表于 09-21 11:45

    边缘检测算法分为哪几种?它们有何不同?

    边缘检测是什么?边缘检测算子有哪些?边缘检测算法分为哪几种?它们有何不同?
    发表于 05-31 06:57

    边缘检测的几种微分算子

    一、边缘检测边缘检测的几种微分算子:一阶微分算子:Roberts、Sobel、Prewitt二阶
    发表于 07-26 08:29

    基于形态灰度边缘检测算法的一种改进

    使用形态学的思想进行图像的边缘检测,提出了在一次形态处理中使用双结构元的一系列一般性形态边缘检测算子和抗噪型形态边缘
    发表于 04-19 19:26 32次下载

    基于高斯滤波与矢量微分算子的小波多尺度边缘检测算

    基于高斯滤波与矢量微分算子的小波多尺度边缘检测算法 摘 要: 采用一种基于高斯滤波与矢量微分算子相结合的近似小波多尺度边缘算法. 该算法分
    发表于 04-23 14:58 17次下载

    基于改进的Laplacian算子图像边缘检测

    分析了图像边缘特性以及Laplacian算子检测图像边缘的基本原理!并对经典Laplacian算子进行改进! 提出了一种新的
    发表于 05-17 10:46 29次下载
    基于改进的Laplacian<b class='flag-5'>算子</b>图像<b class='flag-5'>边缘</b><b class='flag-5'>检测</b>

    边缘检测算子在汽车牌照区域检测中的应用

    文中介绍了常用的几种 边缘检测 算子,不同的微分算子对不同边缘检测的敏感程度是不同的,因此对不同
    发表于 07-25 16:13 22次下载
    <b class='flag-5'>边缘</b><b class='flag-5'>检测算子</b>在汽车牌照区域<b class='flag-5'>检测</b>中的应用

    小波变换在图像边缘检测中的应用

    目前,被广泛使用的经典边缘检测算子有Sobel算子,Prewitt算子,Roberts算子Log
    发表于 08-13 16:14 54次下载
    小波变换在图像<b class='flag-5'>边缘</b><b class='flag-5'>检测</b>中的应用

    边缘检测综合示例_OpenCV3版书本配套示例程序60

    OpenCV3编程入门》书本配套源代码:边缘检测综合示例,边缘检测综合示例——Canny算子,
    发表于 06-06 15:25 0次下载

    基于改进Canny的图像边缘检测算

    划分为阶跃型和屋顶型两种类型:阶跃型边缘两边的灰度值有很大的差别;屋顶型边缘存在于灰度值从增加到逐渐减少的变化转折点上;边缘检测的经典算法有Roberts
    发表于 11-02 15:15 19次下载
    基于改进Canny的图像<b class='flag-5'>边缘</b><b class='flag-5'>检测算</b>法

    Robinson边缘检测算

    传统的Canny边缘检测算子是一种含有最优化思想的算子,它具有较高的检测精度,可以达到单像素级,但是因为它本身对噪声比较敏感,所以需要先利用Gauss滤波、均值滤波、中值滤波等滤波器进
    发表于 12-01 14:13 0次下载

    图像处理边缘检测算子分类

    边缘检测类似微分处理,它检测的变化的部分,必然对噪声和图像的亮度变化都有相应处理。因此,把均值处理加入到边缘检测过程中一定要非常谨慎。我们可
    的头像 发表于 08-17 15:54 7586次阅读

    基于Laplace-Beltrami算子的特征点检测算

    针对三维模型的特征点检测问题,提出一种基于 Laplace- Beltrami算子的特征点检测算法。对于给定的三维网格模型,首先构造离散 Lapla
    发表于 04-21 13:50 11次下载
    基于<b class='flag-5'>Laplace</b>-Beltrami<b class='flag-5'>算子</b>的特征点<b class='flag-5'>检测算</b>法