Xmipp  v3.23.11-Nereus
Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
RetinexFilter Class Reference

#include <filters.h>

Inheritance diagram for RetinexFilter:
Inheritance graph
[legend]
Collaboration diagram for RetinexFilter:
Collaboration graph
[legend]

Public Member Functions

void readParams (XmippProgram *program)
 
void apply (MultidimArray< double > &img)
 
void laplacian (const MultidimArray< double > &img, MultidimArray< std::complex< double > > &fimg, bool direct)
 
- Public Member Functions inherited from XmippFilter
virtual ~XmippFilter ()
 
virtual void show ()
 

Static Public Member Functions

static void defineParams (XmippProgram *program)
 

Public Attributes

double percentile
 
double eps
 
Image< int > * mask
 

Detailed Description

Definition at line 1596 of file filters.h.

Member Function Documentation

◆ apply()

void RetinexFilter::apply ( MultidimArray< double > &  img)
virtual

Apply the filter to an image or volume

Implements XmippFilter.

Definition at line 3902 of file filters.cpp.

3903 {
3904  FourierTransformer fft;
3906 
3907  // Apply forward Laplacian
3908  fft.FourierTransform(img,fimg,false);
3909  laplacian(img,fimg,true);
3911 
3912  // Compute the threshold outside the mask
3913  double *sortedValues=nullptr;
3914  size_t Nsorted=0;
3915  if (mask==nullptr)
3916  {
3917  Nsorted=MULTIDIM_SIZE(img);
3918  sortedValues=new double[Nsorted];
3920  sortedValues[n]=fabs(DIRECT_MULTIDIM_ELEM(img,n));
3921  }
3922  else
3923  {
3924  const MultidimArray<int> &mmask=(*mask)();
3926  if (DIRECT_MULTIDIM_ELEM(mmask,n)==0)
3927  Nsorted+=1;
3928 
3929  sortedValues=new double[Nsorted];
3930  size_t i=0;
3932  if (DIRECT_MULTIDIM_ELEM(mmask,n)==0)
3933  sortedValues[i++]=fabs(DIRECT_MULTIDIM_ELEM(img,n));
3934  }
3935  std::sort(sortedValues,sortedValues+Nsorted);
3936  double threshold=sortedValues[(size_t)(percentile*Nsorted)];
3937  delete[] sortedValues;
3938 
3939  // Apply threshold
3941  if (fabs(DIRECT_MULTIDIM_ELEM(img,n))<threshold)
3942  DIRECT_MULTIDIM_ELEM(img,n)=0.0;
3943 
3944  fft.FourierTransform(img,fimg,false);
3945  laplacian(img,fimg,false);
3947 }
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define MULTIDIM_SIZE(v)
#define i
void laplacian(const MultidimArray< double > &img, MultidimArray< std::complex< double > > &fimg, bool direct)
Definition: filters.cpp:3857
void threshold(double *phi, unsigned long nvox, double limit)
Definition: lib_vwk.cpp:524
double percentile
Definition: filters.h:1599
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
void sort(struct DCEL_T *dcel)
Definition: sorting.cpp:18
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
int * n
Image< int > * mask
Definition: filters.h:1601

◆ defineParams()

void RetinexFilter::defineParams ( XmippProgram program)
static

Define the parameters for use inside an Xmipp program

Definition at line 3835 of file filters.cpp.

3836 {
3837  program->addParamsLine("== Retinex ==");
3838  program->addParamsLine(
3839  " [ --retinex <percentile=0.9> <mask_file=\"\"> <eps=1>] : Retinex filter, remove a given percentile of the");
3840  program->addParamsLine(" : Laplacian within the mask, epsilon controls the behaviour at low frequency");
3841 }
void addParamsLine(const String &line)

◆ laplacian()

void RetinexFilter::laplacian ( const MultidimArray< double > &  img,
MultidimArray< std::complex< double > > &  fimg,
bool  direct 
)

Compute Laplacian

Definition at line 3857 of file filters.cpp.

3859 {
3860  if (ZSIZE(img)>1)
3861  {
3862  Matrix1D<double> w(3);
3863  for (size_t k=0; k<ZSIZE(fimg); k++)
3864  {
3865  FFT_IDX2DIGFREQ(k,ZSIZE(img),ZZ(w));
3866  double filter_k=6+eps-2*cos(TWOPI*ZZ(w));
3867  for (size_t i=0; i<YSIZE(fimg); i++)
3868  {
3869  FFT_IDX2DIGFREQ(i,YSIZE(img),YY(w));
3870  double filter_ki=filter_k-2*cos(TWOPI*YY(w));
3871  for (size_t j=0; j<XSIZE(fimg); j++)
3872  {
3873  FFT_IDX2DIGFREQ(j,XSIZE(img),XX(w));
3874  double filter_kij=filter_ki-2*cos(TWOPI*XX(w));
3875  if (!direct && filter_kij>0)
3876  filter_kij=1.0/filter_kij;
3877  DIRECT_A3D_ELEM(fimg,k,i,j)*=filter_kij;
3878  }
3879  }
3880  }
3881  }
3882  else
3883  {
3884  Matrix1D<double> w(2);
3885  for (size_t i=0; i<YSIZE(fimg); i++)
3886  {
3887  FFT_IDX2DIGFREQ(i,YSIZE(img),YY(w));
3888  double filter_i=4+eps-2*cos(TWOPI*YY(w));
3889  for (size_t j=0; j<XSIZE(fimg); j++)
3890  {
3891  FFT_IDX2DIGFREQ(j,XSIZE(img),XX(w));
3892  double filter_ij=filter_i-2*cos(TWOPI*XX(w));
3893  if (!direct && filter_ij>0)
3894  filter_ij=1.0/filter_ij;
3895  DIRECT_A2D_ELEM(fimg,i,j)*=filter_ij;
3896  }
3897  }
3898  }
3899 }
#define YSIZE(v)
#define DIRECT_A2D_ELEM(v, i, j)
#define TWOPI
Definition: xmipp_macros.h:111
doublereal * w
double eps
Definition: filters.h:1600
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define XX(v)
Definition: matrix1d.h:85
#define XSIZE(v)
#define ZSIZE(v)
#define DIRECT_A3D_ELEM(v, k, i, j)
__device__ float FFT_IDX2DIGFREQ(int idx, int size)
#define j
#define YY(v)
Definition: matrix1d.h:93
#define ZZ(v)
Definition: matrix1d.h:101

◆ readParams()

void RetinexFilter::readParams ( XmippProgram program)
virtual

Read from program command line

Reimplemented from XmippFilter.

Definition at line 3844 of file filters.cpp.

3845 {
3846  percentile = program->getDoubleParam("--retinex",0);
3847  String fnMask = program->getParam("--retinex",1);
3848  if (fnMask=="")
3849  mask = nullptr;
3850  else
3851  {
3852  mask = new Image<int>;
3853  mask->read(fnMask);
3854  }
3855  eps = program->getDoubleParam("--retinex",2);
3856 }
double getDoubleParam(const char *param, int arg=0)
double eps
Definition: filters.h:1600
const char * getParam(const char *param, int arg=0)
double percentile
Definition: filters.h:1599
std::string String
Definition: xmipp_strings.h:34
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
Image< int > * mask
Definition: filters.h:1601

Member Data Documentation

◆ eps

double RetinexFilter::eps

Definition at line 1600 of file filters.h.

◆ mask

Image<int>* RetinexFilter::mask

Definition at line 1601 of file filters.h.

◆ percentile

double RetinexFilter::percentile

Definition at line 1599 of file filters.h.


The documentation for this class was generated from the following files: