Featured image of post OpenCVによる2次元ガボールフィルター作成

OpenCVによる2次元ガボールフィルター作成

こんにちは。

「ガボール・パッチ」「ガボール・アイ」を聞いた事はありますか?Wikiにあるのは、こんなもわーっとした気持ち悪い画像です。

ガボールフィルタによって作成された模様ですが視力回復に効果的という事で有名です。視力回復用の本も出版されているので、たまにこの本で近視・老眼予防をしています。ただ、効果のほどは、ほんとによくわかりません。。もっと気が向いた時じゃなくて毎日何分とかでやらないと難しいですよね。このガボールパッチがなぜ視力回復に効果的かというと、医者ではありませんので、正確にはお伝えできてないかもしれません。。一応、「一次視覚皮質のニューロンが受容野構造と形がマッチした刺激ほど強く反応し、ガボールパッチがそれに一致する特性を持っている」という事らしいです。

そして、ガボールフィルタはエッジ検出、テクスチャ解析、特徴抽出等、画像処理アプリケーションで使用されています。OpenCVでは「getGaborKernel」で使えるのですが、パラメータの何を触ったらどう変わるのか解説をしていきます。

getGaborKernelのパラメータ

1
retval = cv.getGaborKernel(ksize, sigma, theta, lambd, gamma\[, psi\[, ktype\]\])
ksizeガボールフィルタのサイズ(n,n)
sigmaガウシアン包絡線の標準偏差
thetaガボール関数の平行縞に対する法線の向き
lambd正弦波因子の波長
gamma空間アスペクト比
psi位相オフセット
ktypeフィルタ係数の種類.CV_32F または CV_64F

パラメータ:sigma

sigmaを増やすと、ガボール関数のストライプの数が増えます。

パラメータ:theta

thetaはフィルタの向きが変わります。0度は垂直です。

パラメータ:lambd

lambdはガボール関数のストリップの幅です。

パラメータ:gamma

gammaは空間アスペクト比です。数値が高いほど楕円率が高くなります。(細長くなる)

オプションパラメータ:psi

psiは正弦波の位相オフセットです。0にすると波の高い位置が中心に来ます。

ソースコード

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# sigma
axes=[]
fig=plt.figure()
t = 'ksize=(100,100), theta=0, lambd=10, gamma=0.5, psi=0'
fig.text(0.2, 0.1, t ,wrap=True)

lstSigma = [4,8,12]
for i, sigma in enumerate(lstSigma):
    gabor = cv2.getGaborKernel(ksize=(100,100), sigma=sigma, theta=0, lambd=10, gamma=0.5, psi=0)

    axes.append( fig.add_subplot(1, len(lstSigma), i+1) )
    subplot_title=("sigma="+str(sigma))
    axes[-1].set_title(subplot_title)

    plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
    plt.tick_params(bottom=False,left=False,right=False,top=False)
    plt.imshow(gabor,cmap="gray")

fig.tight_layout()
fig.savefig("image_sigma.png")

plt.show(block=True)

# lambd
axes=[]
fig=plt.figure()
t = 'ksize=(100,100), sigma=8, theta=0, gamma=0.5, psi=0'
fig.text(0.2, 0.1, t ,wrap=True)

lstLambd = [4,8,12]
for i, lambd in enumerate(lstLambd):
    gabor = cv2.getGaborKernel(ksize=(100,100), sigma=8, theta=0, lambd=lambd, gamma=0.5, psi=0)

    axes.append( fig.add_subplot(1, len(lstLambd), i+1) )
    subplot_title=("lambd="+str(lambd))
    axes[-1].set_title(subplot_title)

    plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
    plt.tick_params(bottom=False,left=False,right=False,top=False)
    plt.imshow(gabor,cmap="gray")

fig.tight_layout()
fig.savefig("image_lambd.png")

plt.show(block=True)

# theta
axes=[]
fig=plt.figure()
t = 'ksize=(100,100), sigma=8, lambd=10, gamma=0.5, psi=0'
fig.text(0.2, 0.1, t ,wrap=True)

lstTheta = [0,45,90]
for i, theta in enumerate(lstTheta):
    gabor = cv2.getGaborKernel(ksize=(100,100), sigma=8, theta=numpy.radians(theta), lambd=10, gamma=0.5, psi=0)

    axes.append( fig.add_subplot(1, len(lstTheta), i+1) )
    subplot_title=("theta="+str(theta))
    axes[-1].set_title(subplot_title)

    plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
    plt.tick_params(bottom=False,left=False,right=False,top=False)
    plt.imshow(gabor,cmap="gray")

fig.tight_layout()
fig.savefig("image_theta.png")

plt.show(block=True)

# gamma
axes=[]
fig=plt.figure()
t = 'ksize=(100,100), sigma=8, theta=0, lambd=10, psi=0'
fig.text(0.2, 0.1, t ,wrap=True)

lstGamma = [0.5,0.75,1]
for i, gamma in enumerate(lstGamma):
    gabor = cv2.getGaborKernel(ksize=(100,100), sigma=8, theta=0, lambd=10, gamma=gamma, psi=0)

    axes.append( fig.add_subplot(1, len(lstGamma), i+1) )
    subplot_title=("gamma="+str(gamma))
    axes[-1].set_title(subplot_title)

    plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
    plt.tick_params(bottom=False,left=False,right=False,top=False)
    plt.imshow(gabor,cmap="gray")

fig.tight_layout()
fig.savefig("image_gamma.png")

plt.show(block=True)

# psi
axes=[]
fig=plt.figure()
t = 'ksize=(100,100), sigma=8, theta=0, lambd=10, gamma=0.5'
fig.text(0.2, 0.1, t ,wrap=True)

lstPsi = [0,1,1.5]
for i, psi in enumerate(lstPsi):
    gabor = cv2.getGaborKernel(ksize=(100,100), sigma=8, theta=0, lambd=10, gamma=0.5, psi=psi)

    axes.append( fig.add_subplot(1, len(lstPsi), i+1) )
    subplot_title=("psi="+str(psi))
    axes[-1].set_title(subplot_title)

    plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
    plt.tick_params(bottom=False,left=False,right=False,top=False)
    plt.imshow(gabor,cmap="gray")

fig.tight_layout()
fig.savefig("image_psi.png")

plt.show(block=True)
Licensed under CC BY-NC-SA 4.0
Hugo で構築されています。
テーマ StackJimmy によって設計されています。