今日は、昔(8年くらい前)にCで頑張って作っていた
ガボールフィルタ
をPythonに落としこもうと思います。
ガボールフィルタは、第一視覚野で行われている
エッジ方向の抽出を画像処理で実現するときに使ったりします。
私は特徴量の抽出で使ったりしました。
当時、画像処理で遊んでた時はOpenCVもVer1系だったりで、
ほぼ自力だったので大変でした。
ガボールフィルタ(C言語バージョン)はこちら
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 |
void gaborCoefficients(double **gabor_filter, double sigma_pow2, int w) { double PI= 3.1415926535897932384626; int mask_size= w*2+1; double sum= 0; int j= 0; double lambda[5]= {4.0, 4*sqrt(2.0), 8.0, 8.0*sqrt(2.0), 16.0}; double psi[8]= {}; for(int mu=0; mu<8; mu++){ psi[mu]=(double)mu*PI/8.0; } for(int nu=0; nu<5; nu++){ for(int mu=0; mu<8; mu++){ j= mu+ 8*nu; for(int yy=0; yy<mask_size; yy++){ for(int xx=0; xx<mask_size; xx++){ double x= xx- w; double y= yy- w; double xp= (double)x*cos(psi[mu])+ (double)y*sin(psi[mu]); double yp= (double)x*(-1)*sin(psi[mu])+ (double)y*cos(psi[mu]); double tmp= exp(-1*(xp*xp+ yp*yp))/(2.0*1.5*1.5); //double tmp= exp(-1*(xp*xp+ yp*yp))/(2.0*lambda[nu]*lambda[nu]); double arg= 2.0*PI*xp/(lambda[nu]+3.0); gabor_filter[j][2*mask_size*yy+ 2*xx]= tmp*cos(arg); gabor_filter[j][2*mask_size*yy+ 2*xx+ 1]= tmp*sin(arg); } } } } } |
For文何重だって話ですね。
ガボールフィルタ(Pythonバージョン)はこちら
1 2 3 4 5 6 7 |
# -*- coding: utf-8 -*- import numpy as np import pylab as plt import cv2 gaborConf = cv2.getGaborKernel((100, 100), 16.0, np.radians(0), 10, 0.5, 0) plt.imshow(gaborConf, cmap="ocean") and plt.show() |
・・・。
ライブラリで用意されてるんだ・・・・。
2行で描画までできるとか・・・。
あの頃の努力は一体・・・。
結果
THE 衝撃的。