Source code for elektronn.net.gaborfilters

# -*- coding: utf-8 -*-
# ELEKTRONN - Neural Network Toolkit
#
# Copyright (c) 2014 - now
# Max-Planck-Institute for Medical Research, Heidelberg, Germany
# Authors: Marius Killinger, Gregor Urban
"""
Supplementary functions to initialise CNN-params with gabor filters
"""

import numpy as np
from matplotlib import pyplot as plt

#def makeGabor(filter_angle, n_modes, size, offset):
#    """
#    filter_angle: in degree: 0 to 180
#    n_modes = 1,2,3 etc.
#    size: filter size
#    offset: 0 to 180
#    """
#    sigma = 0.35 # 0.5
#    freq  = n_modes / np.pi  *1.6 #n_modes / np.pi * 1.3 # 1.5
#    assert filter_angle<360 and filter_angle>=0
#    xMax = yMax = (size-1)/2+1 if size%2==1 else size/2+1
#    xMin = yMin = -xMax+1
#    assert yMax>0
#    assert xMax>0
#    sigmaX = sigma
#    sigmaY = sigma
#    theta = float(filter_angle)/180.0*np.pi
#    m_offset = float(offset)/180.0*np.pi
#    gabor  = np.empty((int(xMax)-int(xMin), int(yMax)-int(yMin)), dtype=np.float32)
#    #print shape(gabor)
#    for x in range(int(xMin), int(xMax)):
#        for y in range(int(yMin), int(yMax)):
#            xPrime =  float(x)/xMax*np.cos(theta)+float(y)/yMax*np.sin(theta)
#            yPrime = -float(x)/xMax*np.sin(theta)+float(y)/yMax*np.cos(theta)
#            gabor[x-int(xMin),y-int(yMin)] = np.exp(-0.5*((xPrime*xPrime)/(sigmaX*sigmaX)+(yPrime*yPrime)/(sigmaY*sigmaY)))*np.cos(2.0*np.pi*(freq*xPrime + m_offset))
#
#    gabor = gabor - gabor.mean()
#    gabor = gabor / np.square(gabor).sum()
#    return gabor


[docs]def makeGabor(filter_angle, n_modes, size, offset): """ Parameters ---------- filter_angle: in degree: 0 to 180 n_modes = 1,2,3 etc. size: filter size offset: 0 to 180 """ assert 360 > filter_angle >= 0 sigma = 0.35 # 0.5 freq = n_modes / np.pi * 1.6 #n_modes / np.pi * 1.3 # 1.5 theta = float(filter_angle) / 180.0 * np.pi m_offset = float(offset) / 180.0 * np.pi Max = (size - 1) / 2 if size % 2 == 1 else size / 2 X, Y = np.meshgrid(np.linspace(-Max, Max, size), np.linspace(-Max, Max, size)) X_ = X / (Max + 1) * np.cos(theta) + Y / (Max + 1) * np.sin(theta) Y_ = -X / (Max + 1) * np.sin(theta) + Y / (Max + 1) * np.cos(theta) gabor = np.exp(-0.5 * ((X_**2) + (Y_**2)) / (sigma**2)) * np.cos(2.0 * np.pi * (freq * Y_ + m_offset)) gabor = gabor - gabor.mean() gabor = gabor / np.square(gabor).sum() return gabor.astype(np.float32)
[docs]def makeGaborFilters(size, number): """ Use this to generate ``number`` first order and ``number`` second order filters """ nd2 = number #int(float(number)*0.1) nd3 = number #number-nd2 ret = [] for theta in np.arange(0, 360, (360.0 / nd2)): ret.append(makeGabor(theta, 1, size, 45)) #ret.append( makeGabor(theta, 1 ,size, np.random.random()*360) ) for theta in np.arange(0, 180, (180.0 / nd3)): ret.append(makeGabor(theta, 2, size, 0)) #ret.append( makeGabor(theta, 2 ,size, 45 + (np.random.random()-0.5)*8) ) return np.array(ret)
[docs]def blob(size): """ Return Gaussian blob filter """ x, y = np.meshgrid(np.linspace(-2, 2, size), np.linspace(-2, 2, size)) ret = np.exp(-0.5 * (np.square(x) + np.square(y))) ret = ret / np.square(ret).sum() return ret
if __name__ == '__main__': from introspection import embedMatricesInGray ga = makeGaborFilters(3, 12) #ga = np.maximum(0, ga) mat = embedMatricesInGray(ga, 1) plt.imshow(mat, interpolation='none') plt.gray() ga = makeGaborFilters(4, 12) mat2 = embedMatricesInGray(ga, 1) plt.figure() plt.imshow(mat2, interpolation='none') plt.gray()