高斯边缘检测的拉普拉斯算术的Python实现

发布于 2021-01-29 16:00:38

我正在寻找高斯边缘检测的拉普拉斯算术的等效实现。

在matlab中,我们使用以下功能

   [BW,threshold] = edge(I,'log',...)

在python中,存在一个用于计算高斯拉普拉斯算子的函数。它并没有完全消除边缘。

  scipy.ndimage.filters.gaussian_laplace

任何指向在线实施或代码的指针

谢谢

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    matlab edge()应该做什么

    1. 计算LOG
    2. 计算LoG上的零交叉
    3. 计算本地LoG差异的阈值
    4. 边缘像素=零交叉&&局部差异>阈值

    scipy的LoG过滤器仅执行上述步骤1。我实现了以下代码段来模仿上面的步骤2〜4:

    import scipy as sp
    import numpy as np
    import scipy.ndimage as nd
    import matplotlib.pyplot as plt
    from skimage import data
    
    # lena = sp.misc.lena() this function was deprecated in version 0.17
    img = data.camera()  # use a standard image from skimage instead
    LoG = nd.gaussian_laplace(img , 2)
    thres = np.absolute(LoG).mean() * 0.75
    output = sp.zeros(LoG.shape)
    w = output.shape[1]
    h = output.shape[0]
    
    for y in range(1, h - 1):
        for x in range(1, w - 1):
            patch = LoG[y-1:y+2, x-1:x+2]
            p = LoG[y, x]
            maxP = patch.max()
            minP = patch.min()
            if (p > 0):
                zeroCross = True if minP < 0 else False
            else:
                zeroCross = True if maxP > 0 else False
            if ((maxP - minP) > thres) and zeroCross:
                output[y, x] = 1
    
    plt.imshow(output)
    plt.show()
    

    这当然很慢,并且可能不是惯用的,因为我也是Python的新手,但应该可以证明这个想法。也欢迎任何有关如何改进它的建议。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看