我正在嘗試創建四個gabor補丁,與下面的補丁非常相似。 我不需要它們與下面的圖片相同,但類似。如何生成以下圖像(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
gabor_fn,從here,定義如下:
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
可能需要改變,以允許這(除非我誤解其中一個參數)......我只是不知道如何。
UPDATE:
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')
你並不需要改變'gabor_fn'可言,只是參數玩。 'sigma'控制平滑或半徑,'theta'角度,'psi'相位......嘗試與這3個玩法一起玩,直到你或多或少得到你想要的形狀,然後用'lambda'和' gamma *爲* contrast *(這是強度)。 –
@imaluengo感謝您的回覆。可悲的是,雖然我可以在右下角用'gabor_fn(sigma = 55,theta = pi/2,lambda = 150,psi = 90,gamma = 1)生成一個,但其他人仍然沒有我...... – lnNoam
@ InNoam請發佈你得到的結果(也許你也可以縮小圖像的一小部分)。我相信問題不是形象的產生,而是表現。默認情況下,Matplotlib將圖像縮放到最小/最大值。如果您改變了gabor貼片的振幅(看起來像您想要達到的效果),您將看不到顯示圖像的差異。 – kazemakase