如何制作以下图像(gabor补丁)

时间:2015-07-21 07:49:31

标签: python python-2.7 numpy scipy

我正在尝试创建四个gabor补丁,与下面的补丁非常相似。 我不需要它们与下面的图片相同,但类似。

尽管有点修补,但我无法重现这些图像...... 我相信它们最初是在MATLAB中创建的。我无法访问原始的MATLAB代码。

我在python(2.7.10)中有以下代码:

import numpy as np
from scipy.misc import toimage  # One can also use matplotlib*

data = gabor_fn(sigma = ???, theta = 0, Lambda = ???, psi = ???, gamma  = ???)
toimage(data).show()

* graphing a numpy array with matplotlib

来自here

gabor_fn定义如下:

def gabor_fn(sigma,theta,Lambda,psi,gamma):
    sigma_x = sigma;
    sigma_y = float(sigma)/gamma;

    # Bounding box
    nstds = 3;
    xmax = max(abs(nstds*sigma_x*numpy.cos(theta)),abs(nstds*sigma_y*numpy.sin(theta)));
    xmax = numpy.ceil(max(1,xmax));
    ymax = max(abs(nstds*sigma_x*numpy.sin(theta)),abs(nstds*sigma_y*numpy.cos(theta)));
    ymax = numpy.ceil(max(1,ymax));
    xmin = -xmax; ymin = -ymax;
    (x,y) = numpy.meshgrid(numpy.arange(xmin,xmax+1),numpy.arange(ymin,ymax+1 ));
    (y,x) = numpy.meshgrid(numpy.arange(ymin,ymax+1),numpy.arange(xmin,xmax+1 ));

    # Rotation
    x_theta=x*numpy.cos(theta)+y*numpy.sin(theta);
    y_theta=-x*numpy.sin(theta)+y*numpy.cos(theta);

    gb= numpy.exp(-.5*(x_theta**2/sigma_x**2+y_theta**2/sigma_y**2))*numpy.cos(2*numpy.pi/Lambda*x_theta+psi);
    return gb

正如您可能知道的那样,图像之间唯一的区别(我相信)是对比度。所以,gabor_fn可能需要改变以允许这样做(除非我误解其中一个参数)......我只是不确定如何。

enter image description here

更新:

from math import pi
from matplotlib import pyplot as plt

data = gabor_fn(sigma=5.,theta=pi/2.,Lambda=12.5,psi=90,gamma=1.)

unit = #From left to right, unit was set to 1, 3, 7 and 9.
bound = 0.0009/unit

fig = plt.imshow(
                  data
                 ,cmap = 'gray'
                 ,interpolation='none'
                 ,vmin = -bound
                 ,vmax =  bound
)
plt.axis('off')

2 个答案:

答案 0 :(得分:1)

似乎toimage缩放输入数据,以便将最小/最大值映射为黑/白。

我不知道gabor补丁合理期望的幅度,但你应该尝试这样的事情:

toimage(data, cmin=-1, cmax=1).show()

这告诉toimage您的数据的范围。您可以尝试使用cmin和cmax,但要确保它们是对称的(即cmin=-x, cmax=x),以便值0映射到灰色。

答案 1 :(得分:1)

您遇到的问题是可视化问题(尽管我认为您选择了太大的参数)。

默认情况下,matplotlib和scipy(toimage)使用双线性(或三线性)插值,具体取决于matplotlib的配置脚本。这就是为什么你的形象看起来如此顺利。这是因为您的像素值正在插值,并且您没有显示刚刚计算的原始内核。

尝试使用没有插值的matplotlib:

from matplotlib import pyplot as plt

plt.imshow(data, 'gray', interpolation='none')
plt.show()

对于以下参数:

data = gabor_fn(sigma=5.,theta=pi/2.,Lambda=25.,psi=90,gamma=1.)

你得到这个输出:

enter image description here

如果你将lamda减少到15,你会得到这样的结果:

enter image description here

此外,您选择的西格玛会改变平滑的强度,将参数vmin=-1vmax=1添加到imshow(类似于@kazemakase)建议的,会为您提供所需的< EM>对比度

检查此指南以获取合理的值(以及使用方法)gabor内核:

http://scikit-image.org/docs/dev/auto_examples/plot_gabor.html