加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 用于斑点检测或边缘检测的高斯拉普拉斯运算符?

发布时间:2020-12-16 23:11:57 所属栏目:Python 来源:网络整理
导读:提供以下代码(被要求删除链接).但我想知道它是如何工作的.如果这被认为是边缘检测或斑点检测,我很困惑,如 Wikipedia list the Laplacian of Gaussian (LoG) as blob detection. 此外,有人可以解释并提供更深入的解释为什么绝对值的计算和focus_stack()函数中
提供以下代码(被要求删除链接).但我想知道它是如何工作的.如果这被认为是边缘检测或斑点检测,我很困惑,如 Wikipedia list the Laplacian of Gaussian (LoG) as blob detection.

此外,有人可以解释并提供更深入的解释为什么绝对值的计算和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是对的.忽略关于边缘检测器的部分.

高斯拉普拉斯(LoG)可用作边缘检测器和斑点检测器.我将跳过详细的数学和基本原理,我想你可以在一本书或一些网站here,here和here上阅读它们.

要了解为何可以将它们用作两者,让我们看看它的情节和内核.


如果您的半径为3且值为1的blob以内核为中心,并且背景值为0,则响应非常强(负).很明显,如果正确设置半径,它可以进行斑点检测.

边缘检测怎么样?那么它不像Sobel运算符那样为你提供渐变和强烈的边缘响应. Sobel运算符不能为您提供准确的边缘,因为渐变通常会在几个像素上升和下降.然后你的边缘将是几个像素宽.为了使其本地化更准确,我们可以在本地找到具有最大(或最小)梯度的像素.这意味着它的二阶导数(拉普拉斯运算符)应该等于零,或者在该点处具有过零点.

您可以看到处理后的图像同时具有亮带和暗带.零交叉是边缘.要通过内核查看此内容,请尝试在内核中手动滑动完美的步骤边缘以查看响应如何更改.

对于你的第二个问题,我想绝对是试图找到浅色和深色斑点(浅色斑点,深色背景;深色斑点,浅色背景),因为它们分别给出强烈的负面和强烈的正面反应.然后,它会在每个像素位置找到所有图像的最大值.对于每个输出像素,它使用图像上的像素作为输出的最大响应.我认为他的理由是具有强烈冲动(小斑点)的像素是焦点.

他使用bitwise_not作为复制机制.它将由掩码指定的一些像素设置为源图像的按位而不是源图像.最后,您将得到包含来自不同来源的像素的输出,除了所有这些像素都没有按位.要恢复真实图像,只需再次“不”它们,因为NOT(NOT(x))= x. 255-x does exactly that.我认为copyTo也会起作用,不知道他为什么选择其他方式.

图片取自http://fourier.eng.hmc.edu/e161/lectures/gradient/node8.html.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读