6

我正在尝试创建一个称为可变大小的Gabor 补丁的 2D 图像。最好将 Gabor 补丁视为 2D 正弦和 2D 高斯的卷积。

下面是用于生成代码的函数。代码是从Matlab的本教程中移植的(假设import numpy as np):

def gabor_patch(size, lambda_, theta, sigma, phase, trim=.005):
    """Create a Gabor Patch

    size : int
        Image size (n x n)

    lambda_ : int
        Spatial frequency (px per cycle)

    theta : int or float
        Grating orientation in degrees

    sigma : int or float
        gaussian standard deviation (in pixels)

    phase : float
        0 to 1 inclusive
    """
    # make linear ramp
    X0 = (np.linspace(1, size, size) / size) - .5

    # Set wavelength and phase
    freq = size / float(lambda_)
    phaseRad = phase * 2 * np.pi

    # Make 2D grating
    Xm, Ym = np.meshgrid(X0, X0)

    # Change orientation by adding Xm and Ym together in different proportions
    thetaRad = (theta / 360.) * 2 * np.pi
    Xt = Xm * np.cos(thetaRad)
    Yt = Ym * np.sin(thetaRad)
    grating = np.sin(((Xt + Yt) * freq * 2 * np.pi) + phaseRad)

    # 2D Gaussian distribution
    gauss = np.exp(-((Xm ** 2) + (Ym ** 2)) / (2 * (sigma / float(size)) ** 2))

    # Trim
    gauss[gauss < trim] = 0

    return grating * gauss

我希望 Gabor 补丁的大小与size参数成比例地增加。换句话说,我希望边界框的尺寸决定补丁的直径。问题是这个函数不以这种方式运行。相反,边界框的大小会增加,而补丁保持相同的尺寸。

示例 1:大小 = 100

在此处输入图像描述

示例 2:大小 = 500

在此处输入图像描述

对我来说,我做错了什么并不明显。有人可以指出我正确的方向吗?

如果我能提供更多信息,请告诉我。谢谢!

4

1 回答 1

5

好吧,事实证明我很傻。

实现我想要的方法是将sigma参数设置为更大的值,因为这将扩大高斯的“传播”,从而暴露更多的正弦纹理。

tl; dr:解决方案是增加sigma

教化达成!

于 2013-09-26T22:59:40.367 回答