热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用于斑点检测或边缘检测的高斯拉普拉斯算子?

如何解决《用于斑点检测或边缘检测的高斯拉普拉斯算子?》经验,为你挑选了1个好方法。

提供以下代码(被要求删除链接).但我想知道它是如何工作的.如果这被认为是边缘检测或斑点检测,我很困惑,因为维基百科将高斯拉普拉斯(LoG)列为斑点检测.

此外,有人可以解释并提供更深层次的解释,说明为什么计算绝对值以及focus_stack()函数中发生了什么?

#   Compute the gradient map of the image
def doLap(image):

    # YOU SHOULD TUNE THESE VALUES TO SUIT YOUR NEEDS
    kernel_size = 5         # Size of the laplacian window
    blur_size = 5           # How big of a kernal to use for the gaussian blur
                            # Generally, keeping these two values the same or very close works well
                            # Also, odd numbers, please...

    blurred = cv2.GaussianBlur(image, (blur_size,blur_size), 0)
    return cv2.Laplacian(blurred, cv2.CV_64F, ksize=kernel_size)

#
#   This routine finds the points of best focus in all images and produces a merged result...
#
def focus_stack(unimages):
    images = align_images(unimages)

    print "Computing the laplacian of the blurred images"
    laps = []
    for i in range(len(images)):
        print "Lap {}".format(i)
        laps.append(doLap(cv2.cvtColor(images[i],cv2.COLOR_BGR2GRAY)))

    laps = np.asarray(laps)
    print "Shape of array of laplacians = {}".format(laps.shape)

    output = np.zeros(shape=images[0].shape, dtype=images[0].dtype)

    abs_laps = np.absolute(laps)
    maxima = abs_laps.max(axis=0)
    bool_mask = abs_laps == maxima
    mask = bool_mask.astype(np.uint8)
    for i in range(0,len(images)):
        output = cv2.bitwise_not(images[i],output, mask=mask[i])

    return 255-output

Cris Luengo.. 8

hkchengrex的答案相当完整,但我并不完全同意.也许我对正确的命名法有点敏感.检测器可以在要检测的物体的位置产生强烈的响应.

高斯拉普拉斯算子(LoG)不是边缘检测器,因为它在(近*)边缘处具有零交叉.但它可以用于构建边缘检测器.如此构造的边缘检测器是Marr-Hildreth边缘检测器.因此,它通常被归类为边缘检测器.对我来说,这是一个线路探测器.

拉普拉斯是二阶导数的总和(Hessian矩阵的轨迹).与LoG卷积的图像与用高斯卷积的图像的拉普拉斯算子相同:

img * [ d^2/dx^2 G(x,y) + d^2/dy^2 G(x,y) ] = d^2/dx^2 [ img * G(x,y) ] + d^2/dy^2 [ img * G(x,y) ]

因此,LoG在图像中的极值处产生强响应(其中二阶导数是最大的).这发生在"斑点"的峰值,沿着线的脊.

我们来看看这个简单的测试图像:

块,线和点的图像

并将LoG应用于它:

以上图片的LoG

这里,中灰色是具有值0的像素.可以看出,它沿着细线和小点具有强(负)响应.它还具有围绕较宽物体边缘的中等响应(边缘内部为负,外部为正); 过零点靠近边缘的位置.

我们可以对此图像进行阈值检测,以检测细线和点:

LoG <65

(阈值大小产生相同的结果).我们可以降低阈值以查看介质响应发生在感兴趣的边缘周围:

abs(LoG)<20

获取边缘需要的不仅仅是一个简单的阈值.相比之下,梯度幅度(边缘位置处的一阶导数很强)可以设置阈值以获得边缘:

gradmag <50

梯度幅度对于检测线条没有用,因为它检测沿线的两条边,而不是线本身.上面的梯度幅度是使用高斯导数计算的(Sobel是另一种选择,但不是那么精确).

请注意,Canny边缘检测器基于梯度幅度,它增加了非最大抑制和滞后阈值处理,使检测变得薄且有意义.


*二阶导数在拐点处具有零交叉(可以将其视为边缘的真实位置).然而,拉普拉斯算子是二阶导数的总和.如果你想到梯度方向的二阶导数,它的零交叉将很好地定位.但现在在垂直方向(沿着边缘)添加二阶导数.该二阶导数沿直边为零,沿凸曲面边缘(例如圆的边缘)为负,沿凹曲面边为正.因此,添加这两个值将导致零交叉在弯曲边缘上移动,曲率越强,过零点将偏离其真实位置越多.



1> Cris Luengo..:

hkchengrex的答案相当完整,但我并不完全同意.也许我对正确的命名法有点敏感.检测器可以在要检测的物体的位置产生强烈的响应.

高斯拉普拉斯算子(LoG)不是边缘检测器,因为它在(近*)边缘处具有零交叉.但它可以用于构建边缘检测器.如此构造的边缘检测器是Marr-Hildreth边缘检测器.因此,它通常被归类为边缘检测器.对我来说,这是一个线路探测器.

拉普拉斯是二阶导数的总和(Hessian矩阵的轨迹).与LoG卷积的图像与用高斯卷积的图像的拉普拉斯算子相同:

img * [ d^2/dx^2 G(x,y) + d^2/dy^2 G(x,y) ] = d^2/dx^2 [ img * G(x,y) ] + d^2/dy^2 [ img * G(x,y) ]

因此,LoG在图像中的极值处产生强响应(其中二阶导数是最大的).这发生在"斑点"的峰值,沿着线的脊.

我们来看看这个简单的测试图像:

块,线和点的图像

并将LoG应用于它:

以上图片的LoG

这里,中灰色是具有值0的像素.可以看出,它沿着细线和小点具有强(负)响应.它还具有围绕较宽物体边缘的中等响应(边缘内部为负,外部为正); 过零点靠近边缘的位置.

我们可以对此图像进行阈值检测,以检测细线和点:

LoG <65

(阈值大小产生相同的结果).我们可以降低阈值以查看介质响应发生在感兴趣的边缘周围:

abs(LoG)<20

获取边缘需要的不仅仅是一个简单的阈值.相比之下,梯度幅度(边缘位置处的一阶导数很强)可以设置阈值以获得边缘:

gradmag <50

梯度幅度对于检测线条没有用,因为它检测沿线的两条边,而不是线本身.上面的梯度幅度是使用高斯导数计算的(Sobel是另一种选择,但不是那么精确).

请注意,Canny边缘检测器基于梯度幅度,它增加了非最大抑制和滞后阈值处理,使检测变得薄且有意义.


*二阶导数在拐点处具有零交叉(可以将其视为边缘的真实位置).然而,拉普拉斯算子是二阶导数的总和.如果你想到梯度方向的二阶导数,它的零交叉将很好地定位.但现在在垂直方向(沿着边缘)添加二阶导数.该二阶导数沿直边为零,沿凸曲面边缘(例如圆的边缘)为负,沿凹曲面边为正.因此,添加这两个值将导致零交叉在弯曲边缘上移动,曲率越强,过零点将偏离其真实位置越多.


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
author-avatar
零夏一夜_335
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有