Xmipp  v3.23.11-Nereus
Classes | Macros | Functions | Variables
filters.cpp File Reference
#include <queue>
#include <list>
#include "data/fourier_filter.h"
#include "core/histogram.h"
#include "core/metadata_extension.h"
#include "core/multidim_array.h"
#include "core/transformations.h"
#include "core/xmipp_program.h"
#include "filters.h"
#include "mask.h"
#include "morphology.h"
#include "wavelet.h"
Include dependency graph for filters.cpp:

Go to the source code of this file.

Classes

struct  Coordinate2D
 
struct  Coordinate3D
 

Macros

#define CHECK_POINT(i, j)
 
#define CHECK_POINT_3D(k, i, j)
 
#define CHECK_POINT_3D(k, i, j)
 
#define CHECK_POINT_DIST(i, j, proposedDistance)
 

Functions

void substractBackgroundPlane (MultidimArray< double > &I)
 
void substractBackgroundRollingBall (MultidimArray< double > &I, int radius)
 
void detectBackground (const MultidimArray< double > &vol, MultidimArray< double > &mask, double alpha, double &final_mean)
 
void contrastEnhancement (Image< double > *I)
 
void regionGrowing2D (const MultidimArray< double > &I_in, MultidimArray< double > &I_out, int i, int j, float stop_colour, float filling_colour, bool less, int neighbourhood)
 
void regionGrowing3D (const MultidimArray< double > &V_in, MultidimArray< double > &V_out, int k, int i, int j, float stop_colour, float filling_colour, bool less)
 
void regionGrowing3DEqualValue (const MultidimArray< double > &V_in, MultidimArray< int > &V_out, int filling_value=0)
 
void distanceTransform (const MultidimArray< int > &in, MultidimArray< int > &out, bool wrap)
 
int labelImage2D (const MultidimArray< double > &I, MultidimArray< double > &label, int neighbourhood)
 
int labelImage3D (const MultidimArray< double > &V, MultidimArray< double > &label)
 
void removeSmallComponents (MultidimArray< double > &I, int size, int neighbourhood)
 
void keepBiggestComponent (MultidimArray< double > &I, double percentage, int neighbourhood)
 
void fillBinaryObject (MultidimArray< double > &I, int neighbourhood)
 
void varianceFilter (MultidimArray< double > &I, int kernelSize, bool relative)
 
void noisyZonesFilter (MultidimArray< double > &I, int kernelSize)
 
double giniCoeff (MultidimArray< double > &I, int varKernelSize)
 
double OtsuSegmentation (MultidimArray< double > &V)
 
double EntropySegmentation (MultidimArray< double > &V)
 
double EntropyOtsuSegmentation (MultidimArray< double > &V, double percentil, bool binarizeVolume)
 
double fastCorrentropy (const MultidimArray< double > &x, const MultidimArray< double > &y, double sigma, const GaussianInterpolator &G, const MultidimArray< int > &mask)
 
double imedDistance (const MultidimArray< double > &I1, const MultidimArray< double > &I2)
 
double imedNormalizedDistance (const MultidimArray< double > &I1, const MultidimArray< double > &I2)
 
double correlationMasked (const MultidimArray< double > &I1, const MultidimArray< double > &I2)
 
double correlationWeighted (MultidimArray< double > &I1, MultidimArray< double > &I2)
 
double svdCorrelation (const MultidimArray< double > &I1, const MultidimArray< double > &I2, const MultidimArray< int > *mask)
 
void covarianceMatrix (const MultidimArray< double > &I, Matrix2D< double > &C)
 
template float bestShift (MultidimArray< float > &, float &, float &, const MultidimArray< int > *, int)
 
template<typename T >
bestShift (MultidimArray< T > &Mcorr, T &shiftX, T &shiftY, const MultidimArray< int > *mask, int maxShift)
 
double bestShift (const MultidimArray< double > &I1, const MultidimArray< std::complex< double > > &FFTI1, const MultidimArray< double > &I2, double &shiftX, double &shiftY, CorrelationAux &aux, const MultidimArray< int > *mask, int maxShift)
 
double bestShift (const MultidimArray< double > &I1, const MultidimArray< double > &I2, double &shiftX, double &shiftY, CorrelationAux &aux, const MultidimArray< int > *mask, int maxShift)
 
double bestShift (const MultidimArray< std::complex< double > > &FFTI1, const MultidimArray< std::complex< double > > &FFTI2, MultidimArray< double > &Mcorr, double &shiftX, double &shiftY, CorrelationAux &aux, const MultidimArray< int > *mask, int maxShift)
 
void bestShift (const MultidimArray< double > &I1, const MultidimArray< double > &I2, double &shiftX, double &shiftY, double &shiftZ, CorrelationAux &aux, const MultidimArray< int > *mask)
 
void bestNonwrappingShift (const MultidimArray< double > &I1, const MultidimArray< double > &I2, double &shiftX, double &shiftY, CorrelationAux &aux)
 
void bestNonwrappingShift (const MultidimArray< double > &I1, const MultidimArray< std::complex< double > > &FFTI1, const MultidimArray< double > &I2, double &shiftX, double &shiftY, CorrelationAux &aux)
 
double bestShiftRealSpace (const MultidimArray< double > &I1, MultidimArray< double > &I2, double &shiftX, double &shiftY, const MultidimArray< int > *mask, int maxShift, double shiftStep)
 
void computeAlignmentTransforms (const MultidimArray< double > &I, AlignmentTransforms &ITransforms, AlignmentAux &aux, CorrelationAux &aux2)
 
double alignImages (const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3)
 
double alignImages (const MultidimArray< double > &Iref, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3)
 
double alignImages (const MultidimArray< double > &Iref, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap)
 
double alignImagesConsideringMirrors (const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3, bool wrap, const MultidimArray< int > *mask)
 
double alignImagesConsideringMirrors (const MultidimArray< double > &Iref, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap)
 
double alignImagesConsideringMirrors (const MultidimArray< double > &Iref, MultidimArray< double > &I, Matrix2D< double > &M, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3, bool wrap, const MultidimArray< int > *mask)
 
void alignSetOfImages (MetaData &MD, MultidimArray< double > &Iavg, int Niter, bool considerMirror)
 
double fastBestRotation (const MultidimArray< double > &IrefCyl, const MultidimArray< double > &Icyl, CorrelationAux &aux, VolumeAlignmentAux &aux2, double deltaAng)
 
double fastBestRotationAroundZ (const MultidimArray< double > &IrefCyl, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
 
double fastBestRotationAroundY (const MultidimArray< double > &IrefCyl, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
 
double fastBestRotationAroundX (const MultidimArray< double > &IrefCyl, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
 
void fastBestRotation (const MultidimArray< double > &IrefCylZ, const MultidimArray< double > &IrefCylY, const MultidimArray< double > &IrefCylX, const MultidimArray< double > &I, const MultidimArray< double > &Icurrent, MultidimArray< double > &Ifinal, char axis, Matrix2D< double > &R, CorrelationAux &aux, VolumeAlignmentAux &aux2)
 
void fastBestRotation (const MultidimArray< double > &IrefCylZ, const MultidimArray< double > &IrefCylY, const MultidimArray< double > &IrefCylX, MultidimArray< double > &I, const String &eulerAngles, Matrix2D< double > &R, CorrelationAux &aux, VolumeAlignmentAux &aux2)
 
double bestRotationAroundZ (const MultidimArray< double > &Iref, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
 
double unnormalizedGaussian2D (const Matrix1D< double > &r, const Matrix1D< double > &mu, const Matrix2D< double > &sigmainv)
 
void estimateGaussian2D (const MultidimArray< double > &I, double &a, double &b, Matrix1D< double > &mu, Matrix2D< double > &sigma, bool estimateMu, int iterations)
 
void fourierBesselDecomposition (const MultidimArray< double > &img_in, double r2, int k1, int k2)
 
double Shah_energy (const MultidimArray< double > &img, const MultidimArray< double > &surface_strength, const MultidimArray< double > &edge_strength, double K, const Matrix1D< double > &W)
 
double Update_surface_Shah (MultidimArray< double > &img, MultidimArray< double > &surface_strength, MultidimArray< double > &edge_strength, const Matrix1D< double > &W)
 
double Update_edge_Shah (MultidimArray< double > &img, MultidimArray< double > &surface_strength, MultidimArray< double > &edge_strength, double K, const Matrix1D< double > &W)
 
void smoothingShah (MultidimArray< double > &img, MultidimArray< double > &surface_strength, MultidimArray< double > &edge_strength, const Matrix1D< double > &W, int OuterLoops, int InnerLoops, int RefinementLoops, bool adjust_range)
 
double tomographicDiffusion (MultidimArray< double > &V, const Matrix1D< double > &alpha, double lambda)
 
void rotationalInvariantMoments (const MultidimArray< double > &img, const MultidimArray< int > *mask, MultidimArray< double > &v_out)
 
void inertiaMoments (const MultidimArray< double > &img, const MultidimArray< int > *mask, Matrix1D< double > &v_out, Matrix2D< double > &u)
 
void fillTriangle (MultidimArray< double > &img, int *tx, int *ty, double color)
 
void localThresholding (MultidimArray< double > &img, double C, double dimLocal, MultidimArray< int > &result, MultidimArray< int > *mask)
 
void centerImageTranslationally (MultidimArray< double > &I, CorrelationAux &aux)
 
void centerImageRotationally (MultidimArray< double > &I, RotationalCorrelationAux &aux)
 
Matrix2D< double > centerImage (MultidimArray< double > &I, CorrelationAux &aux, RotationalCorrelationAux &aux2, int Niter, bool limitShift)
 
void forcePositive (MultidimArray< double > &V)
 
void computeEdges (const MultidimArray< double > &vol, MultidimArray< double > &vol_edge)
 
void forceDWTSparsity (MultidimArray< double > &V, double eps)
 
double denoiseTVenergy (double mu, const MultidimArray< double > &X, const MultidimArray< double > &Y, double s, double q, double lambda, double sigmag, double g)
 
void denoiseTVgradient (double mu, const MultidimArray< double > &X, const MultidimArray< double > &Y, double s, double q, double lambda, double sigmag, double g, MultidimArray< double > &gradientI)
 
void denoiseTVproj (const MultidimArray< double > &X, const MultidimArray< double > &Y, double theta, MultidimArray< double > &dold)
 
void denoiseTVFilter (MultidimArray< double > &xnew, int maxIter)
 
void matlab_filter (Matrix1D< double > &B, Matrix1D< double > &A, const MultidimArray< double > &X, MultidimArray< double > &Y, MultidimArray< double > &Z)
 
template<typename T >
double mutualInformation (const MultidimArray< T > &x, const MultidimArray< T > &y, int nx, int ny, const MultidimArray< int > *mask)
 

Variables

constexpr double SHIFT_THRESHOLD = 0.95
 
constexpr float ROTATE_THRESHOLD = 1.0
 
constexpr double INITIAL_SHIFT_THRESHOLD = SHIFT_THRESHOLD + 1.0
 
constexpr float INITIAL_ROTATE_THRESHOLD = ROTATE_THRESHOLD + 1.0
 
constexpr double SHAH_CONVERGENCE_THRESHOLD = 0.0001
 

Macro Definition Documentation

◆ CHECK_POINT

#define CHECK_POINT (   i,
  j 
)
Value:
{ \
int I=i; \
int J=j; \
if (INSIDEXY(I_out,J,I)) { \
double pixel=A2D_ELEM(I_out,I,J);\
if (pixel!=filling_colour) \
if ((less && pixel < stop_colour) || \
(!less && pixel > stop_colour)) { \
coord.ii=I; \
coord.jj=J; \
A2D_ELEM (I_out,coord.ii,coord.jj)=filling_colour; \
iNeighbours.push_front(coord); \
} \
} \
}
#define INSIDEXY(v, x, y)
#define A2D_ELEM(v, i, j)
#define i
#define j

◆ CHECK_POINT_3D [1/2]

#define CHECK_POINT_3D (   k,
  i,
  j 
)
Value:
{\
int I=i; \
int J=j; \
int K=k; \
if (INSIDEXYZ(V_out,J,I,K)) { \
double voxel=A3D_ELEM(V_out,K,I,J); \
if (voxel!=filling_colour) \
if ((less && voxel < stop_colour)|| \
(!less &&voxel > stop_colour)) { \
coord.ii=I; \
coord.jj=J; \
coord.kk=K; \
A3D_ELEM (V_out,coord.kk,coord.ii,coord.jj)=filling_colour; \
iNeighbours.push_front(coord); \
} \
}\
}
#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 A3D_ELEM(V, k, i, j)
#define INSIDEXYZ(v, x, y, z)
#define j
constexpr int K

◆ CHECK_POINT_3D [2/2]

#define CHECK_POINT_3D (   k,
  i,
  j 
)
Value:
{\
int I=i; \
int J=j; \
int K=k; \
if (INSIDEXYZ(V_out,J,I,K)) { \
if (A3D_ELEM(V_in,K,I,J)==bgColor && A3D_ELEM(V_out,K,I,J)==1) { \
coord.ii=I; \
coord.jj=J; \
coord.kk=K; \
A3D_ELEM (V_out,coord.kk,coord.ii,coord.jj)=filling_value; \
iNeighbours.push_front(coord); \
} \
}\
}\
#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 A3D_ELEM(V, k, i, j)
#define INSIDEXYZ(v, x, y, z)
#define j
constexpr int K

◆ CHECK_POINT_DIST

#define CHECK_POINT_DIST (   i,
  j,
  proposedDistance 
)
Value:
{ \
int ip=i; \
int jp=j; \
if (wrap) \
{ \
ip=intWRAP(ip,STARTINGY(out),FINISHINGY(out));\
jp=intWRAP(jp,STARTINGX(out),FINISHINGX(out));\
} \
if (ip>=STARTINGY(out) && ip<=FINISHINGY(out) && \
jp>=STARTINGX(out) && jp<=FINISHINGX(out)) \
if (out(ip,jp)>proposedDistance) \
{ \
out(ip,jp)=proposedDistance; \
toExplore.push_back(ip); \
toExplore.push_back(jp); \
toExplore.push_back(proposedDistance); \
} \
}
#define FINISHINGX(v)
#define STARTINGX(v)
#define i
#define STARTINGY(v)
#define j
#define FINISHINGY(v)
#define intWRAP(x, x0, xF)
Definition: xmipp_macros.h:272

Function Documentation

◆ alignImages()

double alignImages ( const MultidimArray< double > &  Iref,
const AlignmentTransforms IrefTransforms,
MultidimArray< double > &  I,
Matrix2D< double > &  M,
bool  wrap,
AlignmentAux aux,
CorrelationAux aux2,
RotationalCorrelationAux aux3 
)

Definition at line 2047 of file filters.cpp.

2050 {
2051  I.checkDimension(2);
2052 
2053  aux.ARS.initIdentity(3);
2054  aux.ASR.initIdentity(3);
2055  aux.IauxSR = I;
2056  aux.IauxRS = I;
2057 
2058  aux.rotationalCorr.resize(2 * IrefTransforms.polarFourierI.getSampleNoOuterRing() - 1);
2060 
2061  double shiftXSR=INITIAL_SHIFT_THRESHOLD;
2062  double shiftYSR=INITIAL_SHIFT_THRESHOLD;
2063  double bestRotSR=INITIAL_ROTATE_THRESHOLD;
2064  double shiftXRS=INITIAL_SHIFT_THRESHOLD;
2065  double shiftYRS=INITIAL_SHIFT_THRESHOLD;
2066  double bestRotRS=INITIAL_ROTATE_THRESHOLD;
2067 
2068  // Align the image with the reference
2069  for (int i = 0; i < 3; i++)
2070  {
2071  // Shift then rotate
2072  if (((shiftXSR > SHIFT_THRESHOLD) || (shiftXSR < (-SHIFT_THRESHOLD))) ||
2073  ((shiftYSR > SHIFT_THRESHOLD) || (shiftYSR < (-SHIFT_THRESHOLD))))
2074  {
2075  bestNonwrappingShift(Iref, IrefTransforms.FFTI, aux.IauxSR, shiftXSR, shiftYSR, aux2);
2076  MAT_ELEM(aux.ASR,0,2) += shiftXSR;
2077  MAT_ELEM(aux.ASR,1,2) += shiftYSR;
2078  applyGeometry(xmipp_transformation::LINEAR, aux.IauxSR, I, aux.ASR, xmipp_transformation::IS_NOT_INV, wrap);
2079  }
2080 
2081  if (bestRotSR > ROTATE_THRESHOLD)
2082  {
2084  XSIZE(Iref) / 5, XSIZE(Iref) / 2, aux.plans, 1);
2085 
2086  bestRotSR = best_rotation(IrefTransforms.polarFourierI, aux.polarFourierI, aux3);
2087  rotation2DMatrix(bestRotSR, aux.R);
2088  aux.ASR = aux.R * aux.ASR;
2089  applyGeometry(xmipp_transformation::LINEAR, aux.IauxSR, I, aux.ASR, xmipp_transformation::IS_NOT_INV, wrap);
2090  }
2091 
2092  // Rotate then shift
2093  if (bestRotRS > ROTATE_THRESHOLD)
2094  {
2096  XSIZE(Iref) / 5, XSIZE(Iref) / 2, aux.plans, 1);
2097  bestRotRS = best_rotation(IrefTransforms.polarFourierI, aux.polarFourierI, aux3);
2098  rotation2DMatrix(bestRotRS, aux.R);
2099  aux.ARS = aux.R * aux.ARS;
2100  applyGeometry(xmipp_transformation::LINEAR, aux.IauxRS, I, aux.ARS, xmipp_transformation::IS_NOT_INV, wrap);
2101  }
2102 
2103  if (((shiftXRS > SHIFT_THRESHOLD) || (shiftXRS < (-SHIFT_THRESHOLD))) ||
2104  ((shiftYRS > SHIFT_THRESHOLD) || (shiftYRS < (-SHIFT_THRESHOLD))))
2105  {
2106  bestNonwrappingShift(Iref, IrefTransforms.FFTI, aux.IauxRS, shiftXRS, shiftYRS, aux2);
2107  MAT_ELEM(aux.ARS,0,2) += shiftXRS;
2108  MAT_ELEM(aux.ARS,1,2) += shiftYRS;
2109  applyGeometry(xmipp_transformation::LINEAR, aux.IauxRS, I, aux.ARS, xmipp_transformation::IS_NOT_INV, wrap);
2110  }
2111  }
2112 
2113  double corrRS = correlationIndex(aux.IauxRS, Iref);
2114  double corrSR = correlationIndex(aux.IauxSR, Iref);
2115  double corr;
2116  if (corrRS > corrSR)
2117  {
2118  I = aux.IauxRS;
2119  M = aux.ARS;
2120  corr = corrRS;
2121  }
2122  else
2123  {
2124  I = aux.IauxSR;
2125  M = aux.ASR;
2126  corr = corrSR;
2127  }
2128  return corr;
2129 }
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
MultidimArray< double > IauxRS
Definition: filters.h:512
MultidimArray< std::complex< double > > FFTI
Definition: filters.h:526
constexpr float INITIAL_ROTATE_THRESHOLD
Definition: filters.cpp:2045
Matrix2D< double > ASR
Definition: filters.h:509
MultidimArray< double > IauxSR
Definition: filters.h:511
int getSampleNoOuterRing() const
Definition: polar.h:386
void applyGeometry(int SplineDegree, MultidimArray< std::complex< double > > &V2, const MultidimArray< std::complex< double > > &V1, const Matrix2D< double > &A, bool inv, bool wrap, std::complex< double > outside, MultidimArray< double > *BcoeffsPtr)
double correlationIndex(const MultidimArray< T > &x, const MultidimArray< T > &y, const MultidimArray< int > *mask=NULL, MultidimArray< double > *Contributions=NULL)
Polar_fftw_plans * plans
Definition: filters.h:514
void bestNonwrappingShift(const MultidimArray< double > &I1, const MultidimArray< double > &I2, double &shiftX, double &shiftY, CorrelationAux &aux)
Definition: filters.cpp:1895
#define i
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
constexpr float ROTATE_THRESHOLD
Definition: filters.cpp:2043
double best_rotation(const Polar< std::complex< double > > &I1, const Polar< std::complex< double > > &I2, RotationalCorrelationAux &aux)
Definition: polar.cpp:212
void setReal(MultidimArray< double > &img)
Definition: xmipp_fftw.cpp:129
constexpr double INITIAL_SHIFT_THRESHOLD
Definition: filters.cpp:2044
#define XSIZE(v)
Polar< std::complex< double > > polarFourierI
Definition: filters.h:515
MultidimArray< double > rotationalCorr
Definition: filters.h:513
void rotation2DMatrix(T ang, Matrix2D< T > &result, bool homogeneous)
template void polarFourierTransform< true >(MultidimArray< double > const &, Polar< double > &, Polar< std::complex< double > > &, bool, int, int, Polar_fftw_plans *&, int)
constexpr double SHIFT_THRESHOLD
Definition: filters.cpp:2042
FourierTransformer local_transformer
Definition: polar.h:794
Matrix2D< double > R
Definition: filters.h:510
Matrix2D< double > ARS
Definition: filters.h:508
Polar< std::complex< double > > polarFourierI
Definition: filters.h:525
void initIdentity()
Definition: matrix2d.h:673

◆ alignImagesConsideringMirrors() [1/2]

double alignImagesConsideringMirrors ( const MultidimArray< double > &  Iref,
const AlignmentTransforms IrefTransforms,
MultidimArray< double > &  I,
Matrix2D< double > &  M,
AlignmentAux aux,
CorrelationAux aux2,
RotationalCorrelationAux aux3,
bool  wrap,
const MultidimArray< int > *  mask = nullptr 
)

Fast alignment of two images considering mirrors. The transforms of Iref are presumed to be precomputed in IrefTransforms.

Definition at line 2150 of file filters.cpp.

2154 {
2155  MultidimArray<double> Imirror;
2156  Matrix2D<double> Mmirror;
2157  Imirror = I;
2158  Imirror.selfReverseX();
2159  Imirror.setXmippOrigin();
2160 
2161  double corr=alignImages(Iref, IrefTransforms, I, M, wrap, aux, aux2, aux3);
2162  double corrMirror=alignImages(Iref, IrefTransforms, Imirror, Mmirror, wrap, aux, aux2, aux3);
2163  if (mask!=nullptr)
2164  {
2165  corr = correlationIndex(Iref, I, mask);
2166  corrMirror = correlationIndex(Iref, Imirror, mask);
2167  }
2168  double bestCorr = corr;
2169  if (corrMirror > bestCorr)
2170  {
2171  bestCorr = corrMirror;
2172  I = Imirror;
2173  M = Mmirror;
2174  MAT_ELEM(M,0,0) *= -1;
2175  MAT_ELEM(M,1,0) *= -1;
2176  }
2177  return bestCorr;
2178 }
double alignImages(const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3)
Definition: filters.cpp:2047
double correlationIndex(const MultidimArray< T > &x, const MultidimArray< T > &y, const MultidimArray< int > *mask=NULL, MultidimArray< double > *Contributions=NULL)
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116

◆ alignImagesConsideringMirrors() [2/2]

double alignImagesConsideringMirrors ( const MultidimArray< double > &  Iref,
MultidimArray< double > &  I,
Matrix2D< double > &  M,
bool  wrap 
)

Align two images considering mirrors

Definition at line 2180 of file filters.cpp.

2182 {
2183  AlignmentAux aux;
2184  CorrelationAux aux2;
2186  return alignImagesConsideringMirrors(Iref, I, M, aux, aux2, aux3, wrap, nullptr);
2187 }
double alignImagesConsideringMirrors(const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3, bool wrap, const MultidimArray< int > *mask)
Definition: filters.cpp:2150

◆ alignSetOfImages()

void alignSetOfImages ( MetaData MD,
MultidimArray< double > &  Iavg,
int  Niter = 10,
bool  considerMirror = true 
)

Align a set of images. Align a set of images and produce a class average as well as the set of alignment parameters. The output is in Iavg. The metadata is modified by adding the alignment information (transformation and euclidean distance to the average. The process is iterative, first an average is computed. All images are aligned to the average, and this is updated. The process is run for a given number of iterations.

Definition at line 2199 of file filters.cpp.

2201 {
2202  Image<double> I;
2203  MultidimArray<double> InewAvg;
2204  FileName fnImg;
2205  AlignmentAux aux;
2206  CorrelationAux aux2;
2208  Matrix2D<double> M;
2209  size_t Nimgs;
2210  size_t Xdim;
2211  size_t Ydim;
2212  size_t Zdim;
2213  getImageSize(MD, Xdim, Ydim, Zdim, Nimgs);
2214  for (int n = 0; n < Niter; ++n)
2215  {
2216  bool lastIteration = (n == (Niter - 1));
2217  InewAvg.initZeros(Ydim, Xdim);
2218  InewAvg.setXmippOrigin();
2219  for (size_t objId : MD.ids())
2220  {
2221  MD.getValue(MDL_IMAGE, fnImg, objId);
2222  I.read(fnImg);
2223  I().setXmippOrigin();
2224  double corr;
2225  if (considerMirror)
2226  corr = alignImagesConsideringMirrors(Iavg, I(), M, aux, aux2,
2227  aux3, xmipp_transformation::WRAP);
2228  else
2229  corr = alignImages(Iavg, I(), M, xmipp_transformation::WRAP, aux, aux2, aux3);
2230  InewAvg += I();
2231  if (n == 0)
2232  Iavg = InewAvg;
2233  if (lastIteration)
2234  {
2235  double scale;
2236  double shiftx;
2237  double shifty;
2238  double psi;
2239  bool flip;
2240  transformationMatrix2Parameters2D(M, flip, scale, shiftx,
2241  shifty, psi);
2242  MD.setValue(MDL_FLIP, flip, objId);
2243  MD.setValue(MDL_SHIFT_X, shiftx, objId);
2244  MD.setValue(MDL_SHIFT_Y, shifty, objId);
2245  MD.setValue(MDL_ANGLE_PSI, psi, objId);
2246  MD.setValue(MDL_MAXCC, corr, objId);
2247  }
2248  }
2249  InewAvg /= Nimgs;
2250  Iavg = InewAvg;
2251  centerImage(Iavg, aux2, aux3, 4);
2252  }
2253 }
void transformationMatrix2Parameters2D(const Matrix2D< T > &A, bool &flip, T &scale, T &shiftX, T &shiftY, T &psi)
double alignImages(const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3)
Definition: filters.cpp:2047
Shift for the image in the X axis (double)
void getImageSize(const MetaData &md, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, MDLabel image_label)
Special label to be used when gathering MDs in MpiMetadataPrograms.
virtual IdIteratorProxy< false > ids()
virtual bool getValue(MDObject &mdValueOut, size_t id) const =0
Matrix2D< double > centerImage(MultidimArray< double > &I, CorrelationAux &aux, RotationalCorrelationAux &aux2, int Niter, bool limitShift)
Definition: filters.cpp:3277
Flip the image? (bool)
Maximum cross-correlation for the image (double)
bool setValue(const MDLabel label, const T &valueIn, size_t id)
double psi(const double x)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
Shift for the image in the Y axis (double)
void initZeros(const MultidimArray< T1 > &op)
double alignImagesConsideringMirrors(const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3, bool wrap, const MultidimArray< int > *mask)
Definition: filters.cpp:2150
int * n
Name of an image (std::string)

◆ bestNonwrappingShift()

void bestNonwrappingShift ( const MultidimArray< double > &  I1,
const MultidimArray< std::complex< double > > &  FFTI1,
const MultidimArray< double > &  I2,
double &  shiftX,
double &  shiftY,
CorrelationAux aux 
)

Translational search (non-wrapping). Assumes that the FFTI1 is already computed.

Definition at line 1903 of file filters.cpp.

1906 {
1907  I1.checkDimension(2);
1908  I2.checkDimension(2);
1909 
1910  bestShift(I1, FFTI1, I2, shiftX, shiftY, aux);
1911  double bestCorr;
1912  double corr;
1913  MultidimArray<double> Iaux;
1914 
1915  translate(1, Iaux, I1, vectorR2(-shiftX, -shiftY), xmipp_transformation::DONT_WRAP);
1916  //I1.translate(vectorR2(-shiftX,-shiftY),Iaux, DONT_WRAP);
1917  bestCorr = corr = fastCorrelation(I2, Iaux);
1918  double finalX = shiftX;
1919  double finalY = shiftY;
1920 #ifdef DEBUG
1921 
1922  std::cout << "shiftX=" << shiftX << " shiftY=" << shiftY
1923  << " corr=" << corr << std::endl;
1924  ImageXmipp save;
1925  save()=I1;
1926  save.write("PPPI1.xmp");
1927  save()=I2;
1928  save.write("PPPI2.xmp");
1929  save()=Iaux;
1930  save.write("PPPpp.xmp");
1931 #endif
1932 
1933  Iaux.initZeros();
1934  double testX = (shiftX > 0) ? (shiftX - XSIZE(I1)) : (shiftX + XSIZE(I1));
1935  double testY = shiftY;
1936  translate(1, Iaux, I1, vectorR2(-testX, -testY), xmipp_transformation::DONT_WRAP);
1937  //I1.translate(vectorR2(-testX,-testY),Iaux,DONT_WRAP);
1938  corr = fastCorrelation(I2, Iaux);
1939  if (corr > bestCorr)
1940  finalX = testX;
1941 #ifdef DEBUG
1942 
1943  std::cout << "shiftX=" << testX << " shiftY=" << testY
1944  << " corr=" << corr << std::endl;
1945  save()=Iaux;
1946  save.write("PPPmp.xmp");
1947 #endif
1948 
1949  Iaux.initZeros();
1950  testX = shiftX;
1951  testY = (shiftY > 0) ? (shiftY - YSIZE(I1)) : (shiftY + YSIZE(I1));
1952  translate(1, Iaux, I1, vectorR2(-testX, -testY), xmipp_transformation::DONT_WRAP);
1953  //I1.translate(vectorR2(-testX,-testY),Iaux,DONT_WRAP);
1954  corr = fastCorrelation(I2, Iaux);
1955  if (corr > bestCorr)
1956  finalY = testY;
1957 #ifdef DEBUG
1958 
1959  std::cout << "shiftX=" << testX << " shiftY=" << testY
1960  << " corr=" << corr << std::endl;
1961  save()=Iaux;
1962  save.write("PPPpm.xmp");
1963 #endif
1964 
1965  Iaux.initZeros();
1966  testX = (shiftX > 0) ? (shiftX - XSIZE(I1)) : (shiftX + XSIZE(I1));
1967  testY = (shiftY > 0) ? (shiftY - YSIZE(I1)) : (shiftY + YSIZE(I1));
1968  translate(1, Iaux, I1, vectorR2(-testX, -testY), xmipp_transformation::DONT_WRAP);
1969  //I1.translate(vectorR2(-testX,-testY),Iaux,DONT_WRAP);
1970  corr = fastCorrelation(I2, Iaux);
1971  if (corr > bestCorr)
1972  {
1973  finalX = testX;
1974  finalY = testY;
1975  }
1976 #ifdef DEBUG
1977  std::cout << "shiftX=" << testX << " shiftY=" << testY
1978  << " corr=" << corr << std::endl;
1979  save()=Iaux;
1980  save.write("PPPmm.xmp");
1981 #endif
1982 
1983  shiftX = finalX;
1984  shiftY = finalY;
1985 }
#define YSIZE(v)
#define XSIZE(v)
void write(const FileName &fn) const
Matrix1D< double > vectorR2(double x, double y)
Definition: matrix1d.cpp:884
T fastCorrelation(const MultidimArray< T > &x, const MultidimArray< T > &y)
Definition: filters.h:328
void translate(PDB *pdb_original, PDB *pdb_move, unsigned num_atoms, double x0, double y0, double z0)
Definition: lib_pwk.cpp:125
template float bestShift(MultidimArray< float > &, float &, float &, const MultidimArray< int > *, int)
void initZeros(const MultidimArray< T1 > &op)

◆ bestShift() [1/4]

template float bestShift ( MultidimArray< float > &  ,
float &  ,
float &  ,
const MultidimArray< int > *  ,
int   
)

◆ bestShift() [2/4]

template<typename T >
T bestShift ( MultidimArray< T > &  Mcorr,
T &  shiftX,
T &  shiftY,
const MultidimArray< int > *  mask,
int  maxShift 
)

Definition at line 1594 of file filters.cpp.

1596 {
1597  int imax = INT_MIN;
1598  int jmax;
1599  int i_actual;
1600  int j_actual;
1601  double xmax;
1602  double ymax;
1603  double avecorr;
1604  double stdcorr;
1605  double dummy;
1606  bool neighbourhood = true;
1607 
1608  /*
1609  Warning: for masks with a small number of non-zero pixels, this routine is NOT reliable...
1610  Anyway, maybe using a mask is not a good idea at al...
1611  */
1612 
1613  // Adjust statistics within shiftmask to average 0 and stddev 1
1614  if (mask != nullptr)
1615  {
1616  if ((*mask).sum() < 2)
1617  {
1618  shiftX = shiftY = 0.;
1619  return -1;
1620  }
1621  else
1622  {
1623  computeStats_within_binary_mask(*mask, Mcorr, dummy, dummy, avecorr,
1624  stdcorr);
1625  double istdcorr = 1.0 / stdcorr;
1627  if (DIRECT_MULTIDIM_ELEM(*mask, n))
1628  DIRECT_MULTIDIM_ELEM(Mcorr, n) =
1629  (DIRECT_MULTIDIM_ELEM(Mcorr, n) - avecorr)
1630  * istdcorr;
1631  else
1632  DIRECT_MULTIDIM_ELEM(Mcorr, n) = 0.;
1633  }
1634  }
1635  else
1636  Mcorr.statisticsAdjust((T)0, (T)1);
1637 
1638  // Look for maximum shift
1639  if (maxShift==-1)
1640  Mcorr.maxIndex(imax, jmax);
1641  else
1642  {
1643  int maxShift2=maxShift*maxShift;
1644  double bestCorr=std::numeric_limits<T>::lowest();
1645  for (int i=-maxShift; i<=maxShift; i++)
1646  for (int j=-maxShift; j<=maxShift; j++)
1647  {
1648  if (i*i+j*j>maxShift2) // continue if the Euclidean distance is too far
1649  continue;
1650  else if (A2D_ELEM(Mcorr, i, j)>bestCorr)
1651  {
1652  imax=i;
1653  jmax=j;
1654  bestCorr=A2D_ELEM(Mcorr, imax, jmax);
1655  }
1656  }
1657  }
1658  double max = A2D_ELEM(Mcorr, imax, jmax);
1659 
1660  // Estimate n_max around the maximum
1661  int n_max = -1;
1662  while (neighbourhood)
1663  {
1664  n_max++;
1665  for (int i = -n_max; i <= n_max && neighbourhood; i++)
1666  {
1667  i_actual = i + imax;
1668  if (i_actual < STARTINGY(Mcorr) || i_actual > FINISHINGY(Mcorr))
1669  {
1670  neighbourhood = false;
1671  break;
1672  }
1673  for (int j = -n_max; j <= n_max && neighbourhood; j++)
1674  {
1675  j_actual = j + jmax;
1676  if (j_actual < STARTINGX(Mcorr) || j_actual > FINISHINGX(Mcorr))
1677  {
1678  neighbourhood = false;
1679  break;
1680  }
1681  else if (max / 1.414 > A2D_ELEM(Mcorr, i_actual, j_actual))
1682  {
1683  neighbourhood = false;
1684  break;
1685  }
1686  }
1687  }
1688  }
1689 
1690  // We have the neighbourhood => looking for the gravity centre
1691  xmax = ymax = 0.;
1692  double sumcorr = 0.;
1693  if (imax-n_max<STARTINGY(Mcorr))
1694  n_max=std::min(imax-STARTINGY(Mcorr),n_max);
1695  if (imax+n_max>FINISHINGY(Mcorr))
1696  n_max=std::min(FINISHINGY(Mcorr)-imax,n_max);
1697  if (jmax-n_max<STARTINGY(Mcorr))
1698  n_max=std::min(jmax-STARTINGX(Mcorr),n_max);
1699  if (jmax+n_max>FINISHINGY(Mcorr))
1700  n_max=std::min(FINISHINGX(Mcorr)-jmax,n_max);
1701  for (int i = -n_max; i <= n_max; i++)
1702  {
1703  i_actual = i + imax;
1704  for (int j = -n_max; j <= n_max; j++)
1705  {
1706  j_actual = j + jmax;
1707  double val = A2D_ELEM(Mcorr, i_actual, j_actual);
1708  ymax += i_actual * val;
1709  xmax += j_actual * val;
1710  sumcorr += val;
1711  }
1712  }
1713  if (sumcorr != 0)
1714  {
1715  shiftX = xmax / sumcorr;
1716  shiftY = ymax / sumcorr;
1717  }
1718  return max;
1719 }
void min(Image< double > &op1, const Image< double > &op2)
#define A2D_ELEM(v, i, j)
#define FINISHINGX(v)
void maxIndex(int &jmax) const
#define STARTINGX(v)
#define i
void computeStats_within_binary_mask(const MultidimArray< T1 > &mask, const MultidimArray< T > &m, double &min_val, double &max_val, double &avg, double &stddev)
Definition: mask.h:799
#define STARTINGY(v)
void max(Image< double > &op1, const Image< double > &op2)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
double dummy
#define j
#define FINISHINGY(v)
int * n
void statisticsAdjust(U avgF, U stddevF)

◆ bestShift() [3/4]

double bestShift ( const MultidimArray< double > &  I1,
const MultidimArray< std::complex< double > > &  FFTI1,
const MultidimArray< double > &  I2,
double &  shiftX,
double &  shiftY,
CorrelationAux aux,
const MultidimArray< int > *  mask = nullptr,
int  maxShift = -1 
)

Translational search. Assumes that FFTI1 is already computed.

Definition at line 1721 of file filters.cpp.

1725 {
1726  I1.checkDimension(2);
1727  I2.checkDimension(2);
1728 
1729  MultidimArray<double> Mcorr;
1730 
1731  correlation_matrix(FFTI1, I2, Mcorr, aux);
1732  return bestShift(Mcorr, shiftX, shiftY, mask, maxShift);
1733 }
void correlation_matrix(const MultidimArray< double > &m1, const MultidimArray< double > &m2, MultidimArray< double > &R, CorrelationAux &aux, bool center)
Definition: xmipp_fftw.cpp:869
template float bestShift(MultidimArray< float > &, float &, float &, const MultidimArray< int > *, int)

◆ bestShift() [4/4]

double bestShift ( const MultidimArray< std::complex< double > > &  FFTI1,
const MultidimArray< std::complex< double > > &  FFTI2,
MultidimArray< double > &  Mcorr,
double &  shiftX,
double &  shiftY,
CorrelationAux aux,
const MultidimArray< int > *  mask = nullptr,
int  maxShift = -1 
)

Translational search. Assumes that FFTI1 and FFTI2 are already computed. Mcorr must already have the right size.

Definition at line 1744 of file filters.cpp.

1749 {
1750  correlation_matrix(FFTI1, FFTI2, Mcorr, aux);
1751  return bestShift(Mcorr, shiftX, shiftY, mask, maxShift);
1752 }
void correlation_matrix(const MultidimArray< double > &m1, const MultidimArray< double > &m2, MultidimArray< double > &R, CorrelationAux &aux, bool center)
Definition: xmipp_fftw.cpp:869
template float bestShift(MultidimArray< float > &, float &, float &, const MultidimArray< int > *, int)

◆ computeAlignmentTransforms()

void computeAlignmentTransforms ( const MultidimArray< double > &  I,
AlignmentTransforms ITransforms,
AlignmentAux aux,
CorrelationAux aux2 
)

Definition at line 2035 of file filters.cpp.

2037 {
2038  aux2.transformer1.FourierTransform((MultidimArray<double> &)I, ITransforms.FFTI, false);
2039  polarFourierTransform<true>(I, ITransforms.polarFourierI, false, XSIZE(I) / 5, XSIZE(I) / 2, aux.plans, 1);
2040 }
FourierTransformer transformer1
Definition: xmipp_fftw.h:555
MultidimArray< std::complex< double > > FFTI
Definition: filters.h:526
Polar_fftw_plans * plans
Definition: filters.h:514
#define XSIZE(v)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
template void polarFourierTransform< true >(MultidimArray< double > const &, Polar< double > &, Polar< std::complex< double > > &, bool, int, int, Polar_fftw_plans *&, int)
Polar< std::complex< double > > polarFourierI
Definition: filters.h:525

◆ computeEdges()

void computeEdges ( const MultidimArray< double > &  vol,
MultidimArray< double > &  vol_edge 
)

Compute edges with Sobel

Definition at line 3517 of file filters.cpp.

3519 {
3520  MultidimArray<double> BSpline_coefs;
3521  BSpline_coefs.initZeros(vol);
3522  produceSplineCoefficients(3, BSpline_coefs, vol);
3523  vol_edge.initZeros(vol);
3524 
3526  {
3527  double V_dx;
3528  double V_dy;
3529  double V_dz;
3530  V_dx = interpolatedElementBSplineDiffX(BSpline_coefs, j, i, k, 3);
3531  V_dy = interpolatedElementBSplineDiffY(BSpline_coefs, j, i, k, 3);
3532  V_dz = interpolatedElementBSplineDiffZ(BSpline_coefs, j, i, k, 3);
3533  A3D_ELEM(vol_edge,k,i,j) = sqrt(
3534  (V_dx * V_dx) + (V_dy * V_dy) + (V_dz * V_dz));
3535 
3536  }
3537 }
double interpolatedElementBSplineDiffZ(MultidimArray< double > &vol, double x, double y, double z, int SplineDegree)
void sqrt(Image< double > &op)
#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 A3D_ELEM(V, k, i, j)
#define FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
void produceSplineCoefficients(int SplineDegree, MultidimArray< double > &coeffs, const MultidimArray< T > &V1)
#define j
double interpolatedElementBSplineDiffX(MultidimArray< double > &vol, double x, double y, double z, int SplineDegree)
double interpolatedElementBSplineDiffY(MultidimArray< double > &vol, double x, double y, double z, int SplineDegree)
void initZeros(const MultidimArray< T1 > &op)

◆ correlationMasked()

double correlationMasked ( const MultidimArray< double > &  I1,
const MultidimArray< double > &  I2 
)

Masked correlation based on standard deviation values.

Definition at line 1397 of file filters.cpp.

1398 {
1399  double mean1;
1400  double std1;
1401  double th1;
1402  I1.computeAvgStdev(mean1,std1);
1403  th1 = std1;
1404 
1405  // Estimate the mean and stddev within the mask
1406  double N1=0;
1407  double sumMI1=0;
1408  double sumMI2=0;
1410  {
1411  double p1=DIRECT_MULTIDIM_ELEM(I1,n);
1412  double p2=DIRECT_MULTIDIM_ELEM(I2,n);
1413  if(p1>=th1){
1414  sumMI1+=p1;
1415  sumMI2+=p2;
1416  N1+=1.0;
1417  }
1418  }
1419 
1420  double sumMI1I2=0.0;
1421  double sumMI1I1=0.0;
1422  double sumMI2I2=0.0;
1423  double iN1=1;
1424  double avgM1=0;
1425  double avgM2=0;
1426  double corrM1M2;
1427  if (N1>0){
1428  iN1=1.0/N1;
1429  avgM1=sumMI1*iN1;
1430  avgM2=sumMI2*iN1;
1431  }
1432  else
1433  return 0;
1434 
1435  double p1a;
1436  double p2a;
1438  {
1439  double p1=DIRECT_MULTIDIM_ELEM(I1,n);
1440  double p2=DIRECT_MULTIDIM_ELEM(I2,n);
1441  if (p1>th1){
1442  p1a=p1-avgM1;
1443  p2a=p2-avgM2;
1444  sumMI1I1 +=p1a*p1a;
1445  sumMI2I2 +=p2a*p2a;
1446  sumMI1I2+=p1a*p2a;
1447  }
1448  }
1449  corrM1M2=sumMI1I2/sqrt(sumMI1I1*sumMI2I2);
1450 
1451  return corrM1M2;
1452 }
void sqrt(Image< double > &op)
void computeAvgStdev(U &avg, U &stddev) const
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
int * n

◆ correlationWeighted()

double correlationWeighted ( MultidimArray< double > &  I1,
MultidimArray< double > &  I2 
)

Weighted correlation based on differences between images.

Definition at line 1457 of file filters.cpp.

1458 {
1459 
1460  MultidimArray<double> Idiff;
1461  MultidimArray<double> I2Aligned;
1462  Matrix2D<double> M;
1463 
1464  I1.setXmippOrigin();
1465  I2.setXmippOrigin();
1466  I2Aligned=I2;
1467  alignImages(I1, I2Aligned, M, false);
1468  Idiff=I1;
1469  Idiff-=I2Aligned;
1470 
1471  double mean;
1472  double std;
1473  Idiff.computeAvgStdev(mean,std);
1474  Idiff.selfABS();
1475  double threshold=std;
1476 
1477  // Estimate the mean and stddev within the mask
1478  double N=0;
1479  double sumWI1=0;
1480  double sumWI2=0;
1482  {
1483  if (DIRECT_MULTIDIM_ELEM(Idiff,n)>threshold)
1484  {
1485  double p1=DIRECT_MULTIDIM_ELEM(I1,n);
1486  double p2Alg=DIRECT_MULTIDIM_ELEM(I2Aligned,n);
1487  sumWI1+=p1;
1488  sumWI2+=p2Alg;
1489  N+=1.0;
1490  }
1491  }
1492 
1493  double sumWI1I2=0.0;
1494  double sumWI1I1=0.0;
1495  double sumWI2I2=0.0;
1496  double iN;
1497  double avgW1;
1498  double avgW2;
1499  double corrW1W2;
1500  if(N>0){
1501  iN=1.0/N;
1502  avgW1=sumWI1*iN;
1503  avgW2=sumWI2*iN;
1504  }
1505  else
1506  return -1;
1507  double p1a;
1508  double p2a;
1510  {
1511  if (DIRECT_MULTIDIM_ELEM(Idiff,n)>threshold)
1512  {
1513  double p1=DIRECT_MULTIDIM_ELEM(I1,n);
1514  double p2Alg=DIRECT_MULTIDIM_ELEM(I2Aligned,n);
1515  p1a=p1-avgW1;
1516  p2a=p2Alg-avgW2;
1517 
1518  double w=DIRECT_MULTIDIM_ELEM(Idiff,n);
1519  double wp1a=w*p1a;
1520  double wp2a=w*p2a;
1521 
1522  sumWI1I1 +=wp1a*p1a;
1523  sumWI2I2 +=wp2a*p2a;
1524  sumWI1I2 +=wp1a*p2a;
1525  }
1526  }
1527  corrW1W2=sumWI1I2/sqrt(sumWI1I1*sumWI2I2);
1528 
1529  return corrW1W2;
1530 }
double alignImages(const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3)
Definition: filters.cpp:2047
void sqrt(Image< double > &op)
void computeAvgStdev(U &avg, U &stddev) const
doublereal * w
void threshold(double *phi, unsigned long nvox, double limit)
Definition: lib_vwk.cpp:524
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
int * n

◆ covarianceMatrix()

void covarianceMatrix ( const MultidimArray< double > &  I,
Matrix2D< double > &  C 
)

Covariance matrix of an image

Definition at line 1582 of file filters.cpp.

1583 {
1584  Matrix2D<double> mI;
1585  I.copy(mI);
1586  subtractColumnMeans(mI);
1587  matrixOperation_AtA(mI,C);
1588  C*=1.0/(YSIZE(I)-1.0);
1589 }
#define YSIZE(v)
void subtractColumnMeans(Matrix2D< double > &A)
Definition: matrix2d.cpp:230
void matrixOperation_AtA(const Matrix2D< double > &A, Matrix2D< double > &B)
Definition: matrix2d.cpp:436
void copy(Matrix2D< T > &op1) const

◆ fastBestRotation() [1/3]

double fastBestRotation ( const MultidimArray< double > &  IrefCyl,
const MultidimArray< double > &  Icyl,
CorrelationAux aux,
VolumeAlignmentAux aux2,
double  deltaAng 
)

Definition at line 2255 of file filters.cpp.

2258 {
2259  correlation_matrix(IrefCyl, Icyl, aux2.corr, aux, false);
2260  STARTINGZ(aux2.corr) = STARTINGY(aux2.corr) = STARTINGX(aux2.corr) = 0;
2261  double bestCorr = A3D_ELEM(aux2.corr,0,STARTINGY(aux2.corr),0);
2262  double bestAngle = 0;
2263  for (int i = STARTINGY(aux2.corr) + 1; i <= FINISHINGY(aux2.corr); i++)
2264  {
2265  double corr = A3D_ELEM(aux2.corr,0,i,0);
2266  if (corr > bestCorr)
2267  {
2268  bestCorr = corr;
2269  bestAngle = i;
2270  }
2271  }
2272  bestAngle *= deltaAng * 180.0 / PI;
2273  return -bestAngle;
2274 }
void correlation_matrix(const MultidimArray< double > &m1, const MultidimArray< double > &m2, MultidimArray< double > &R, CorrelationAux &aux, bool center)
Definition: xmipp_fftw.cpp:869
#define STARTINGX(v)
#define i
#define STARTINGY(v)
#define A3D_ELEM(V, k, i, j)
MultidimArray< double > corr
Definition: filters.h:572
#define FINISHINGY(v)
#define PI
Definition: tools.h:43
#define STARTINGZ(v)

◆ fastBestRotation() [2/3]

void fastBestRotation ( const MultidimArray< double > &  IrefCylZ,
const MultidimArray< double > &  IrefCylY,
const MultidimArray< double > &  IrefCylX,
const MultidimArray< double > &  I,
const MultidimArray< double > &  Icurrent,
MultidimArray< double > &  Ifinal,
char  axis,
Matrix2D< double > &  R,
CorrelationAux aux,
VolumeAlignmentAux aux2 
)

Definition at line 2318 of file filters.cpp.

2327 {
2328  double bestAngle;
2329  if (axis=='Z')
2330  bestAngle = fastBestRotationAroundZ(IrefCylZ, Icurrent, aux, aux2);
2331  else if (axis=='Y')
2332  bestAngle = fastBestRotationAroundY(IrefCylY, Icurrent, aux, aux2);
2333  else
2334  bestAngle = fastBestRotationAroundX(IrefCylX, Icurrent, aux, aux2);
2335  Matrix2D<double> Raux;
2336  rotation3DMatrix(bestAngle, axis, Raux);
2337  R=Raux*R;
2338  applyGeometry(xmipp_transformation::LINEAR, Ifinal, I, R, xmipp_transformation::IS_NOT_INV, xmipp_transformation::WRAP);
2339 }
double fastBestRotationAroundY(const MultidimArray< double > &IrefCyl, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
Definition: filters.cpp:2290
void applyGeometry(int SplineDegree, MultidimArray< std::complex< double > > &V2, const MultidimArray< std::complex< double > > &V1, const Matrix2D< double > &A, bool inv, bool wrap, std::complex< double > outside, MultidimArray< double > *BcoeffsPtr)
double fastBestRotationAroundZ(const MultidimArray< double > &IrefCyl, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
Definition: filters.cpp:2276
void rotation3DMatrix(double ang, char axis, Matrix2D< double > &result, bool homogeneous)
char axis
double fastBestRotationAroundX(const MultidimArray< double > &IrefCyl, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
Definition: filters.cpp:2304

◆ fastBestRotation() [3/3]

void fastBestRotation ( const MultidimArray< double > &  IrefCylZ,
const MultidimArray< double > &  IrefCylY,
const MultidimArray< double > &  IrefCylX,
MultidimArray< double > &  I,
const String eulerAngles,
Matrix2D< double > &  R,
CorrelationAux aux,
VolumeAlignmentAux aux2 
)

Find a ZYZ rotation that transforms I into Iref. The rotation matrix is returned in R. I is modified to be aligned.

Definition at line 2341 of file filters.cpp.

2348 {
2349  R.initIdentity(4);
2350  fastBestRotation(IrefCylZ,IrefCylY,IrefCylX,I,I,aux2.I1,eulerAngles[0],R, aux,aux2);
2351  fastBestRotation(IrefCylZ,IrefCylY,IrefCylX,I,aux2.I1,aux2.I12,eulerAngles[1],R,aux,aux2);
2352  fastBestRotation(IrefCylZ,IrefCylY,IrefCylX,I,aux2.I12,aux2.I123,eulerAngles[2],R,aux,aux2);
2353  I=aux2.I123;
2354 }
MultidimArray< double > I12
Definition: filters.h:574
MultidimArray< double > I1
Definition: filters.h:573
MultidimArray< double > I123
Definition: filters.h:575
double fastBestRotation(const MultidimArray< double > &IrefCyl, const MultidimArray< double > &Icyl, CorrelationAux &aux, VolumeAlignmentAux &aux2, double deltaAng)
Definition: filters.cpp:2255
void initIdentity()
Definition: matrix2d.h:673

◆ fastBestRotationAroundX()

double fastBestRotationAroundX ( const MultidimArray< double > &  IrefCylX,
const MultidimArray< double > &  I,
CorrelationAux aux,
VolumeAlignmentAux aux2 
)

Fast best rotation around X

Definition at line 2304 of file filters.cpp.

2307 {
2308  double deltaAng = atan(2.0 / XSIZE(I));
2309  Matrix1D<double> v(3);
2310  XX(v) = 1;
2311  YY(v) = 0;
2312  ZZ(v) = 0;
2313  volume_convertCartesianToCylindrical(I, aux2.Icyl, 3, XSIZE(I) / 2, 1, 0,
2314  2 * PI, deltaAng, v);
2315  return fastBestRotation(IrefCyl,aux2.Icyl,aux,aux2,deltaAng);
2316 }
MultidimArray< double > Icyl
Definition: filters.h:571
#define XX(v)
Definition: matrix1d.h:85
#define XSIZE(v)
#define YY(v)
Definition: matrix1d.h:93
#define PI
Definition: tools.h:43
double fastBestRotation(const MultidimArray< double > &IrefCyl, const MultidimArray< double > &Icyl, CorrelationAux &aux, VolumeAlignmentAux &aux2, double deltaAng)
Definition: filters.cpp:2255
#define ZZ(v)
Definition: matrix1d.h:101
void volume_convertCartesianToCylindrical(const MultidimArray< double > &in, MultidimArray< double > &out, double Rmin, double Rmax, double deltaR, float angMin, double angMax, float deltaAng, Matrix1D< double > &axis)
Definition: polar.cpp:305

◆ fastBestRotationAroundY()

double fastBestRotationAroundY ( const MultidimArray< double > &  IrefCylY,
const MultidimArray< double > &  I,
CorrelationAux aux,
VolumeAlignmentAux aux2 
)

Fast best rotation around Y

Definition at line 2290 of file filters.cpp.

2293 {
2294  double deltaAng = atan(2.0 / XSIZE(I));
2295  Matrix1D<double> v(3);
2296  XX(v) = 0;
2297  YY(v) = 1;
2298  ZZ(v) = 0;
2299  volume_convertCartesianToCylindrical(I, aux2.Icyl, 3, XSIZE(I) / 2, 1, 0,
2300  2 * PI, deltaAng, v);
2301  return -fastBestRotation(IrefCyl,aux2.Icyl,aux,aux2,deltaAng);
2302 }
MultidimArray< double > Icyl
Definition: filters.h:571
#define XX(v)
Definition: matrix1d.h:85
#define XSIZE(v)
#define YY(v)
Definition: matrix1d.h:93
#define PI
Definition: tools.h:43
double fastBestRotation(const MultidimArray< double > &IrefCyl, const MultidimArray< double > &Icyl, CorrelationAux &aux, VolumeAlignmentAux &aux2, double deltaAng)
Definition: filters.cpp:2255
#define ZZ(v)
Definition: matrix1d.h:101
void volume_convertCartesianToCylindrical(const MultidimArray< double > &in, MultidimArray< double > &out, double Rmin, double Rmax, double deltaR, float angMin, double angMax, float deltaAng, Matrix1D< double > &axis)
Definition: polar.cpp:305

◆ fastBestRotationAroundZ()

double fastBestRotationAroundZ ( const MultidimArray< double > &  IrefCylZ,
const MultidimArray< double > &  I,
CorrelationAux aux,
VolumeAlignmentAux aux2 
)

Fast best rotation around Z

Definition at line 2276 of file filters.cpp.

2279 {
2280  double deltaAng = atan(2.0 / XSIZE(I));
2281  Matrix1D<double> v(3);
2282  XX(v) = 0;
2283  YY(v) = 0;
2284  ZZ(v) = 1;
2285  volume_convertCartesianToCylindrical(I, aux2.Icyl, 3, XSIZE(I) / 2, 1, 0,
2286  2 * PI, deltaAng, v);
2287  return fastBestRotation(IrefCyl,aux2.Icyl,aux,aux2,deltaAng);
2288 }
MultidimArray< double > Icyl
Definition: filters.h:571
#define XX(v)
Definition: matrix1d.h:85
#define XSIZE(v)
#define YY(v)
Definition: matrix1d.h:93
#define PI
Definition: tools.h:43
double fastBestRotation(const MultidimArray< double > &IrefCyl, const MultidimArray< double > &Icyl, CorrelationAux &aux, VolumeAlignmentAux &aux2, double deltaAng)
Definition: filters.cpp:2255
#define ZZ(v)
Definition: matrix1d.h:101
void volume_convertCartesianToCylindrical(const MultidimArray< double > &in, MultidimArray< double > &out, double Rmin, double Rmax, double deltaR, float angMin, double angMax, float deltaAng, Matrix1D< double > &axis)
Definition: polar.cpp:305

◆ fastCorrentropy()

double fastCorrentropy ( const MultidimArray< double > &  x,
const MultidimArray< double > &  y,
double  sigma,
const GaussianInterpolator G,
const MultidimArray< int > &  mask 
)

Correntropy with mask.

Definition at line 1244 of file filters.cpp.

1247 {
1248  double retvalxy = 0;
1249  double isigma = 1.0 / sigma;
1250  int maskSum = 0;
1252  {
1253  if (DIRECT_MULTIDIM_ELEM(mask,n))
1254  {
1255  retvalxy += G.getValue(
1256  isigma
1257  * (DIRECT_MULTIDIM_ELEM(x,n)
1258  - DIRECT_MULTIDIM_ELEM(y,n)));
1259  ++maskSum;
1260  }
1261  }
1262  if (0 == maskSum) {
1263  REPORT_ERROR(ERR_NUMERICAL, "maskSum is zero (0), which would lead to division by zero");
1264  }
1265  return (retvalxy / maskSum);
1266 }
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
Error related to numerical calculation.
Definition: xmipp_error.h:179
#define DIRECT_MULTIDIM_ELEM(v, n)
double getValue(double x) const
int * n

◆ forceDWTSparsity()

void forceDWTSparsity ( MultidimArray< double > &  V,
double  eps 
)

Force sparsity. Only eps*100 % of the DWT coefficients are kept. It is assumed that the input volume is cubic.

Definition at line 3539 of file filters.cpp.

3540 {
3541  int size0=XSIZE(V);
3542  int sizeF=(int)NEXT_POWER_OF_2(size0);
3543  selfScaleToSize(xmipp_transformation::BSPLINE3,V,sizeF,sizeF,sizeF);
3544  MultidimArray<double> vol_wavelets;
3545  MultidimArray<double> vol_wavelets_abs;
3547  DWT(V,vol_wavelets);
3548  vol_wavelets_abs=vol_wavelets;
3549  vol_wavelets_abs.selfABS();
3550  double *begin=MULTIDIM_ARRAY(vol_wavelets_abs);
3551  double *end=MULTIDIM_ARRAY(vol_wavelets_abs)+MULTIDIM_SIZE(vol_wavelets_abs);
3552  std::sort(begin,end);
3553  double threshold1=DIRECT_MULTIDIM_ELEM(vol_wavelets_abs,
3554  (long int)((1.0-eps)*MULTIDIM_SIZE(vol_wavelets_abs)));
3555  vol_wavelets.threshold("abs_below", threshold1, 0.0);
3556  IDWT(vol_wavelets,V);
3557  selfScaleToSize(xmipp_transformation::BSPLINE3,V,size0, size0, size0);
3558 }
void set_DWT_type(int DWT_type)
Definition: wavelet.cpp:154
void threshold(const String &type, T a, T b=0, MultidimArray< int > *mask=NULL)
#define MULTIDIM_SIZE(v)
#define MULTIDIM_ARRAY(v)
cmache_1 eps
void selfScaleToSize(int SplineDegree, MultidimArrayGeneric &V1, int Xdim, int Ydim, int Zdim)
#define DAUB12
Definition: wavelet.h:39
void DWT(const MultidimArray< T > &v, MultidimArray< double > &result, int isign=1)
Definition: wavelet.h:83
#define XSIZE(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
void sort(struct DCEL_T *dcel)
Definition: sorting.cpp:18
#define NEXT_POWER_OF_2(x)
Definition: xmipp_macros.h:374
void IDWT(const MultidimArray< double > &v, MultidimArray< double > &result)
Definition: wavelet.cpp:159

◆ imedDistance()

double imedDistance ( const MultidimArray< double > &  I1,
const MultidimArray< double > &  I2 
)

IMED distance. See Wang, L et al. On the Euclidean distance of images. IEEE PAMI 27: 1334-1339 (2005)

Definition at line 1269 of file filters.cpp.

1270 {
1271  // [x,y]=meshgrid([-3:1:3],[-3:1:3])
1272  // format long // w=1/sqrt(2*pi)*exp(-0.5*(x.*x+y.*y))
1273  double *refW;
1274  double w[49]={
1275  0.000049233388666, 0.000599785460091, 0.002688051941039, 0.004431848411938, 0.002688051941039, 0.000599785460091, 0.000049233388666,
1276  0.000599785460091, 0.007306882745281, 0.032747176537767, 0.053990966513188, 0.032747176537767, 0.007306882745281, 0.000599785460091,
1277  0.002688051941039, 0.032747176537767, 0.146762663173740, 0.241970724519143, 0.146762663173740, 0.032747176537767, 0.002688051941039,
1278  0.004431848411938, 0.053990966513188, 0.241970724519143, 0.398942280401433, 0.241970724519143, 0.053990966513188, 0.004431848411938,
1279  0.002688051941039, 0.032747176537767, 0.146762663173740, 0.241970724519143, 0.146762663173740, 0.032747176537767, 0.002688051941039,
1280  0.000599785460091, 0.007306882745281, 0.032747176537767, 0.053990966513188, 0.032747176537767, 0.007306882745281, 0.000599785460091,
1281  0.000049233388666, 0.000599785460091, 0.002688051941039, 0.004431848411938, 0.002688051941039, 0.000599785460091, 0.000049233388666};
1282 
1283  MultidimArray<double> diffImage = I1 - I2;
1284  double imed = 0;
1285  int imiddle=YSIZE(I1)/2;
1286  int jmiddle=XSIZE(I1)/2;
1287  int R2max=imiddle*imiddle;
1288  int ysize=(int)YSIZE(I1);
1289  int xsize=(int)XSIZE(I1);
1290  for (int i=3; i<ysize-3; ++i)
1291  {
1292  int i2=(i-imiddle)*(i-imiddle);
1293  for (int j=3; j<xsize-3; ++j)
1294  {
1295  int j2=(j-jmiddle)*(j-jmiddle);
1296  if (i2+j2>R2max) // Measure only within the maximum circle
1297  continue;
1298  double diffi=DIRECT_A2D_ELEM(diffImage,i,j);
1299  int index=0;
1300  for (int ii=-3; ii<=3; ++ii)
1301  {
1302  refW = &w[index];
1303  index = index + 7;
1304  double *diffj=&DIRECT_A2D_ELEM(diffImage,i+ii,j-3);
1305  double imedAux=(*refW++)*(*diffj++);
1306  imedAux+=(*refW++)*(*diffj++);
1307  imedAux+=(*refW++)*(*diffj++);
1308  imedAux+=(*refW++)*(*diffj++);
1309  imedAux+=(*refW++)*(*diffj++);
1310  imedAux+=(*refW++)*(*diffj++);
1311  imedAux+=(*refW++)*(*diffj++);
1312 
1313  imed+=imedAux*diffi;
1314  }
1315  }
1316  }
1317  return sqrt(imed);
1318 }
#define YSIZE(v)
void sqrt(Image< double > &op)
#define DIRECT_A2D_ELEM(v, i, j)
doublereal * w
#define i
viol index
#define XSIZE(v)
#define j

◆ imedNormalizedDistance()

double imedNormalizedDistance ( const MultidimArray< double > &  I1,
const MultidimArray< double > &  I2 
)

IMED normalized distance.

Definition at line 1321 of file filters.cpp.

1322 {
1323  // [x,y]=meshgrid([-3:1:3],[-3:1:3])
1324  // format long
1325  // w=1/sqrt(2*pi)*exp(-0.5*(x.*x+y.*y))
1326  const double w[7][7]={
1327  {0.000049233388666, 0.000599785460091, 0.002688051941039, 0.004431848411938, 0.002688051941039, 0.000599785460091, 0.000049233388666},
1328  {0.000599785460091, 0.007306882745281, 0.032747176537767, 0.053990966513188, 0.032747176537767, 0.007306882745281, 0.000599785460091},
1329  {0.002688051941039, 0.032747176537767, 0.146762663173740, 0.241970724519143, 0.146762663173740, 0.032747176537767, 0.002688051941039},
1330  {0.004431848411938, 0.053990966513188, 0.241970724519143, 0.398942280401433, 0.241970724519143, 0.053990966513188, 0.004431848411938},
1331  {0.002688051941039, 0.032747176537767, 0.146762663173740, 0.241970724519143, 0.146762663173740, 0.032747176537767, 0.002688051941039},
1332  {0.000599785460091, 0.007306882745281, 0.032747176537767, 0.053990966513188, 0.032747176537767, 0.007306882745281, 0.000599785460091},
1333  {0.000049233388666, 0.000599785460091, 0.002688051941039, 0.004431848411938, 0.002688051941039, 0.000599785460091, 0.000049233388666}
1334  };
1335  int imiddle=YSIZE(I1)/2;
1336  int jmiddle=XSIZE(I1)/2;
1337  int R2max=imiddle*imiddle;
1338  // Measure the average of both images
1339  double avg1=0;
1340  double avg2=0;
1341  double N=0;
1342  int ydim=YSIZE(I1);
1343  int xdim=XSIZE(I1);
1344  for (int i=3; i<ydim-3; ++i)
1345  {
1346  int i2=(i-imiddle)*(i-imiddle);
1347  for (int j=3; j<xdim-3; ++j)
1348  {
1349  int j2=(j-jmiddle)*(j-jmiddle);
1350  if (i2+j2>R2max) // Measure only within the maximum circle
1351  continue;
1352  avg1+=DIRECT_A2D_ELEM(I1,i,j);
1353  avg2+=DIRECT_A2D_ELEM(I2,i,j);
1354  ++N;
1355  }
1356  }
1357  avg1/=N;
1358  avg2/=N;
1359  double diffAvg=avg1-avg2;
1360 
1361  double imed = 0;
1362  double imed1=0;
1363  double imed2=0;
1364  for (int i=3; i<ydim-3; ++i)
1365  {
1366  int i2=(i-imiddle)*(i-imiddle);
1367  for (int j=3; j<xdim-3; ++j)
1368  {
1369  int j2=(j-jmiddle)*(j-jmiddle);
1370  if (i2+j2>R2max) // Measure only within the maximum circle
1371  continue;
1372  double subtractedI1ij=DIRECT_A2D_ELEM(I1,i,j)-avg1;
1373  double subtractedI2ij=DIRECT_A2D_ELEM(I2,i,j)-avg2;
1374  double diffi=DIRECT_A2D_ELEM(I1,i,j)-DIRECT_A2D_ELEM(I2,i,j)-diffAvg;
1375  for (int ii=-3; ii<=3; ++ii)
1376  {
1377  int i_ii=i+ii;
1378  for (int jj=-3; jj<=3; ++jj)
1379  {
1380  int j_jj=j+jj;
1381  //double diffj=DIRECT_A2D_ELEM(I1,i_ii,j_jj)-DIRECT_A2D_ELEM(I2,i_ii,j_jj)-diffAvg;
1382  double diffj=DIRECT_A2D_ELEM(I1,i,j)-DIRECT_A2D_ELEM(I2,i_ii,j_jj)-diffAvg;
1383  double wiijj=w[ii+3][jj+3];
1384  imed+=wiijj*diffi*diffj;
1385  imed1+=wiijj*subtractedI1ij*(DIRECT_A2D_ELEM(I1,i_ii,j_jj)-avg1);
1386  imed2+=wiijj*subtractedI2ij*(DIRECT_A2D_ELEM(I2,i_ii,j_jj)-avg2);
1387  }
1388  }
1389  }
1390  }
1391  return imed/sqrt((imed1+imed2)/2);
1392 }
#define YSIZE(v)
void sqrt(Image< double > &op)
#define DIRECT_A2D_ELEM(v, i, j)
doublereal * w
#define i
#define XSIZE(v)
#define j

◆ matlab_filter()

void matlab_filter ( Matrix1D< double > &  B,
Matrix1D< double > &  A,
const MultidimArray< double > &  X,
MultidimArray< double > &  Y,
MultidimArray< double > &  Z 
)

Definition at line 4256 of file filters.cpp.

4258 {
4259  if (VEC_ELEM(A,0)!=1.0)
4260  {
4261  A/=VEC_ELEM(A,0);
4262  B/=VEC_ELEM(B,0);
4263  }
4264 
4265  size_t input_size = XSIZE(X);
4266  size_t filter_order = std::max(VEC_XSIZE(A),VEC_XSIZE(B));
4267  if (VEC_XSIZE(B)!=filter_order)
4268  B.resize(filter_order);
4269  if (VEC_XSIZE(A)!=filter_order)
4270  A.resize(filter_order);
4271  Y.resize(input_size);
4272  Z.initZeros(filter_order);
4273 
4274  for (size_t i = 0; i < input_size; ++i)
4275  {
4276  size_t order = filter_order - 1;
4277  while (order)
4278  {
4279  if (i >= order)
4280  {
4281  DIRECT_A1D_ELEM(Z,order - 1) = VEC_ELEM(B,order) * DIRECT_A1D_ELEM(X,i - order) -
4282  VEC_ELEM(A,order) * DIRECT_A1D_ELEM(Y,i - order) + DIRECT_A1D_ELEM(Z,order);
4283  }
4284  --order;
4285  }
4287  }
4288 }
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
#define VEC_XSIZE(m)
Definition: matrix1d.h:77
#define i
#define DIRECT_A1D_ELEM(v, i)
void resize(size_t Xdim, bool copy=true)
Definition: matrix1d.h:410
#define XSIZE(v)
void max(Image< double > &op1, const Image< double > &op2)
int order
Derivation order and Bessel function order.
Definition: blobs.h:118
void initZeros(const MultidimArray< T1 > &op)

◆ regionGrowing3D()

void regionGrowing3D ( const MultidimArray< double > &  V_in,
MultidimArray< double > &  V_out,
int  k,
int  i,
int  j,
float  stop_colour = 1,
float  filling_colour = 1,
bool  less = true 
)

Region growing for volumes

Given a position inside a volume this function grows a region with (filling_colour) until it finds a border of value (stop_colour). If the point is outside the volume then nothing is done.

If less is true the region is grown in sucha a way that all voxels in its border are greater than the region voxels. If less is false the region is grown so that all voxels on its border are smaller than the region voxels.

Definition at line 412 of file filters.cpp.

415 {
416  V_in.checkDimension(3);
417 
418  std::list<Coordinate3D> iNeighbours; /* A list for neighbour voxels */
419  int iCurrentk;
420  int iCurrenti;
421  int iCurrentj; /* Coordinates of the current voxel considered */
422 
423  /* First task is copying the input volume into the output one */
424  V_out = V_in;
425 
426  /**** Then the region growing is done in output volume ****/
427  /* Insert at the beginning of the list the seed coordinates */
428  Coordinate3D coord;
429  coord.ii = i;
430  coord.jj = j;
431  coord.kk = k;
432  iNeighbours.push_front(coord);
433 
434  /* Fill the seed coordinates */
435  A3D_ELEM(V_out, k, i, j) = filling_colour;
436 
437  while (!iNeighbours.empty())
438  {
439  /* Take the current pixel to explore */
440  coord = iNeighbours.front();
441  iNeighbours.pop_front();
442  iCurrenti = coord.ii;
443  iCurrentj = coord.jj;
444  iCurrentk = coord.kk;
445 
446  /* a macro for doing exploration of a voxel. If the voxel has a value
447  lower than stop_colour, its filled with filling colour and added to the
448  list for exploring its neighbours */
449 #define CHECK_POINT_3D(k,i,j) \
450  {\
451  int I=i; \
452  int J=j; \
453  int K=k; \
454  if (INSIDEXYZ(V_out,J,I,K)) { \
455  double voxel=A3D_ELEM(V_out,K,I,J); \
456  if (voxel!=filling_colour) \
457  if ((less && voxel < stop_colour)|| \
458  (!less &&voxel > stop_colour)) { \
459  coord.ii=I; \
460  coord.jj=J; \
461  coord.kk=K; \
462  A3D_ELEM (V_out,coord.kk,coord.ii,coord.jj)=filling_colour; \
463  iNeighbours.push_front(coord); \
464  } \
465  }\
466  }
467 
468  /* Make the exploration of the pixel neighbours */
469  CHECK_POINT_3D(iCurrentk, iCurrenti, iCurrentj - 1);
470  CHECK_POINT_3D(iCurrentk, iCurrenti, iCurrentj + 1);
471  CHECK_POINT_3D(iCurrentk, iCurrenti - 1, iCurrentj);
472  CHECK_POINT_3D(iCurrentk, iCurrenti - 1, iCurrentj - 1);
473  CHECK_POINT_3D(iCurrentk, iCurrenti - 1, iCurrentj + 1);
474  CHECK_POINT_3D(iCurrentk, iCurrenti + 1, iCurrentj);
475  CHECK_POINT_3D(iCurrentk, iCurrenti + 1, iCurrentj - 1);
476  CHECK_POINT_3D(iCurrentk, iCurrenti + 1, iCurrentj + 1);
477  CHECK_POINT_3D(iCurrentk - 1, iCurrenti, iCurrentj);
478  CHECK_POINT_3D(iCurrentk - 1, iCurrenti, iCurrentj - 1);
479  CHECK_POINT_3D(iCurrentk - 1, iCurrenti, iCurrentj + 1);
480  CHECK_POINT_3D(iCurrentk - 1, iCurrenti - 1, iCurrentj);
481  CHECK_POINT_3D(iCurrentk - 1, iCurrenti - 1, iCurrentj - 1);
482  CHECK_POINT_3D(iCurrentk - 1, iCurrenti - 1, iCurrentj + 1);
483  CHECK_POINT_3D(iCurrentk - 1, iCurrenti + 1, iCurrentj);
484  CHECK_POINT_3D(iCurrentk - 1, iCurrenti + 1, iCurrentj - 1);
485  CHECK_POINT_3D(iCurrentk - 1, iCurrenti + 1, iCurrentj + 1);
486  CHECK_POINT_3D(iCurrentk + 1, iCurrenti, iCurrentj);
487  CHECK_POINT_3D(iCurrentk + 1, iCurrenti, iCurrentj - 1);
488  CHECK_POINT_3D(iCurrentk + 1, iCurrenti, iCurrentj + 1);
489  CHECK_POINT_3D(iCurrentk + 1, iCurrenti - 1, iCurrentj + 1);
490  CHECK_POINT_3D(iCurrentk + 1, iCurrenti - 1, iCurrentj - 1);
491  CHECK_POINT_3D(iCurrentk + 1, iCurrenti - 1, iCurrentj + 1);
492  CHECK_POINT_3D(iCurrentk + 1, iCurrenti + 1, iCurrentj + 1);
493  CHECK_POINT_3D(iCurrentk + 1, iCurrenti + 1, iCurrentj - 1);
494  CHECK_POINT_3D(iCurrentk + 1, iCurrenti + 1, iCurrentj + 1);
495  }
496 }
#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 CHECK_POINT_3D(k, i, j)
#define A3D_ELEM(V, k, i, j)
#define j

◆ regionGrowing3DEqualValue()

void regionGrowing3DEqualValue ( const MultidimArray< double > &  V_in,
MultidimArray< int > &  V_out,
int  filling_value 
)

Region growing with equal values for volumes

Given a position inside a volume this function grows a region with (filling_value) until it finds a border. If the point is outside the volume then nothing is done.

The growing only considers those voxels with value equal to the selected voxel

Definition at line 499 of file filters.cpp.

500 {
501  V_in.checkDimension(3);
502 
503  std::list<Coordinate3D> iNeighbours; /* A list for neighbour voxels */
504  int iCurrentk;
505  int iCurrenti;
506  int iCurrentj; /* Coordinates of the current voxel considered */
507 
508  /* First task is copying the input volume into the output one */
509  V_out.resizeNoCopy(V_in);
510  V_out.initConstant(1);
511 
512  /**** Then the region growing is done in output volume ****/
513  /* Insert at the beginning of the list the seed coordinates */
514  Coordinate3D coord;
515  coord.ii = STARTINGY(V_in);
516  coord.jj = STARTINGX(V_in);
517  coord.kk = STARTINGZ(V_in);
518  iNeighbours.push_front(coord);
519 
520  /* Fill the seed coordinates */
521  double bgColor = A3D_ELEM(V_in, STARTINGZ(V_in), STARTINGY(V_in), STARTINGX(V_in));
522  A3D_ELEM(V_out, STARTINGZ(V_out), STARTINGY(V_out), STARTINGX(V_out)) = 0;
523 
524  while (!iNeighbours.empty())
525  {
526  /* Take the current pixel to explore */
527  coord = iNeighbours.front();
528  iNeighbours.pop_front();
529  iCurrenti = coord.ii;
530  iCurrentj = coord.jj;
531  iCurrentk = coord.kk;
532 
533  /* a macro for doing exploration of a voxel. If the voxel has a value
534  lower than stop_colour, its filled with filling colour and added to the
535  list for exploring its neighbours */
536 #undef CHECK_POINT_3D
537 #define CHECK_POINT_3D(k,i,j) \
538  {\
539  int I=i; \
540  int J=j; \
541  int K=k; \
542  if (INSIDEXYZ(V_out,J,I,K)) { \
543  if (A3D_ELEM(V_in,K,I,J)==bgColor && A3D_ELEM(V_out,K,I,J)==1) { \
544  coord.ii=I; \
545  coord.jj=J; \
546  coord.kk=K; \
547  A3D_ELEM (V_out,coord.kk,coord.ii,coord.jj)=filling_value; \
548  iNeighbours.push_front(coord); \
549  } \
550  }\
551  }\
552 
553  /* Make the exploration of the pixel neighbours */
554  CHECK_POINT_3D(iCurrentk, iCurrenti, iCurrentj - 1);
555  CHECK_POINT_3D(iCurrentk, iCurrenti, iCurrentj + 1);
556  CHECK_POINT_3D(iCurrentk, iCurrenti - 1, iCurrentj);
557  CHECK_POINT_3D(iCurrentk, iCurrenti - 1, iCurrentj - 1);
558  CHECK_POINT_3D(iCurrentk, iCurrenti - 1, iCurrentj + 1);
559  CHECK_POINT_3D(iCurrentk, iCurrenti + 1, iCurrentj);
560  CHECK_POINT_3D(iCurrentk, iCurrenti + 1, iCurrentj - 1);
561  CHECK_POINT_3D(iCurrentk, iCurrenti + 1, iCurrentj + 1);
562  CHECK_POINT_3D(iCurrentk - 1, iCurrenti, iCurrentj);
563  CHECK_POINT_3D(iCurrentk - 1, iCurrenti, iCurrentj - 1);
564  CHECK_POINT_3D(iCurrentk - 1, iCurrenti, iCurrentj + 1);
565  CHECK_POINT_3D(iCurrentk - 1, iCurrenti - 1, iCurrentj);
566  CHECK_POINT_3D(iCurrentk - 1, iCurrenti - 1, iCurrentj - 1);
567  CHECK_POINT_3D(iCurrentk - 1, iCurrenti - 1, iCurrentj + 1);
568  CHECK_POINT_3D(iCurrentk - 1, iCurrenti + 1, iCurrentj);
569  CHECK_POINT_3D(iCurrentk - 1, iCurrenti + 1, iCurrentj - 1);
570  CHECK_POINT_3D(iCurrentk - 1, iCurrenti + 1, iCurrentj + 1);
571  CHECK_POINT_3D(iCurrentk + 1, iCurrenti, iCurrentj);
572  CHECK_POINT_3D(iCurrentk + 1, iCurrenti, iCurrentj - 1);
573  CHECK_POINT_3D(iCurrentk + 1, iCurrenti, iCurrentj + 1);
574  CHECK_POINT_3D(iCurrentk + 1, iCurrenti - 1, iCurrentj + 1);
575  CHECK_POINT_3D(iCurrentk + 1, iCurrenti - 1, iCurrentj - 1);
576  CHECK_POINT_3D(iCurrentk + 1, iCurrenti - 1, iCurrentj + 1);
577  CHECK_POINT_3D(iCurrentk + 1, iCurrenti + 1, iCurrentj + 1);
578  CHECK_POINT_3D(iCurrentk + 1, iCurrenti + 1, iCurrentj - 1);
579  CHECK_POINT_3D(iCurrentk + 1, iCurrenti + 1, iCurrentj + 1);
580  }
581 }
void resizeNoCopy(const MultidimArray< T1 > &v)
void initConstant(T val)
#define STARTINGX(v)
#define CHECK_POINT_3D(k, i, j)
#define STARTINGY(v)
#define A3D_ELEM(V, k, i, j)
#define STARTINGZ(v)

◆ Shah_energy()

double Shah_energy ( const MultidimArray< double > &  img,
const MultidimArray< double > &  surface_strength,
const MultidimArray< double > &  edge_strength,
double  K,
const Matrix1D< double > &  W 
)

Definition at line 2511 of file filters.cpp.

2515 {
2516  img.checkDimension(2);
2517 
2518  int Ydim1 = YSIZE(img) - 1;
2519  int Xdim1 = XSIZE(img) - 1;
2520 
2521  double Kinv = 1.0 / K;
2522 
2523  /* Calculate surface energy */
2524  double E1 = 0.0;
2525  double E2 = 0.0;
2526  double E3 = 0.0;
2527  double E4 = 0.0;
2528  double w0 = VEC_ELEM(W,0);
2529  double w1 = VEC_ELEM(W,1);
2530  double w2 = VEC_ELEM(W,2);
2531  double w3 = VEC_ELEM(W,3);
2532  for (int i = 1; i < Ydim1; i++)
2533  {
2534  int ip1 = i + 1;
2535  int im1 = i - 1;
2536  for (int j = 1; j < Xdim1; j++)
2537  {
2538  int jp1 = j + 1;
2539  int jm1 = j - 1;
2540  /* Calculate data matching terms */
2541  double D = dAij(img, i, j);
2542  double F = dAij(surface_strength, i, j);
2543  double S = dAij(edge_strength, i, j);
2544  double diff = D - F;
2545  E1 += w0 * diff * diff;
2546  E3 += w2 * K * S * S;
2547 
2548  /* Calculate first derivative terms */
2549  double Fx = 0.5
2550  * (dAij(surface_strength, i, jp1)
2551  - dAij(surface_strength, i, jm1));
2552  double Fy = 0.5
2553  * (dAij(surface_strength, ip1, j)
2554  - dAij(surface_strength, im1, j));
2555  double Sx =
2556  0.5
2557  * (dAij(edge_strength, i, jp1)
2558  - dAij(edge_strength, i, jm1));
2559  double Sy =
2560  0.5
2561  * (dAij(edge_strength, ip1, j)
2562  - dAij(edge_strength, im1, j));
2563  double S_1 = 1 - S;
2564  E2 += w1 * S_1 * S_1 * (Fx * Fx + Fy * Fy);
2565  E4 += w3 * Kinv * (Sx * Sx + Sy * Sy);
2566  }
2567  }
2568 
2569  return E1 + E2 + E3 + E4; // Total energy
2570 }
#define YSIZE(v)
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
#define dAij(M, i, j)
#define i
#define XSIZE(v)
#define j
constexpr int K

◆ svdCorrelation()

double svdCorrelation ( const MultidimArray< double > &  I1,
const MultidimArray< double > &  I2,
const MultidimArray< int > *  mask = nullptr 
)

SVD correlation.

Definition at line 1535 of file filters.cpp.

1536 {
1537  // Copy input images into matrix2Ds
1538  Matrix2D<double> mI1;
1539  Matrix2D<double> mI2;
1540  I1.copy(mI1);
1541  I2.copy(mI2);
1542 
1543  // SVD Decomposition of I1
1544  Matrix2D<double> U1;
1545  Matrix2D<double> V1;
1546  Matrix1D<double> W1;
1547  svdcmp(mI1,U1,W1,V1);
1548 
1549  // Express I2 in the basis of I1
1550  Matrix2D<double> aux;
1551  Matrix2D<double> W2;
1552  matrixOperation_AB(mI2,V1,aux);
1553  matrixOperation_AtB(U1,aux,W2);
1554 
1555  // Make W2 to be diagonal
1557  if (i!=j)
1558  MAT_ELEM(W2,i,j)=0.0;
1559 
1560  // Recover I2p
1561  matrixOperation_ABt(W2,V1,aux);
1562  matrixOperation_AB(U1,aux,mI2);
1563 
1564  // Measure correlation
1566  I2p=mI2;
1567 // Image<double> save;
1568 // save()=I1;
1569 // save.write("PPPI1.xmp");
1570 // save()=I2;
1571 // save.write("PPPI2.xmp");
1572 // save()=I2p;
1573 // save.write("PPPI2p.xmp");
1574 // std::cout << "Correlation= " << correlationIndex(I1,I2p,mask) << std::endl;
1575 // std::cout << "Press any key\n";
1576 // char c; std::cin >> c;
1577  // double ratio=I2p.computeStddev()/I2.computeStddev();
1578  return correlationIndex(I1,I2p,mask); //*ratio;
1579 }
#define FOR_ALL_ELEMENTS_IN_MATRIX2D(m)
Definition: matrix2d.h:104
void matrixOperation_AB(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix2D< double > &C)
Definition: matrix2d.cpp:411
double correlationIndex(const MultidimArray< T > &x, const MultidimArray< T > &y, const MultidimArray< int > *mask=NULL, MultidimArray< double > *Contributions=NULL)
#define i
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
void matrixOperation_AtB(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix2D< double > &C)
Definition: matrix2d.cpp:475
void matrixOperation_ABt(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix2D< double > &C)
Definition: matrix2d.cpp:462
void svdcmp(const Matrix2D< T > &a, Matrix2D< double > &u, Matrix1D< double > &w, Matrix2D< double > &v)
Definition: matrix2d.cpp:125
#define j
void copy(Matrix2D< T > &op1) const

◆ unnormalizedGaussian2D()

double unnormalizedGaussian2D ( const Matrix1D< double > &  r,
const Matrix1D< double > &  mu,
const Matrix2D< double > &  sigmainv 
)

Unnormalized 2D gaussian value using covariance

This function returns the value of a multivariate (2D) gaussian function at the point r (column vector of dimension 2).

G(r,mu,sigma)=exp(-0.5 * (r-mu)^t sigma^-1 (r-mu))

Definition at line 2379 of file filters.cpp.

2381 {
2382  double x = XX(r) - XX(mu);
2383  double y = YY(r) - YY(mu);
2384  return exp(
2385  -0.5
2386  * (sigmainv(0, 0) * x * x + 2 * sigmainv(0, 1) * x * y
2387  + sigmainv(1, 1) * y * y));
2388 }
static double * y
doublereal * x
#define XX(v)
Definition: matrix1d.h:85
#define YY(v)
Definition: matrix1d.h:93

◆ Update_edge_Shah()

double Update_edge_Shah ( MultidimArray< double > &  img,
MultidimArray< double > &  surface_strength,
MultidimArray< double > &  edge_strength,
double  K,
const Matrix1D< double > &  W 
)

Definition at line 2657 of file filters.cpp.

2661 {
2662  img.checkDimension(2);
2663 
2664  double Diff = 0.0;
2665  double Norm = 0.0;
2666  size_t Ydim1 = YSIZE(img) - 1;
2667  size_t Xdim1 = XSIZE(img) - 1;
2668  double Kinv = 1.0 / K;
2669 
2670  /* Update edge estimate */
2671  double w1 = VEC_ELEM(W,1);
2672  double w2 = VEC_ELEM(W,2);
2673  double w3 = VEC_ELEM(W,3);
2674  for (size_t i = 1; i < Ydim1; i++)
2675  {
2676  int ip1 = i + 1;
2677  int im1 = i - 1;
2678  for (size_t j = 1; j < Xdim1; j++)
2679  {
2680  int jp1 = j + 1;
2681  int jm1 = j - 1;
2682 
2683  /* Calculate first and second derivative terms */
2684  double Fx = 0.5
2685  * (dAij(surface_strength, i, jp1)
2686  - dAij(surface_strength, i, jm1));
2687  double Fy = 0.5
2688  * (dAij(surface_strength, ip1, j)
2689  - dAij(surface_strength, im1, j));
2690  double Constant = w1 * (Fx * Fx + Fy * Fy);
2691 
2692  /* Calculate weights for central pixel and neighbors */
2693  double Central = w2 * K + w3 * Kinv * 4;
2694  double Neighbors = w3 * Kinv
2695  * (dAij(edge_strength, im1, j) + dAij(edge_strength, ip1, j)
2696  + dAij(edge_strength, i, jm1)
2697  + dAij(edge_strength, i, jp1));
2698 
2699  /* Calculate new S value */
2700  double Old_edge_strength = dAij(edge_strength, i, j);
2701  double S = (Constant + Neighbors) / (Constant + Central);
2702  if (S < 0)
2703  dAij(edge_strength, i, j) *= 0.5;
2704  else if (S > 1)
2705  dAij(edge_strength, i, j) = 0.5
2706  * (dAij(edge_strength, i, j) + 1);
2707  else
2708  dAij(edge_strength, i, j) = S;
2709 
2710  // Compute the difference.
2711  Diff += fabs(dAij(edge_strength, i, j) - Old_edge_strength);
2712  Norm += fabs(Old_edge_strength);
2713  }
2714  }
2715  return Diff / Norm; // Return the relative difference.
2716 }
#define YSIZE(v)
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
#define dAij(M, i, j)
#define i
#define XSIZE(v)
#define j
constexpr int K

◆ Update_surface_Shah()

double Update_surface_Shah ( MultidimArray< double > &  img,
MultidimArray< double > &  surface_strength,
MultidimArray< double > &  edge_strength,
const Matrix1D< double > &  W 
)

Definition at line 2577 of file filters.cpp.

2580 {
2581  img.checkDimension(2);
2582 
2583  double Diff = 0.0;
2584  double Norm = 0.0;
2585  size_t Ydim1 = YSIZE(img) - 1;
2586  size_t Xdim1 = XSIZE(img) - 1;
2587 
2588  /* Update surface estimate */
2589  double w0 = VEC_ELEM(W,0);
2590  double w1 = VEC_ELEM(W,1);
2591  for (size_t i = 1; i < Ydim1; i++)
2592  {
2593  int ip1 = i + 1;
2594  int im1 = i - 1;
2595  for (size_t j = 1; j < Xdim1; j++)
2596  {
2597  int jp1 = j + 1;
2598  int jm1 = j - 1;
2599  /* Calculate edge partial derivative terms */
2600  double S = dAij(edge_strength, i, j);
2601  double Sx =
2602  0.5
2603  * (dAij(edge_strength, i, jp1)
2604  - dAij(edge_strength, i, jm1));
2605  double Sy =
2606  0.5
2607  * (dAij(edge_strength, ip1, j)
2608  - dAij(edge_strength, im1, j));
2609 
2610  double nS = 1 - S;
2611  double nS2 = nS * nS;
2612 
2613  /* Calculate surface partial derivative terms (excluding central pixel) */
2614  double F;
2615  double D;
2616  F = D = dAij(img, i, j);
2617  double SS_i_jp1 = dAij(surface_strength, i, jp1);
2618  double SS_i_jm1 = dAij(surface_strength, i, jm1);
2619  double SS_ip1_j = dAij(surface_strength, ip1, j);
2620  double SS_im1_j = dAij(surface_strength, im1, j);
2621  double Fx = 0.5 * (SS_i_jp1 - SS_i_jm1);
2622  double Fy = 0.5 * (SS_ip1_j - SS_im1_j);
2623  double Fxx = SS_i_jp1 + SS_i_jm1;
2624  double Fyy = SS_ip1_j + SS_im1_j;
2625 
2626  /* Calculate surface partial derivative weights */
2627  double wFx = 4 * w1 * nS * Sx;
2628  double wFy = 4 * w1 * nS * Sy;
2629  double wFxx = -2 * w1 * nS2;
2630  double wFyy = -2 * w1 * nS2;
2631 
2632  /* Calculate new surface value */
2633  double Constant = -2 * w0 * D;
2634  double Central = -2 * w0 + 2 * wFxx + 2 * wFyy;
2635  double Neighbors = wFx * Fx + wFy * Fy + wFxx * Fxx + wFyy * Fyy;
2636 
2637  if (fabs(Central) > XMIPP_EQUAL_ACCURACY)
2638  F = (Constant + Neighbors) / Central;
2639  F = CLIP(F, 0, 1);
2640 
2641  // Compute the difference.
2642  double SS_i_j = dAij(surface_strength, i, j);
2643  Diff += fabs(SS_i_j - F);
2644  Norm += fabs(SS_i_j);
2645 
2646  // Update the new value.
2647  dAij(surface_strength, i, j) = F;
2648  }
2649  }
2650  return Diff / Norm; // Return the relative difference.
2651 }
#define YSIZE(v)
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
#define dAij(M, i, j)
#define i
#define CLIP(x, x0, xF)
Definition: xmipp_macros.h:260
#define XMIPP_EQUAL_ACCURACY
Definition: xmipp_macros.h:119
#define XSIZE(v)
#define j

Variable Documentation

◆ INITIAL_ROTATE_THRESHOLD

constexpr float INITIAL_ROTATE_THRESHOLD = ROTATE_THRESHOLD + 1.0

Definition at line 2045 of file filters.cpp.

◆ INITIAL_SHIFT_THRESHOLD

constexpr double INITIAL_SHIFT_THRESHOLD = SHIFT_THRESHOLD + 1.0

Definition at line 2044 of file filters.cpp.

◆ ROTATE_THRESHOLD

constexpr float ROTATE_THRESHOLD = 1.0

Definition at line 2043 of file filters.cpp.

◆ SHAH_CONVERGENCE_THRESHOLD

constexpr double SHAH_CONVERGENCE_THRESHOLD = 0.0001

Definition at line 2719 of file filters.cpp.

◆ SHIFT_THRESHOLD

constexpr double SHIFT_THRESHOLD = 0.95

Definition at line 2042 of file filters.cpp.