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

标签 python image-processing edge-detection imagefilter laplacianofgaussian

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

在matlab中我们使用下面的函数

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

在python中有一个计算高斯拉普拉斯算子的函数。它并没有明确地归还边缘。

  scipy.ndimage.filters.gaussian_laplace

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

谢谢

最佳答案

matlab edge() 应该做什么

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

scipy 的 LoG filter 只做上面的第 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 的新手,但应该展示这个想法。也欢迎任何关于如何改进它的建议。

关于高斯边缘检测拉普拉斯算子的Python实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22050199/

相关文章:

python - 修改 qscintilla python lexar

c - 物体检测方法

image-processing - 我的图像处理项目的研究领域是什么?

python - 如何在 Cog Discord.Py 重写中正确定义 'client'

python - 需要帮助创建 GAE 数据存储加载器类?

python - Python列表和矩阵反转时的指针地址

image - 如何使用空间掩码限制光栅处理范围?

php - 使用 PHP GD 库合并两个 PNG 图像

image-processing - OpenCV:高效高斯差分

android - Android 上的 opencv 问题