我正在尝试创建四个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
可能需要改变以允许这样做(除非我误解其中一个参数)......我只是不确定如何。
更新:
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')
答案 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.)
你得到这个输出:
如果你将lamda减少到15
,你会得到这样的结果:
此外,您选择的西格玛会改变平滑的强度,将参数vmin=-1
和vmax=1
添加到imshow
(类似于@kazemakase)建议的,会为您提供所需的< EM>对比度
检查此指南以获取合理的值(以及使用方法)gabor内核:
http://scikit-image.org/docs/dev/auto_examples/plot_gabor.html