/* phase.cc Matt Mellor, Medical Vision Lab Copyright (C) 2004 University of Oxford */ #include "phase.h" #include "newimage/imfft.h" #include ///////////////////////////////////////////////// //-------------- FILTER DEFAULTS --------------// ///////////////////////////////////////////////// #define DEFAULT_FILTER "range" #define DEFAULT_PRM_1 4.5 #define DEFAULT_PRM_2 0.05 #define DEFAULT_RANGE_PRM_1 4.5 #define DEFAULT_RANGE_PRM_2 0.05 #define DEFAULT_GAUDIFF_PRM_1 4 #define DEFAULT_GAUDIFF_PRM_2 8 ///////////////////////////////////////////////// //-------------- CONSTRUCTORS -----------------// ///////////////////////////////////////////////// namespace MONOGENIC { // initialising image only Monogenic::Monogenic(const volume& img) : image(img) { // initialise the trasnform and the filter transform = complexvolume(image,image*0); // set up the filter f_type = DEFAULT_FILTER; f_parm1 = DEFAULT_PRM_1; f_parm2 = DEFAULT_PRM_2; // perform the transform transform_est(); } // initialising image and filter type Monogenic::Monogenic(const volume& img, string& filter_type) : image(img), f_type(filter_type) { // initialise the trasnform and the filter transform = complexvolume(image,image*0); // set up the filter if( f_type == "range" ){ f_parm1 = DEFAULT_RANGE_PRM_1; f_parm2 = DEFAULT_RANGE_PRM_2; }else if( f_type == "gaudiff" ){ f_parm1 = DEFAULT_GAUDIFF_PRM_1; f_parm2 = DEFAULT_GAUDIFF_PRM_2; }else{ cerr << "unknown filter type in Monogenic(const volume& img, string& filter_type)\n"; f_type = DEFAULT_FILTER; f_parm1 = DEFAULT_PRM_1; f_parm2 = DEFAULT_PRM_2; } // perform the transform transform_est(); } // initialising image, filter type and parameters Monogenic::Monogenic(const volume& img, string& filter_type, float parameter_1, float parameter_2) : image(img), f_parm1(parameter_1), f_parm2(parameter_2), f_type(filter_type) { // initialise the trasnform and the filter transform = complexvolume(image,image*0); // perform the transform transform_est(); } Monogenic::~Monogenic(){ transform.destroy(); } ///////////////////////////////////////////////// //-------------- FILTERING --------------------// ///////////////////////////////////////////////// // Note: all filters assume that 'transform' has // been Fourier transformed already. This saves // on FTing when applying multiple filters. // apply the appropriate filter int Monogenic::apply_filter(){ if ( f_type == "range" ){ range(f_parm1,f_parm2); }else if ( f_type == "gaudiff" ){ gau_diff(f_parm1,f_parm2); }else{ cerr << "Unknown filter type in Monogenic::apply_filter()\n"; return -1; } return 1; } // 'Range' filtering int Monogenic::range(float alpha, float beta){ double xo,yo,zo; int width_x,width_y,width_z; double r; double filtsum=0,tempsum=0; double filt_val, temp_val; complexvolume filter(this->xsize(),this->ysize(),this->zsize()); complexvolume tempfilt(this->xsize(),this->ysize(),this->zsize()); width_x = transform.xsize(); width_y = transform.ysize(); width_z = transform.zsize(); float num_den = 0; // numbre by which we have to divide sum_filter to find the value in filter(0, 0, 0) for(int x=0; xxsize(),this->ysize(),this->zsize()); complexvolume tempfilt(this->xsize(),this->ysize(),this->zsize()); width_x = transform.xsize(); width_y = transform.ysize(); width_z = transform.zsize(); for(int x=0; x Monogenic::energy() const{ return transform.abs(); } volume Monogenic::phase() const{ return transform.phase(); } volume& Monogenic::re(){ return transform.re(); } volume& Monogenic::im(){ return transform.im(); } complexref Monogenic::operator()(int x,int y, int z){ return transform(x,y,z); } }