Xmipp  v3.23.11-Nereus
Macros | Functions
wavelet.cpp File Reference
#include <core/bilib/wavelet.h>
#include <core/args.h>
#include <core/histogram.h>
#include <core/xmipp_image.h>
#include <core/xmipp_fftw.h>
#include "wavelet.h"
#include "numerical_tools.h"
#include "mask.h"
Include dependency graph for wavelet.cpp:

Go to the source code of this file.

Macros

#define DWT_Scale(i, smax)   ((int)((i==0)?smax-1:(ABS((CEIL(log10((double)(i+1))/log10(2.0))-smax)))))
 
#define DWT_Quadrant1D(i, s, smax)   ((s!=smax-1)?'1':((i==0)?'0':'1'))
 
#define DWT_QuadrantnD(i, s, sp, smax)   ((s!=sp)?'0':DWT_Quadrant1D(i,s,smax))
 
#define DWT_icoef1D(i, s, smax)   ()
 

Functions

void Bilib_DWT (const MultidimArray< double > &input, MultidimArray< double > &result, int iterations, int isign)
 
void set_DWT_type (int DWT_type)
 
void IDWT (const MultidimArray< double > &v, MultidimArray< double > &result)
 
void DWT_lowpass2D (const MultidimArray< double > &v, MultidimArray< double > &result)
 
std::string Quadrant2D (int q)
 
std::string Quadrant3D (int q)
 
void Get_Scale_Quadrant (int size_x, int x, int &scale, std::string &quadrant)
 
void Get_Scale_Quadrant (int size_x, int size_y, int x, int y, int &scale, std::string &quadrant)
 
void Get_Scale_Quadrant (int size_x, int size_y, int size_z, int x, int y, int z, int &scale, std::string &quadrant)
 
void clean_quadrant2D (MultidimArray< double > &I, int scale, const std::string &quadrant)
 
void clean_quadrant3D (MultidimArray< double > &I, int scale, const std::string &quadrant)
 
void soft_thresholding (MultidimArray< double > &I, double th)
 
void adaptive_soft_thresholding_block2D (MultidimArray< double > &I, int scale, const std::string &quadrant, double sigma)
 
double compute_noise_power (MultidimArray< double > &I)
 
void adaptive_soft_thresholding2D (MultidimArray< double > &I, int scale)
 
void DWT_keep_central_part (MultidimArray< double > &I, double R)
 
void DWT_Bijaoui_denoise_LL2D (MultidimArray< double > &WI, int scale, const std::string &orientation, double mu, double S, double N)
 
void DWT_Bijaoui_denoise_LL3D (MultidimArray< double > &WI, int scale, const std::string &orientation, double mu, double S, double N)
 
void bayesian_solve_eq_system (const Matrix1D< double > &power, const Matrix1D< double > &Ncoefs, double SNR0, double SNRF, double powerI, double power_rest, bool white_noise, Matrix1D< double > &estimatedS)
 
Matrix1D< double > bayesian_wiener_filtering2D (MultidimArray< double > &WI, int allowed_scale, double SNR0, double SNRF, bool white_noise, int tell, bool denoise)
 
void bayesian_wiener_filtering2D (MultidimArray< double > &WI, int allowed_scale, Matrix1D< double > &estimatedS)
 
Matrix1D< double > bayesian_wiener_filtering3D (MultidimArray< double > &WI, int allowed_scale, double SNR0, double SNRF, bool white_noise, int tell, bool denoise)
 
void bayesian_wiener_filtering3D (MultidimArray< double > &WI, int allowed_scale, Matrix1D< double > &estimatedS)
 
void phaseCongMono (MultidimArray< double > &I, MultidimArray< double > &Ph, MultidimArray< double > &Or, MultidimArray< double > &Energy, MultidimArray< double > &lowPass, MultidimArray< double > &Radius, MultidimArray< std::complex< double > > &H, int nScale, double minWaveLength, double mult, double sigmaOnf)
 

Macro Definition Documentation

◆ DWT_icoef1D

#define DWT_icoef1D (   i,
  s,
  smax 
)    ()

Definition at line 246 of file wavelet.cpp.

◆ DWT_Quadrant1D

#define DWT_Quadrant1D (   i,
  s,
  smax 
)    ((s!=smax-1)?'1':((i==0)?'0':'1'))

Definition at line 243 of file wavelet.cpp.

◆ DWT_QuadrantnD

#define DWT_QuadrantnD (   i,
  s,
  sp,
  smax 
)    ((s!=sp)?'0':DWT_Quadrant1D(i,s,smax))

Definition at line 244 of file wavelet.cpp.

◆ DWT_Scale

#define DWT_Scale (   i,
  smax 
)    ((int)((i==0)?smax-1:(ABS((CEIL(log10((double)(i+1))/log10(2.0))-smax)))))

Definition at line 242 of file wavelet.cpp.

Function Documentation

◆ adaptive_soft_thresholding_block2D()

void adaptive_soft_thresholding_block2D ( MultidimArray< double > &  I,
int  scale,
const std::string &  quadrant,
double  sigma 
)

Definition at line 321 of file wavelet.cpp.

323 {
324  // Compute block variance
325  Matrix1D<int> corner1(2), corner2(2);
326  Matrix1D<double> r(2);
327  SelectDWTBlock(scale, I, quadrant,
328  XX(corner1), XX(corner2), YY(corner1), YY(corner2));
329  double dummy, avg, stddev;
330  I.computeStats(avg, stddev, dummy, dummy, corner1, corner2);
331 
332  // Now denoise
333  double th = sigma * sigma / stddev;
334  FOR_ALL_ELEMENTS_IN_ARRAY2D_BETWEEN(corner1, corner2)
335  {
336  if (ABS(I(r)) > th)
337  if (I(r) > 0)
338  I(r) -= th;
339  else
340  I(r) += th;
341  else
342  I(r) = 0;
343  }
344 }
void computeStats(double &avg, double &stddev, T &minval, T &maxval) const
#define XX(v)
Definition: matrix1d.h:85
#define ABS(x)
Definition: xmipp_macros.h:142
double dummy
#define YY(v)
Definition: matrix1d.h:93
void SelectDWTBlock(int scale, const MultidimArray< T > &I, const std::string &quadrant, int &x1, int &x2)
Definition: wavelet.h:134
#define FOR_ALL_ELEMENTS_IN_ARRAY2D_BETWEEN(corner1, corner2)

◆ bayesian_solve_eq_system()

void bayesian_solve_eq_system ( const Matrix1D< double > &  power,
const Matrix1D< double > &  Ncoefs,
double  SNR0,
double  SNRF,
double  powerI,
double  power_rest,
bool  white_noise,
Matrix1D< double > &  estimatedS 
)

Definition at line 476 of file wavelet.cpp.

485 {
486 
487  int scale_dim = power.size();
488 
490  int extra_constraints = 0;
491  if (white_noise)
492  extra_constraints += (scale_dim - 1);
493  A.initZeros(2*(scale_dim - 1) + 2*scale_dim + 2 + extra_constraints, 2*scale_dim);
494  for (int i = 1;i < scale_dim;i++)
495  {
496  A(i - 1, i - 1) = 1;
497  A(i - 1, i) = -1;
498  A(i - 1 + scale_dim - 1, i - 1 + scale_dim) = 1;
499  A(i - 1 + scale_dim - 1, i + scale_dim) = -1;
500  }
501  for (int i = 0;i < 2*scale_dim;i++)
502  A(i + 2*(scale_dim - 1), i) = -1;
503 
504  // Constraints on the SNR
505  Matrix1D<double> aux0coefs(scale_dim);
506  for (int j = 0;j < scale_dim;j++)
507  aux0coefs(j) = Ncoefs(j) * SNR0;
508  Matrix1D<double> auxFcoefs(scale_dim);
509  for (int j = 0;j < scale_dim;j++)
510  auxFcoefs(j) = Ncoefs(j) * SNRF;
511 
512  //initializing the second last row of A
513  for (int j = 0;j < scale_dim;j++)
514  A(2*(scale_dim - 1) + 2*scale_dim, j) = (-1) * auxFcoefs(j);
515  for (int j = scale_dim;j < 2*scale_dim;j++)
516  A(2*(scale_dim - 1) + 2*scale_dim, j) = Ncoefs(j - scale_dim);
517 
518  //initializing the last row of A
519  for (int j = 0;j < scale_dim;j++)
520  A(2*(scale_dim - 1) + 2*scale_dim + 1, j) = aux0coefs(j);
521  for (int j = scale_dim;j < 2*scale_dim;j++)
522  A(2*(scale_dim - 1) + 2*scale_dim + 1, j) = (-1) * Ncoefs(j - scale_dim);
523 
524  // White noise constraints
525  if (white_noise)
526  for (int i = 0; i < scale_dim - 1; i++)
527  {
528  A(A.mdimy - (scale_dim - 1) + i, i) = -1.01;
529  A(A.mdimy - (scale_dim - 1) + i, i + 1) = 1;
530  }
531 
532  //initialize the matrix b
534 
535  // Initialize Aeq matrix
536  Matrix2D<double> Aeq;
537  Aeq.initZeros(1, 2*scale_dim);
538  for (int j = 0;j < scale_dim;j++)
539  {
540  Aeq(0, j) = Ncoefs(j);
541  Aeq(0, j + scale_dim) = Ncoefs(j);
542  }
543 
544  //initialize beq matrix
545  Matrix1D<double> beq;
546  beq.initZeros(1);
547  beq(0) = powerI - power_rest;
548 
549  //initialization of Matrix C (cost matrix)
551  C.initZeros(scale_dim, 2*scale_dim);
552  for (int j = 0;j < scale_dim;j++)
553  {
554  C(j, j) = 1;
555  C(j, j + scale_dim) = 1;
556  }
557 
558  // initialise the estimatedS which will contain the solution vector
559  estimatedS.initZeros(2*scale_dim);
560 #ifdef DEBUG
561  //Writing the matrices to ASCII files for comparing with matlab
562  C.write("./matrices/C.txt");
563  power.write("./matrices/power.txt");
564  A.write("./matrices/A.txt");
565  b.write("./matrices/b.txt");
566  Aeq.write("./matrices/Aeq.txt");
567  beq.write("./matrices/beq.txt");
568 
569  std::cout << "Equation system Cx=d\n"
570  << "C=\n" << C << std::endl
571  << "d=" << (power / Ncoefs).transpose() << std::endl
572  << "Constraints\n"
573  << "Ax<=b\n"
574  << "A=\n" << A << std::endl
575  << "b=" << b.transpose() << std::endl
576  << "Aeq x=beq\n"
577  << "Aeq=\n" << Aeq << std::endl
578  << "beq=" << beq.transpose() << std::endl;
579 #endif
580 
581  // Solve the system
583  leastSquare(C, power / Ncoefs, A, b, Aeq, beq, bl, bu, estimatedS);
584  // COSS
585  estimatedS /= 2;
586 
587 #ifdef DEBUG
588 
589  std::cout << "scale_dim :: " << scale_dim << std::endl;
590  std::cout << "--------estimatedS -------- \n";
591  std::cout << estimatedS;
592  std::cout << "--------------------------- \n";
593  std::cout << "Inequality constraints agreement" << std::endl
594  << (A*estimatedS).transpose() << std::endl;
595  std::cout << "Equality constraints agreement" << std::endl
596  << (Aeq*estimatedS).transpose() << std::endl;
597  std::cout << "Goal function value: " << (C*estimatedS).transpose() << std::endl;
598 #endif
599 }
#define MAT_YSIZE(m)
Definition: matrix2d.h:124
size_t size() const
Definition: matrix1d.h:508
double * bl
void write(const FileName &fn) const
Definition: matrix1d.cpp:794
#define i
Matrix1D< T > transpose() const
Definition: matrix1d.cpp:644
double * bu
doublereal * b
void transpose(double *array, int size)
size_t mdimy
Definition: matrix2d.h:413
void initZeros()
Definition: matrix1d.h:592
#define j
void write(const FileName &fn) const
Definition: matrix2d.cpp:113
void initZeros()
Definition: matrix2d.h:626
void leastSquare(const Matrix2D< double > &C, const Matrix1D< double > &d, const Matrix2D< double > &A, const Matrix1D< double > &b, const Matrix2D< double > &Aeq, const Matrix1D< double > &beq, Matrix1D< double > &bl, Matrix1D< double > &bu, Matrix1D< double > &x)

◆ compute_noise_power()

double compute_noise_power ( MultidimArray< double > &  I)

Definition at line 346 of file wavelet.cpp.

347 {
348  // Compute histogram of the absolute values of the DWT coefficients
349  // at scale=0
350  Histogram1D hist;
351  double avg, stddev, min_val=0., max_val=0.;
352  I.computeStats(avg, stddev, min_val, max_val);
353  hist.init(0, XMIPP_MAX(ABS(min_val), ABS(max_val)), 100);
354 
355  Matrix1D<int> corner1(2), corner2(2);
356  Matrix1D<double> r(2);
357  SelectDWTBlock(0, I, "01",
358  XX(corner1), XX(corner2), YY(corner1), YY(corner2));
359  FOR_ALL_ELEMENTS_IN_ARRAY2D_BETWEEN(corner1, corner2)
360  {
361  double value=fabs(I(r));
362  INSERT_VALUE(hist,value);
363  }
364 
365  SelectDWTBlock(0, I, "10",
366  XX(corner1), XX(corner2), YY(corner1), YY(corner2));
367  FOR_ALL_ELEMENTS_IN_ARRAY2D_BETWEEN(corner1, corner2)
368  {
369  double value=fabs(I(r));
370  INSERT_VALUE(hist,value);
371  }
372 
373  SelectDWTBlock(0, I, "11",
374  XX(corner1), XX(corner2), YY(corner1), YY(corner2));
375  FOR_ALL_ELEMENTS_IN_ARRAY2D_BETWEEN(corner1, corner2)
376  {
377  double value=fabs(I(r));
378  INSERT_VALUE(hist,value);
379  }
380 
381  return hist.percentil(50) / 0.6745;
382 }
#define XMIPP_MAX(x, y)
Definition: xmipp_macros.h:193
#define INSERT_VALUE(histogram, value)
Definition: histogram.h:205
void computeStats(double &avg, double &stddev, T &minval, T &maxval) const
double percentil(double percent_mass)
Definition: histogram.cpp:160
void init(double min_val, double max_val, int n_steps)
Definition: histogram.cpp:71
#define XX(v)
Definition: matrix1d.h:85
#define ABS(x)
Definition: xmipp_macros.h:142
#define YY(v)
Definition: matrix1d.h:93
void SelectDWTBlock(int scale, const MultidimArray< T > &I, const std::string &quadrant, int &x1, int &x2)
Definition: wavelet.h:134
#define FOR_ALL_ELEMENTS_IN_ARRAY2D_BETWEEN(corner1, corner2)

◆ DWT_Bijaoui_denoise_LL2D()

void DWT_Bijaoui_denoise_LL2D ( MultidimArray< double > &  WI,
int  scale,
const std::string &  orientation,
double  mu,
double  S,
double  N 
)

Definition at line 414 of file wavelet.cpp.

417 {
418  Matrix1D<int> x0(2), xF(2), r(2);
419  SelectDWTBlock(scale, WI, orientation, XX(x0), XX(xF), YY(x0), YY(xF));
420 
421  double SN = S + N;
422  double S_N = S / SN;
423  if (S < 1e-6 && N < 1e-6)
424  {
426  A2D_ELEM(WI,YY(r),XX(r)) = 0;
427  }
428  else
429  {
430  double iSN=1.0/SN;
431  double iN=1.0/N;
433  {
434  double &WI_r=A2D_ELEM(WI,YY(r),XX(r));
435  double y = WI_r;
436  double ymu = y - mu;
437  double ymu2 = -0.5 * ymu * ymu;
438  double expymu2SN = exp(ymu2 * iSN);
439  double den = exp(ymu2 * iN) + expymu2SN;
440  if (den > 1e-10)
441  WI_r *= S_N * expymu2SN / den;
442  }
443  }
444 }
#define A2D_ELEM(v, i, j)
static double * y
#define x0
#define XX(v)
Definition: matrix1d.h:85
#define xF
#define YY(v)
Definition: matrix1d.h:93
void SelectDWTBlock(int scale, const MultidimArray< T > &I, const std::string &quadrant, int &x1, int &x2)
Definition: wavelet.h:134
int mu
#define FOR_ALL_ELEMENTS_IN_ARRAY2D_BETWEEN(corner1, corner2)

◆ DWT_Bijaoui_denoise_LL3D()

void DWT_Bijaoui_denoise_LL3D ( MultidimArray< double > &  WI,
int  scale,
const std::string &  orientation,
double  mu,
double  S,
double  N 
)

Definition at line 446 of file wavelet.cpp.

449 {
450  Matrix1D<int> x0(3), xF(3), r(3);
451  SelectDWTBlock(scale, WI, orientation, XX(x0), XX(xF), YY(x0), YY(xF),
452  ZZ(x0), ZZ(xF));
453 
454  double SN = S + N;
455  double S_N = S / SN;
456  if (S < 1e-6 && N < 1e-6)
457  {
459  }
460  else
461  {
463  {
464  double y = WI(r);
465  double ymu = y - mu;
466  double ymu2 = -0.5 * ymu * ymu;
467  double expymu2SN = exp(ymu2 / SN);
468  double den = exp(ymu2 / N) + expymu2SN;
469  if (den > 1e-10)
470  WI(r) = S_N * expymu2SN / den * y;
471  }
472  }
473 }
static double * y
#define x0
#define XX(v)
Definition: matrix1d.h:85
#define xF
#define YY(v)
Definition: matrix1d.h:93
void SelectDWTBlock(int scale, const MultidimArray< T > &I, const std::string &quadrant, int &x1, int &x2)
Definition: wavelet.h:134
int mu
#define ZZ(v)
Definition: matrix1d.h:101
#define FOR_ALL_ELEMENTS_IN_ARRAY3D_BETWEEN(corner1, corner2)