Source code for asterism.analysis_tasks.morphometry_features.gabor

"""
Module: name
========================



Overview
--------

This modules provides an

The :class:`.class_name` is used to...



Classes relations
---------------------------------------
.. figure::  classes_rel_pkg.sub_pkg.modname.png
   :align:   center


Classes and Inheritance Structure
----------------------------------------------
.. inheritance-diagram::   classes_pkg.sub_pkg.modname.png




Summary
---------
.. autosummary::
   some func
   some classes


Module API
-----------
"""

from __future__ import division, absolute_import, print_function



from ...pipeline_manager.analysis_tasks import AnalysisTask
from ...core.image_processing.geometry_transformation import RescaleImage
from ...core.clustering.connectivity_based.connected_components import  ConnectedComponents
from ...core.clustering.cluster_tools import get_cluster_closest_to_position

import  numpy as np

__author__ = 'andrea tramacere'


__author__ = 'andrea tramacere'

from skimage.filters import gabor_kernel

try:
    from skimage.filters import gabor
except:
    from skimage.filters import gabor_filter as gabor

from ...core.clustering.connectivity_based.connected_components import  ConnectedComponents

[docs]def do_gabor_filter(cluster,image_bkg_value,cluster_th_level,plot=False): image,off_set_x,off_set_y,masked_pixels=cluster.get_cluster_Image(bkg=image_bkg_value,border=2) sigma_x=cluster.sig_x sigma_y=cluster.sig_y #filter design theta_v=np.linspace(0.,2.0*np.pi,8) sigma_scale_v=np.array([0.2,0.5]) frequency_scale_v=np.array([1.0,2.0]) filter_size=theta_v.size*sigma_scale_v.size*frequency_scale_v.size #normalize image to 1.0 image._data=image._data/image._data.max() (r,c)=image.array.shape filtered_c=np.zeros((filter_size,r,c)) w_t=np.zeros(filter_size ) gab_w1=np.zeros(filter_size ) gab_w2=np.zeros(filter_size ) if plot==True: import pylab as plt fig,ax=plt.subplots(8,4) ax_i=iter(ax.flatten()) ID=0 for theta in theta_v: for sigma_scale in sigma_scale_v: for frequency_scale in frequency_scale_v: f=(1.0/cluster.r_max)*frequency_scale filtered_c[ID], filt_imag = gabor(image.array, frequency=f, theta=theta, sigma_x=sigma_scale*sigma_x, sigma_y=sigma_scale*sigma_x) w=np.ones(image.array.shape) w[~masked_pixels]=np.fabs(filtered_c[ID][~masked_pixels]-image.array[~masked_pixels] )/np.fabs(image.array[~masked_pixels] ) gab_w1[ID]=(filtered_c[ID][~masked_pixels]**2).sum()/np.float(cluster.n_points) gab_w2[ID]=np.fabs(filtered_c[ID][~masked_pixels]).sum()/np.float(cluster.n_points) w_t[ID]=1.0/w.sum() if plot==True: ax=ax_i.next() ax.imshow( filtered_c[ID] ,interpolation='nearest') t='%2.2f,%2.2f,%2.2f'%(theta,sigma_scale,f) ax.set_title(t) #if ID==0: # i_final=np.corrcoef(filtered_c[ID],image.array) #else: # i_final+=np.corrcoef(filtered_c[ID],image.array) #feats[k, 0] = filtered.mean() #feats[k, 1] = filtered.var() ID+=1 id_s=np.argsort(w_t)[-4:] filtered=np.zeros((r,c)) for id in id_s: filtered+=filtered_c[id]*w_t[id] #import pylab as plt if plot==True: fig,(ax1,ax2)=plt.subplots(1,2) ax1.imshow(image.array,interpolation='nearest') ax2.imshow(filtered,interpolation='nearest') plt.show() conn=ConnectedComponents(1) conn.run(np.fabs(filtered),0.0,seg_map=~masked_pixels) central_cluster=get_cluster_closest_to_position(conn.clusters_list,x_c=image._center_x,y_c=image._center_y) g_w_1=[gab_w1.mean(),gab_w1.std(),gab_w1.min(),gab_w1.max()] g_w_2=[gab_w2.mean(),gab_w2.std(),gab_w2.min(),gab_w2.max()] return central_cluster.SourceCluster_factory(ID=cluster.ID),g_w_1,g_w_2
[docs]class DoGaborFilter(AnalysisTask): def __init__(self, name='gabor_filter', func=do_gabor_filter, parser=None, process=None): super(DoGaborFilter,self).__init__(name=name,func=func,parser=parser,process=process) self.parameters_list.add_par('-eval',help=' ',action='store_true') self.parameters_list.add_par('-size', type=np.int ,help='',default=25) self.func=func