1

我需要仅使用我的方法和仅使用 matplotlib OpenCV 和 NumPy 构建一个 LoG 文件管理器(但不是为了帮助计算而执行过滤器的内置函数)

def edgeDetectionZeroCrossingLOG(img: np.ndarray) -> (np.ndarray):
    """
    Detecting edges using the "ZeroCrossingLOG" method
    :param I: Input image
    :return: :return: Edge matrix
    """
    kernel = np.ndarray((3, 3))
    b_img = blurImage1(img, kernel)
    k = np.array([[0, 1, 0],
                  [1, -4, 1],
                  [0, 1, 0]])
    img_dervative = conv2D(img, k)
    ***Zero-Crossing***

脚步:

  1. 使用高斯滤波器来模糊图像
def blurImage1(in_image: np.ndarray, kernel_size: np.ndarray) -> np.ndarray:
    """
    Blur an image using a Gaussian kernel
    :param inImage: Input image
    :param kernelSize: Kernel size
    :return: The Blurred image
    """

    gaussian = np.ndarray(kernel_size)
    sigma = 0.3 * ((kernel_size[0] - 1) * 0.5 - 1) + 0.8
    for x in range(0, kernel_size[0]):
        for y in range(0, kernel_size[1]):
            gaussian[x, y] = math.exp(-((x ** 2 + y ** 2) / (2.0 * sigma ** 2))) / (math.pi * (sigma ** 2) * 2)
    return conv2D(in_image, gaussian)
  1. 使用推导拉普拉斯核 Ix,Iy
    k = np.array([[0, 1, 0],
                  [1, -4, 1],
                  [0, 1, 0]])
  1. 需要在图像的 2D 数组中找到所有“过零”并将它们标记为 1,其余为零

我的主要问题是过零,我找不到解决办法。

我需要检查所有没有阈值的交叉口 -> { (-+),(+-),(-0+),(+0-)},并且每个交叉口都设为 1 ,其余的则为零。

(卷积也是我实现的函数conv2D)

4

1 回答 1

4

在我自己实现它之后,我偶然发现了这个线程。如果您使用 scikit-image,这相当简单。我将首先展示代码,然后通过它

from skimage.filters import laplace
import numpy as np

lap = np.sign(laplace(image))
lap = np.pad(lap, ((0, 1), (0, 1)))
diff_x = lap[:-1, :-1] - lap[:-1, 1:] < 0
diff_y = lap[:-1, :-1] - lap[1:, :-1] < 0

edges =  np.logical_or(diff_x, diff_y).astype(float)

首先我们找到拉普拉斯算子并取它的符号,因为我们对值不感兴趣,然后继续用零填充最后一列和行,以进行卷积。然后我们继续沿 x 轴检查是否有来自 的交叉点- => +。只需将比较更改为相反。连续检查三个状态的想法可以类似地完成,其中比较必须评估True才能成为1

于 2020-11-24T13:43:29.360 回答