2015-07-21 50 views
0

我正在嘗試創建四個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可能需要改變,以允許這(除非我誤解其中一個參數)......我只是不知道如何。


enter image description here


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') 
+1

你並不需要改變'gabor_fn'可言,只是參數玩。 'sigma'控制平滑或半徑,'theta'角度,'psi'相位......嘗試與這3個玩法一起玩,直到你或多或少得到你想要的形狀,然後用'lambda'和' gamma *爲* contrast *(這是強度)。 –

+0

@imaluengo感謝您的回覆。可悲的是,雖然我可以在右下角用'gabor_fn(sigma = 55,theta = pi/2,lambda = 150,psi = 90,gamma = 1)生成一個,但其他人仍然沒有我...... – lnNoam

+0

@ InNoam請發佈你得到的結果(也許你也可以縮小圖像的一小部分)。我相信問題不是形象的產生,而是表現。默認情況下,Matplotlib將圖像縮放到最小/最大值。如果您改變了gabor貼片的振幅(看起來像您想要達到的效果),您將看不到顯示圖像的差異。 – kazemakase

回答

1

你遇到的問題是一個可視化問題(儘管我認爲你是在攪動太大的參數)。

默認情況下,matplotlib和scipy's(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=1imshow(類似於@kazemakase)建議,會給你想要的對比

選中此指南爲合理值(和使用的方式)Gabor核:

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

+0

我很感激幫助。 – lnNoam

1

好像toimage縮放輸入數據,使得最小/最大值被映射到黑/白。

我不知道是什麼振幅合理地從伽柏片期待,但你應該嘗試這樣的事情:

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

這告訴toimage你的數據是在什麼範圍內你可以嘗試玩弄的Cmin和cmax,但要確保它們是對稱的(即cmin=-x, cmax=x),以便值0映射爲灰色。

+0

謝謝!我很感激。 – lnNoam