Xmipp  v3.23.11-Nereus
filters.h
Go to the documentation of this file.
1 /***************************************************************************
2 *
3 * Authors: Carlos Oscar S. Sorzano (coss@cnb.csic.es)
4 *
5 * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20 * 02111-1307 USA
21 *
22 * All comments concerning this program package may be sent to the
23 * e-mail address 'xmipp@cnb.csic.es'
24 ***************************************************************************/
25 
26 #include "core/xmipp_image.h"
27 #include "core/matrix2d.h"
28 #include "data/numerical_tools.h"
29 #include "data/polar.h"
30 
31 #ifndef CORE_FILTERS_H
32 #define CORE_FILTERS_H
33 constexpr double LOG2 = 0.693147181;
34 
35 class XmippProgram;
36 class MetaData;
37 
40 
48 
59 
68 void detectBackground(const MultidimArray<double> &vol, MultidimArray<double> &mask, double alpha,
69  double &final_mean);
70 
77 
93  int i,
94  int j,
95  float stop_colour = 1,
96  float filling_colour = 1,
97  bool less = true,
98  int neighbourhood = 8);
99 
113  int k,
114  int i,
115  int j,
116  float stop_colour = 1,
117  float filling_colour = 1,
118  bool less = true);
119 
120 
131  MultidimArray<int> &V_out, int filling_value);
132 
140  MultidimArray<int> &out, bool wrap=false);
141 
151  int neighbourhood = 8);
152 
161 
168  int size,
169  int neighbourhood = 8);
170 
178  double percentage = 0,
179  int neighbourhood = 8);
180 
186 void fillBinaryObject(MultidimArray< double >&I, int neighbourhood = 8);
187 
193 void varianceFilter(MultidimArray<double> &I, int kernelSize = 10, bool relative=false);
194 
199 void noisyZonesFilter(MultidimArray<double> &I, int kernelSize = 10);
200 
206 double giniCoeff(MultidimArray<double> &I, int varKernelSize = 50);
207 
217 
227 
242 double EntropyOtsuSegmentation(MultidimArray<double> &V, double percentil=0.05,
243  bool binarizeVolume=true);
244 
248 template <typename T>
250  const MultidimArray< T >& y,
251  const MultidimArray< int >* mask = nullptr,
252  int l = 0,
253  int m = 0,
254  int q = 0)
255 {
257 
258  double retval = 0; // returned value
259  int i;
260  int j;
261  int k;
262  int ip;
263  int jp;
264  int kp; // indexes
265  int Rows;
266  int Cols;
267  int Slices; // of the volumes
268 
269  // do the computation
270  Cols = XSIZE(x);
271  Rows = YSIZE(x);
272  Slices = ZSIZE(x);
273 
274  long N = 0;
275  for (k = 0; k < Slices; k++)
276  {
277  kp = k - q;
278  if (kp < 0 || kp >= Slices)
279  continue;
280  for (i = 0; i < Rows; i++)
281  {
282  ip = i - l;
283  if (ip < 0 || ip >= Rows)
284  continue;
285  for (j = 0; j < Cols; j++)
286  {
287  jp = j - m;
288 
289  if (jp >= 0 && jp < Cols)
290  {
291  if (mask != nullptr)
292  if (!DIRECT_A3D_ELEM((*mask), k, i, j))
293  continue;
294 
295  retval += DIRECT_A3D_ELEM(x, k, i, j) *
296  DIRECT_A3D_ELEM(y, kp, ip, jp);
297  ++N;
298  }
299  }
300  }
301  }
302 
303  return retval / N;
304 }
305 
309 template <typename T>
311  const MultidimArray< T >& y,
312  const MultidimArray< int >& mask)
313 {
314  double retval = 0; // returned value
315  long N = 0;
317  {
318  if (DIRECT_MULTIDIM_ELEM(mask,n))
319  {
320  retval += DIRECT_MULTIDIM_ELEM(x, n) * DIRECT_MULTIDIM_ELEM(y, n);
321  ++N;
322  }
323  }
324  return retval / N;
325 }
326 
327 template <typename T>
329  const MultidimArray< T >& y)
330 {
331  T * __restrict__ refX = x.data;
332  T * __restrict__ refY = y.data;
333  size_t nmax=4*(MULTIDIM_SIZE(x)/4);
334 
335  T retval = 0;
336  // loop unrolling
337  for (size_t n=0; n<nmax; n+=4)
338  {
339  retval += (*refX++)*(*refY++);
340  retval += (*refX++)*(*refY++);
341  retval += (*refX++)*(*refY++);
342  retval += (*refX++)*(*refY++);
343  }
344 
345  for (size_t n=nmax; n<MULTIDIM_SIZE(x); ++n)
346  {
347  retval += DIRECT_MULTIDIM_ELEM(x, n) * DIRECT_MULTIDIM_ELEM(y, n);
348  }
349 
350  return retval / MULTIDIM_SIZE(x);
351 }
352 
353 
356 
360 template <typename T>
362  double sigma, const GaussianInterpolator &G)
363 {
364  double retval=0;
365  double isigma=1.0/sigma;
367  retval+=G.getValue(isigma*(DIRECT_MULTIDIM_ELEM(x,n)-
368  DIRECT_MULTIDIM_ELEM(y,n)));
369  retval/=XSIZE(x);
370  return retval;
371 }
372 
375  double sigma, const GaussianInterpolator &G, const MultidimArray<int> &mask);
376 
380 template <typename T>
382  double sigma)
383 {
384  double retval=0;
385  double K=-0.5/(sigma*sigma);
387  {
388  double diff=DIRECT_MULTIDIM_ELEM(x,n)-DIRECT_MULTIDIM_ELEM(y,n);
389  retval+=exp(K*diff*diff);
390  }
391  retval/=XSIZE(x)*YSIZE(x)*ZSIZE(x);
392  return retval;
393 }
394 
398 double imedDistance(const MultidimArray<double>& I1, const MultidimArray<double>& I2);
399 
403 
407 
411 
415 double svdCorrelation(const MultidimArray<double>& I1, const MultidimArray<double>& I2, const MultidimArray< int >* mask = nullptr);
416 
432 double bestShift(const MultidimArray< double >& I1,
433  const MultidimArray< double >& I2,
434  double& shiftX,
435  double& shiftY,
436  CorrelationAux &aux,
437  const MultidimArray< int >* mask = nullptr,
438  int maxShift=-1);
439 
443 double bestShift(const MultidimArray<double> &I1, const MultidimArray< std::complex<double> > &FFTI1,
444  const MultidimArray<double> &I2,
445  double &shiftX, double &shiftY, CorrelationAux &aux,
446  const MultidimArray<int> *mask=nullptr, int maxShift=-1);
447 
451 double bestShift(const MultidimArray< std::complex<double> > &FFTI1,
452  const MultidimArray< std::complex<double> > &FFTI2,
453  MultidimArray<double> &Mcorr,
454  double &shiftX, double &shiftY, CorrelationAux &aux,
455  const MultidimArray<int> *mask=nullptr, int maxShift=-1);
456 
467 void bestShift(const MultidimArray<double> &I1, const MultidimArray<double> &I2,
468  double &shiftX, double &shiftY, double &shiftZ, CorrelationAux &aux,
469  const MultidimArray<int> *mask=nullptr);
470 
471 template<typename T>
472 T bestShift(MultidimArray<T> &Mcorr,
473  T &shiftX, T &shiftY, const MultidimArray<int> *mask, int maxShift);
474 
483  const MultidimArray< double >& I2,
484  double& shiftX,
485  double& shiftY,
486  CorrelationAux &aux);
487 
491 void bestNonwrappingShift(const MultidimArray<double> &I1, const MultidimArray< std::complex<double> > &FFTI1,
492  const MultidimArray<double> &I2, double &shiftX, double &shiftY,
493  CorrelationAux &aux);
494 
501  double &shiftX, double &shiftY,
502  const MultidimArray<int> *mask=nullptr, int maxShift=5, double shiftStep=1.0);
503 
506 {
507 public:
516  AlignmentAux();
517  AlignmentAux(const AlignmentAux &)=delete; // Do not use the default copy constructor
518  AlignmentAux & operator=(const AlignmentAux&) = delete; // Do not use the default copy assignment
519  ~AlignmentAux();
520 };
521 
523 {
524 public:
527 };
528 
538 double alignImages(const MultidimArray< double >& Iref,
541  bool wrap=xmipp_transformation::WRAP);
542 
545  Matrix2D<double>&M, bool wrap);
546 
550 double alignImagesConsideringMirrors(const MultidimArray<double>& Iref, const AlignmentTransforms& IrefTransforms,
552  CorrelationAux& aux2, RotationalCorrelationAux &aux3, bool wrap,
553  const MultidimArray<int>* mask=nullptr);
554 
558 double alignImages(const MultidimArray< double >& Iref,
561  bool wrap,
562  AlignmentAux &aux,
563  CorrelationAux &aux2,
565 
568 {
569 public:
579 };
580 
586  const MultidimArray< double >& I,
587  CorrelationAux &aux,
588  VolumeAlignmentAux &aux2);
589 
593 void fastBestRotation(const MultidimArray<double>& IrefCylZ,
594  const MultidimArray<double>& IrefCylY,
595  const MultidimArray<double>& IrefCylX,
597  const String &eulerAngles,
599 
601 double fastBestRotationAroundZ(const MultidimArray<double>& IrefCylZ,
602  const MultidimArray<double>& I, CorrelationAux &aux,
603  VolumeAlignmentAux &aux2);
604 
606 double fastBestRotationAroundY(const MultidimArray<double>& IrefCylY,
607  const MultidimArray<double>& I, CorrelationAux &aux,
608  VolumeAlignmentAux &aux2);
609 
611 double fastBestRotationAroundX(const MultidimArray<double>& IrefCylX,
612  const MultidimArray<double>& I, CorrelationAux &aux,
613  VolumeAlignmentAux &aux2);
614 
625  Matrix2D<double> &M,
626  AlignmentAux &aux,
627  CorrelationAux &aux2,
629  bool wrap=xmipp_transformation::WRAP,
630  const MultidimArray< int >* mask = NULL);
631 
641  int Niter=10, bool considerMirror=true);
642 
652  const Matrix1D<double> &mu,
653  const Matrix2D<double> &sigmainv);
654 
665  double &a, double &b, Matrix1D<double> &mu, Matrix2D<double> &sigma,
666  bool estimateMu=true, int iterations=10);
667 
671 template <typename T>
673  const MultidimArray< T >& y,
674  const MultidimArray< int >* mask = nullptr)
675 {
677 
678  double retval = 0;
679  long n = 0;
680 
682  {
683  if (mask != nullptr)
684  if (!(*mask)(k, i, j))
685  continue;
686 
687  retval += (A3D_ELEM(x, k, i, j) - A3D_ELEM(y, k, i, j)) *
688  (A3D_ELEM(x, k, i, j) - A3D_ELEM(y, k, i, j));
689  n++;
690  }
691 
692  if (n != 0)
693  return sqrt(retval);
694  else
695  return 0;
696 }
697 
714 template <typename T>
715 double mutualInformation(const MultidimArray< T >& x,
716  const MultidimArray< T >& y,
717  int nx = 0,
718  int ny = 0,
719  const MultidimArray< int >* mask = nullptr);
720 
724 template <typename T>
725 double rms(const MultidimArray< T >& x,
726  const MultidimArray< T >& y,
727  const MultidimArray< int >* mask = nullptr,
728  MultidimArray< double >* Contributions = nullptr)
729 {
731 
732  double retval = 0;
733  double aux;
734  int n = 0;
735 
736  // If contributions are desired
737  if (Contributions != nullptr)
738  {
740  {
741  if (mask != nullptr)
742  if (!(*mask)(k, i, j))
743  continue;
744 
745  aux = (A3D_ELEM(x, k, i, j) - A3D_ELEM(y, k, i, j)) *
746  (A3D_ELEM(x, k, i, j) - A3D_ELEM(y, k, i, j));
747  A3D_ELEM(*Contributions, k, i, j) = aux;
748  retval += aux;
749  n++;
750  }
751 
752  FOR_ALL_ELEMENTS_IN_ARRAY3D(*Contributions)
753  A3D_ELEM(*Contributions, k, i, j) = sqrt(A3D_ELEM(*Contributions,
754  k, i, j) / n);
755  }
756  else
757  {
759  {
760  if (mask != nullptr)
761  if (!(*mask)(k, i, j))
762  continue;
763 
764  retval += (A3D_ELEM(x, k, i, j) - A3D_ELEM(y, k, i, j)) *
765  (A3D_ELEM(x, k, i, j) - A3D_ELEM(y, k, i, j));
766  n++;
767  }
768  }
769 
770  if (n != 0)
771  return sqrt(retval / n);
772  else
773  return 0;
774 }
775 
785  double r2,
786  int k1,
787  int k2);
788 
789 
793 //void harmonicDecomposition(const MultidimArray< double >& img_in,
794 // MultidimArray< double >& v_out);
795 
796 // Function needed by median filtering
797 template <typename T>
798 void sort(T a, T b, T c, MultidimArray< T >& v)
799 {
800  if (a < b)
801  if (b < c)
802  {
803  DIRECT_MULTIDIM_ELEM(v,0) = a;
804  DIRECT_MULTIDIM_ELEM(v,1) = b;
805  DIRECT_MULTIDIM_ELEM(v,2) = c;
806  }
807  else if (a < c)
808  {
809  DIRECT_MULTIDIM_ELEM(v,0) = a;
810  DIRECT_MULTIDIM_ELEM(v,1) = c;
811  DIRECT_MULTIDIM_ELEM(v,2) = b;
812  }
813  else
814  {
815  DIRECT_MULTIDIM_ELEM(v,0) = c;
816  DIRECT_MULTIDIM_ELEM(v,1) = a;
817  DIRECT_MULTIDIM_ELEM(v,2) = b;
818  }
819  else if (a < c)
820  {
821  DIRECT_MULTIDIM_ELEM(v,0) = b;
822  DIRECT_MULTIDIM_ELEM(v,1) = a;
823  DIRECT_MULTIDIM_ELEM(v,2) = c;
824  }
825  else if (b < c)
826  {
827  DIRECT_MULTIDIM_ELEM(v,0) = b;
828  DIRECT_MULTIDIM_ELEM(v,1) = c;
829  DIRECT_MULTIDIM_ELEM(v,2) = a;
830  }
831  else
832  {
833  DIRECT_MULTIDIM_ELEM(v,0) = c;
834  DIRECT_MULTIDIM_ELEM(v,1) = b;
835  DIRECT_MULTIDIM_ELEM(v,2) = a;
836  }
837 }
838 
839 // Function needed by median filtering
840 template <typename T>
842 {
843  int i1 = 0;
844  int i2 = 0;
845  int i = 0;
846 
847  while ((i1 < 3) && (i2 < 3))
848  {
849  if (v1(i1) < v2(i2))
850  v(i++) = v1(i1++);
851  else
852  v(i++) = v2(i2++);
853  }
854 
855  while (i1 < 3)
856  v(i++) = v1(i1++);
857 
858  while (i2 < 3)
859  v(i++) = v2(i2++);
860 }
861 
862 // Function needed by median filtering
863 // This UGLY function performs a fast merge sort for the case of vectors of 3
864 // elements. This way is guaranteed a minimum number of comparisons (maximum
865 // number of comparisons to perform the sort, 5)
866 template <typename T>
868 {
870  {
873  {
876  {
881  }
882  else
883  {
886  {
890  }
891  else
892  {
895  {
898  }
899  else
900  {
903  }
904  }
905  }
906  }
907  else
908  {
911  {
914  {
918  }
919  else
920  {
923  {
926  }
927  else
928  {
931  }
932  }
933  }
934  else
935  {
938  {
941  {
944  }
945  else
946  {
949  }
950  }
951  else
952  {
956  }
957  }
958  }
959  }
960  else
961  {
964  {
967  {
970  {
974  }
975  else
976  {
979  {
982  }
983  else
984  {
987  }
988  }
989  }
990  else
991  {
994  {
997  {
1000  }
1001  else
1002  {
1005  }
1006  }
1007  else
1008  {
1012  }
1013  }
1014  }
1015  else
1016  {
1019  {
1022  {
1025  {
1028  }
1029  else
1030  {
1033  }
1034  }
1035  else
1036  {
1040  }
1041  }
1042  else
1043  {
1048  }
1049  }
1050  }
1051 }
1052 
1053 // Function needed by median filtering
1054 template <typename T>
1056 {
1060  m = DIRECT_MULTIDIM_ELEM(y,1);
1061  else
1062  m = DIRECT_MULTIDIM_ELEM(x,2);
1063  else
1065  m = DIRECT_MULTIDIM_ELEM(y,2);
1066  else
1067  m = DIRECT_MULTIDIM_ELEM(x,1);
1068  else
1071  m = DIRECT_MULTIDIM_ELEM(y,2);
1072  else
1073  m = DIRECT_MULTIDIM_ELEM(x,1);
1074  else
1076  m = DIRECT_MULTIDIM_ELEM(y,3);
1077  else
1079  m = DIRECT_MULTIDIM_ELEM(x,0);
1080  else
1081  m = DIRECT_MULTIDIM_ELEM(y,4);
1082 }
1083 
1087 template <typename T>
1089 {
1090  int backup_startingx = STARTINGX(m);
1091  int backup_startingy = STARTINGY(m);
1092 
1093  STARTINGX(m) = STARTINGY(m) = 0;
1095  MultidimArray< T > v2(3);
1096  MultidimArray< T > v3(3);
1097  MultidimArray< T > v4(3);
1098  MultidimArray< T > v(6);
1099 
1100  // Set the output matrix size
1101  out.initZeros(m);
1102 
1103  // Set the initial and final matrix indices to explore
1104  int initialY = 1;
1105  int initialX = 1;
1106  int finalY = YSIZE(m) - 2;
1107  int finalX = XSIZE(m) - 2;
1108 
1109  // For every row
1110  for (int i = initialY; i <= finalY; i++)
1111  {
1112  // For every pair of pixels (mean is computed obtaining
1113  // two means at the same time using an efficient method)
1114  for (int j = initialX; j <= finalX; j += 2)
1115  {
1116  // If we are in the border case
1117  if (j == 1)
1118  {
1119  // Order the first and second vectors of 3 elements
1120  sort(DIRECT_A2D_ELEM(m, i - 1, j - 1), DIRECT_A2D_ELEM(m, i, j - 1),
1121  DIRECT_A2D_ELEM(m, i + 1, j - 1), v1);
1122  sort(DIRECT_A2D_ELEM(m, i - 1, j), DIRECT_A2D_ELEM(m, i, j),
1123  DIRECT_A2D_ELEM(m, i + 1, j), v2);
1124  }
1125  else
1126  {
1127  // Simply take ordered vectors from previous
1128  v1 = v3;
1129  v2 = v4;
1130  }
1131 
1132  // As we are computing 2 medians at the same time, if the matrix has
1133  // an odd number of columns, the last column isn't calculated. It is
1134  // done here
1135  if (j == finalX)
1136  {
1137  v1 = v3;
1138  v2 = v4;
1139  sort(DIRECT_A2D_ELEM(m, i - 1, j + 1), DIRECT_A2D_ELEM(m, i, j + 1),
1140  DIRECT_A2D_ELEM(m, i + 1, j + 1), v3);
1141  fastMergeSort(v2, v3, v);
1142  median(v1, v, DIRECT_A2D_ELEM(out,i, j));
1143  }
1144  else
1145  {
1146  // Order the third and fourth vectors of 3 elements
1147  sort(DIRECT_A2D_ELEM(m, i - 1, j + 1), DIRECT_A2D_ELEM(m, i, j + 1),
1148  DIRECT_A2D_ELEM(m, i + 1, j + 1), v3);
1149  sort(DIRECT_A2D_ELEM(m, i - 1, j + 2), DIRECT_A2D_ELEM(m, i, j + 2),
1150  DIRECT_A2D_ELEM(m, i + 1, j + 2), v4);
1151 
1152  // Merge sort the second and third vectors
1153  fastMergeSort(v2, v3, v);
1154 
1155  // Find the first median and assign it to the output
1156  median(v1, v, DIRECT_A2D_ELEM(out, i, j));
1157 
1158  // Find the second median and assign it to the output
1159  median(v4, v, DIRECT_A2D_ELEM(out, i, j + 1));
1160  }
1161  }
1162  }
1163 
1164  STARTINGX(m) = STARTINGX(out) = backup_startingx;
1165  STARTINGY(m) = STARTINGY(out) = backup_startingy;
1166 }
1167 
1187  MultidimArray< double >& surface_strength,
1188  MultidimArray< double >& edge_strength,
1189  const Matrix1D< double >& W,
1190  int OuterLoops,
1191  int InnerLoops,
1192  int RefinementLoops,
1193  bool adjust_range = true);
1194 
1204  const Matrix1D< double >& alpha, double lambda);
1205 
1217  const MultidimArray< int >* mask,
1218  MultidimArray< double >& v_out);
1219 
1228 void inertiaMoments(const MultidimArray< double >& img,
1229  const MultidimArray< int >* mask,
1230  Matrix1D< double >& v_out,
1232 
1239 void fillTriangle(MultidimArray< double >&img, int* tx, int* ty, double color);
1240 
1256  double C,
1257  double dimLocal,
1258  MultidimArray< int >& result,
1259  MultidimArray< int >* mask = nullptr);
1260 
1269  CorrelationAux &aux);
1270 
1279 
1290  int Niter=10, bool limitShift=true);
1291 
1292 
1299 
1300 
1308 template <typename T>
1310 {
1311  bool badRemaining;
1312  T neighbours[125];
1313  T aux;
1314  int N = 0;
1315  int index;
1316 
1317  do
1318  {
1319  badRemaining=false;
1320 
1322  if (DIRECT_A3D_ELEM(mask, k, i, j) != 0)
1323  {
1324  N = 0;
1325  for (int kk=-2; kk<=2; kk++)
1326  {
1327  size_t kkk=k+kk;
1328  if (kkk<0 || kkk>=ZSIZE(V))
1329  continue;
1330  for (int ii=-2; ii<=2; ii++)
1331  {
1332  size_t iii=i+ii;
1333  if (iii<0 || iii>=YSIZE(V))
1334  continue;
1335  for (int jj=-2; jj<=2; jj++)
1336  {
1337  size_t jjj=j+jj;
1338  if (jjj<0 || jjj>=XSIZE(V))
1339  continue;
1340 
1341  if (DIRECT_A3D_ELEM(mask, kkk, iii, jjj) == 0)
1342  {
1343  index = N++;
1344  neighbours[index] = DIRECT_A3D_ELEM(V, kkk,iii,jjj);
1345  //insertion sort
1346  while (index > 0 && neighbours[index-1] > neighbours[index])
1347  {
1348  SWAP(neighbours[index-1], neighbours[index], aux);
1349  --index;
1350  }
1351  }
1352  }
1353  }
1354  if (N == 0)
1355  badRemaining = true;
1356  else
1357  {
1358  //std::sort(neighbours.begin(),neighbours.end());
1359  if (N % 2 == 0)
1360  DIRECT_A3D_ELEM(V, k, i, j) = (T)(0.5*(neighbours[N/2-1]+ neighbours[N/2]));
1361  else
1362  DIRECT_A3D_ELEM(V, k, i, j) = neighbours[N/2];
1363  DIRECT_A3D_ELEM(mask, k, i, j) = false;
1364  }
1365  }
1366  }
1367  }
1368  while (badRemaining);
1369 }
1370 
1377 template <typename T>
1378 void pixelDesvFilter(MultidimArray< T > &V, double thresFactor)
1379 {
1380  if (thresFactor > 0 )
1381  {
1382  double avg;
1383  double stddev;
1384  double high;
1385  double low;
1386  T dummy;
1387  MultidimArray<char> mask(ZSIZE(V), YSIZE(V), XSIZE(V));
1388  avg = stddev = low = high = 0;
1389  V.computeStats(avg, stddev, dummy, dummy);//min and max not used
1390  low = (avg - thresFactor * stddev);
1391  high = (avg + thresFactor * stddev);
1392 
1394  {
1395  double x = DIRECT_MULTIDIM_ELEM(V, n);
1396  DIRECT_MULTIDIM_ELEM(mask, n) = (x < low || x > high) ? 1 : 0;
1397  }
1398  boundMedianFilter(V, mask);
1399  }
1400 }
1401 
1408 //#include <math.h>
1409 
1410 template <typename T>
1411 void logFilter(MultidimArray< T > &V, double a, double b, double c)
1412 {
1413 
1415  {
1416  double x = DIRECT_MULTIDIM_ELEM(V, n);
1417  //this casting is kind of risky
1418  DIRECT_MULTIDIM_ELEM(V, n) = (T)(a-b*log(x+c));
1419  }
1420 }
1421 
1428 void denoiseTVFilter(MultidimArray<double> &V, int maxIter);
1429 
1430 
1432 void computeEdges (const MultidimArray <double>& vol, MultidimArray<double> &vol_edge);
1433 
1438 void forceDWTSparsity(MultidimArray<double> &V, double eps);
1439 
1442 {
1443 public:
1445  virtual void readParams(XmippProgram *program)
1446  {}//do nothing by default
1448  virtual void apply(MultidimArray<double> &img) = 0;
1449 
1451  virtual ~XmippFilter()
1452  {}
1453  ;
1454 
1456  virtual void show()
1457  {}
1458  ;
1459 };
1460 
1465 {
1466 public:
1468  typedef enum { NEGATIVE, MASK, OUTLIER } BadPixelFilterType;
1469 
1470  BadPixelFilterType type; //type of filter
1471  double factor; //for the case of outliers bad pixels
1472  Image<char> *mask; //for the case of mask bad pixels
1473 
1475  static void defineParams(XmippProgram * program);
1477  void readParams(XmippProgram * program);
1479  void apply(MultidimArray<double> &img);
1480 };
1481 
1482 class LogFilter: public XmippFilter
1483 {
1484 public:
1486  //4.431-0.4018*LN(ABS(P1+336.6))
1487  //a-b*ln(x+c)
1488  double a;
1489  double b;
1490  double c;
1492  static void defineParams(XmippProgram * program);
1494  void readParams(XmippProgram * program);
1496  void apply(MultidimArray<double> &img);
1497 };
1498 
1500 {
1501 public:
1502  int maxIter;
1504  static void defineParams(XmippProgram * program);
1506  void readParams(XmippProgram * program);
1508  void apply(MultidimArray<double> &img);
1509 };
1510 
1512 {
1514  typedef enum { PLANE, ROLLINGBALL } BackgroundType;
1515  BackgroundType type;
1516  int radius;
1517 
1518 public:
1520  static void defineParams(XmippProgram * program);
1522  void readParams(XmippProgram * program);
1524  void apply(MultidimArray<double> &img);
1525 };
1526 
1528 {
1529 public:
1531  static void defineParams(XmippProgram * program);
1533  void readParams(XmippProgram * program);
1535  void apply(MultidimArray<double> &img);
1536 };
1537 
1539 {
1542  int Shah_outer;
1543 
1546  int Shah_inner;
1547 
1550  int Shah_refinement;
1551 
1559  Matrix1D< double > Shah_weight;
1560 
1563  bool Shah_edge;
1564 public:
1566  static void defineParams(XmippProgram * program);
1568  void readParams(XmippProgram * program);
1570  void show();
1572  void apply(MultidimArray<double> &img);
1573 };
1574 
1576 {
1578  FileName fnBasis;
1579 
1581  int Nbasis;
1582 
1583  // Stack with the basis
1584  Image<double> basis;
1585 public:
1587  static void defineParams(XmippProgram * program);
1589  void readParams(XmippProgram * program);
1591  void show();
1593  void apply(MultidimArray<double> &img);
1594 };
1595 
1597 {
1598 public:
1599  double percentile; // Percentile of noise derivative energies filtered out
1600  double eps;
1601  Image<int> *mask; // for the case of mask bad pixels
1602 
1604  static void defineParams(XmippProgram * program);
1606  void readParams(XmippProgram * program);
1608  void apply(MultidimArray<double> &img);
1610  void laplacian(const MultidimArray<double> &img, MultidimArray< std::complex<double> > &fimg, bool direct);
1611 };
1612 
1613 /* Matlab 1D filter function, y=filter(b,a,x);
1614  * a and b may be modified either by dividing by a0, or by resizing it.
1615  * Z is an auxiliary vector that will help to calculate the filter
1616  * */
1619 
1620 /* Matlab 1D filtfilt function, y=filtfilt(b,a,x);
1621  * a(0) is supposed to be 1
1622  * */
1623 
1624 #endif
double alignImagesConsideringMirrors(const MultidimArray< double > &Iref, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap)
Definition: filters.cpp:2180
double fastBestRotationAroundZ(const MultidimArray< double > &IrefCylZ, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
Definition: filters.cpp:2276
void computeEdges(const MultidimArray< double > &vol, MultidimArray< double > &vol_edge)
Definition: filters.cpp:3517
void denoiseTVFilter(MultidimArray< double > &V, int maxIter)
Definition: filters.cpp:4129
void centerImageRotationally(MultidimArray< double > &I, RotationalCorrelationAux &aux)
Definition: filters.cpp:3248
int * nmax
#define YSIZE(v)
double giniCoeff(MultidimArray< double > &I, int varKernelSize=50)
Definition: filters.cpp:972
MultidimArray< double > IauxRS
Definition: filters.h:512
void centerImageTranslationally(MultidimArray< double > &I, CorrelationAux &aux)
Definition: filters.cpp:3212
double rms(const MultidimArray< T > &x, const MultidimArray< T > &y, const MultidimArray< int > *mask=nullptr, MultidimArray< double > *Contributions=nullptr)
Definition: filters.h:725
MultidimArray< std::complex< double > > FFTI
Definition: filters.h:526
double correlation(const MultidimArray< T > &x, const MultidimArray< T > &y, const MultidimArray< int > *mask=nullptr, int l=0, int m=0, int q=0)
Definition: filters.h:249
void forcePositive(MultidimArray< double > &V)
Definition: filters.cpp:3506
Matrix2D< double > R3
Definition: filters.h:578
Matrix2D< double > ASR
Definition: filters.h:509
MultidimArray< double > Icyl
Definition: filters.h:571
doublereal * c
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)
Definition: filters.cpp:412
#define MULTIDIM_SIZE(v)
double alignImages(const MultidimArray< double > &Iref, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap=xmipp_transformation::WRAP)
Definition: filters.cpp:2141
double OtsuSegmentation(MultidimArray< double > &V)
Definition: filters.cpp:1028
void rotationalInvariantMoments(const MultidimArray< double > &img, const MultidimArray< int > *mask, MultidimArray< double > &v_out)
Definition: filters.cpp:2900
void sqrt(Image< double > &op)
MultidimArray< double > IauxSR
Definition: filters.h:511
void computeStats(double &avg, double &stddev, T &minval, T &maxval) const
static double * y
virtual void show()
Definition: filters.h:1456
#define DIRECT_A2D_ELEM(v, i, j)
Polar_fftw_plans * plans
Definition: filters.h:514
double eps
Definition: filters.h:1600
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V)
void estimateGaussian2D(const MultidimArray< double > &I, double &a, double &b, Matrix1D< double > &mu, Matrix2D< double > &sigma, bool estimateMu=true, int iterations=10)
Definition: filters.cpp:2390
void sort(T a, T b, T c, MultidimArray< T > &v)
Definition: filters.h:798
cmache_1 eps
void fourierBesselDecomposition(const MultidimArray< double > &img_in, double r2, int k1, int k2)
Definition: filters.cpp:2469
double c
Definition: filters.h:1490
#define STARTINGX(v)
void matlab_filter(Matrix1D< double > &B, Matrix1D< double > &A, const MultidimArray< double > &X, MultidimArray< double > &Y, MultidimArray< double > &Z)
Definition: filters.cpp:4256
void bestNonwrappingShift(const MultidimArray< double > &I1, const MultidimArray< double > &I2, double &shiftX, double &shiftY, CorrelationAux &aux)
Definition: filters.cpp:1895
doublereal * x
#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
void median(MultidimArray< T > &x, MultidimArray< T > &y, T &m)
Definition: filters.h:1055
virtual void readParams(XmippProgram *program)
Definition: filters.h:1445
double mutualInformation(const MultidimArray< T > &x, const MultidimArray< T > &y, int nx=0, int ny=0, const MultidimArray< int > *mask=nullptr)
Definition: filters.cpp:4291
#define STARTINGY(v)
Matrix2D< double > centerImage(MultidimArray< double > &I, CorrelationAux &aux, RotationalCorrelationAux &aux2, int Niter=10, bool limitShift=true)
Definition: filters.cpp:3277
void detectBackground(const MultidimArray< double > &vol, MultidimArray< double > &mask, double alpha, double &final_mean)
Definition: filters.cpp:197
#define A3D_ELEM(V, k, i, j)
double imedNormalizedDistance(const MultidimArray< double > &I1, const MultidimArray< double > &I2)
Definition: filters.cpp:1321
AlignmentAux & operator=(const AlignmentAux &)=delete
void varianceFilter(MultidimArray< double > &I, int kernelSize=10, bool relative=false)
Definition: filters.cpp:775
#define FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
doublereal * b
double unnormalizedGaussian2D(const Matrix1D< double > &r, const Matrix1D< double > &mu, const Matrix2D< double > &sigmainv)
Definition: filters.cpp:2379
double v1
void log(Image< double > &op)
double * lambda
MultidimArray< double > I12
Definition: filters.h:574
void regionGrowing3DEqualValue(const MultidimArray< double > &V_in, MultidimArray< int > &V_out, int filling_value)
Definition: filters.cpp:499
void distanceTransform(const MultidimArray< int > &in, MultidimArray< int > &out, bool wrap=false)
Definition: filters.cpp:584
viol index
viol type
double b
Definition: filters.h:1489
int in
double fastMaskedCorrelation(const MultidimArray< T > &x, const MultidimArray< T > &y, const MultidimArray< int > &mask)
Definition: filters.h:310
double percentile
Definition: filters.h:1599
double EntropyOtsuSegmentation(MultidimArray< double > &V, double percentil=0.05, bool binarizeVolume=true)
Definition: filters.cpp:1145
double fastBestRotationAroundY(const MultidimArray< double > &IrefCylY, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
Definition: filters.cpp:2290
MultidimArray< double > corr
Definition: filters.h:572
#define XSIZE(v)
void forceDWTSparsity(MultidimArray< double > &V, double eps)
Definition: filters.cpp:3539
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
Polar< std::complex< double > > polarFourierI
Definition: filters.h:515
void removeSmallComponents(MultidimArray< double > &I, int size, int neighbourhood=8)
Definition: filters.cpp:689
void contrastEnhancement(Image< double > *I)
Definition: filters.cpp:327
MultidimArray< double > rotationalCorr
Definition: filters.h:513
double euclidianDistance(const MultidimArray< T > &x, const MultidimArray< T > &y, const MultidimArray< int > *mask=nullptr)
Definition: filters.h:672
void regionGrowing2D(const MultidimArray< double > &I_in, MultidimArray< double > &I_out, int i, int j, float stop_colour=1, float filling_colour=1, bool less=true, int neighbourhood=8)
Definition: filters.cpp:340
#define ZSIZE(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
double imedDistance(const MultidimArray< double > &I1, const MultidimArray< double > &I2)
Definition: filters.cpp:1269
double getValue(double x) const
double dummy
virtual size_t size() const =0
double factor
Definition: filters.h:1471
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=true)
Definition: filters.cpp:2720
#define DIRECT_A3D_ELEM(v, k, i, j)
#define SPEED_UP_temps
Definition: xmipp_macros.h:419
MultidimArray< double > I1
Definition: filters.h:573
double correlationMasked(const MultidimArray< double > &I1, const MultidimArray< double > &I2)
Definition: filters.cpp:1397
#define j
void pixelDesvFilter(MultidimArray< T > &V, double thresFactor)
Definition: filters.h:1378
double bestRotationAroundZ(const MultidimArray< double > &Iref, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
Definition: filters.cpp:2356
int m
void mergeSort(MultidimArray< T > &v1, MultidimArray< T > &v2, MultidimArray< T > &v)
Definition: filters.h:841
T fastCorrelation(const MultidimArray< T > &x, const MultidimArray< T > &y)
Definition: filters.h:328
double correlationWeighted(MultidimArray< double > &I1, MultidimArray< double > &I2)
Definition: filters.cpp:1457
Matrix2D< double > R1
Definition: filters.h:576
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)
Definition: filters.cpp:2341
MultidimArray< double > I123
Definition: filters.h:575
Definition: polar.h:67
int labelImage2D(const MultidimArray< double > &I, MultidimArray< double > &label, int neighbourhood=8)
Definition: filters.cpp:648
void boundMedianFilter(MultidimArray< T > &V, const MultidimArray< char > &mask, int n=0)
Definition: filters.h:1309
void fillBinaryObject(MultidimArray< double > &I, int neighbourhood=8)
Definition: filters.cpp:758
double bestShiftRealSpace(const MultidimArray< double > &I1, MultidimArray< double > &I2, double &shiftX, double &shiftY, const MultidimArray< int > *mask=nullptr, int maxShift=5, double shiftStep=1.0)
Definition: filters.cpp:1989
virtual ~XmippFilter()
Definition: filters.h:1451
MultidimArray< double > IrefCyl
Definition: filters.h:570
double bestShift(const MultidimArray< double > &I1, const MultidimArray< double > &I2, double &shiftX, double &shiftY, CorrelationAux &aux, const MultidimArray< int > *mask=nullptr, int maxShift=-1)
Definition: filters.cpp:1735
void covarianceMatrix(const MultidimArray< double > &I, Matrix2D< double > &C)
Definition: filters.cpp:1582
void logFilter(MultidimArray< T > &V, double a, double b, double c)
Definition: filters.h:1411
void keepBiggestComponent(MultidimArray< double > &I, double percentage=0, int neighbourhood=8)
Definition: filters.cpp:713
Image< char > * mask
Definition: filters.h:1472
void medianFilter3x3(MultidimArray< T > &m, MultidimArray< T > &out)
Definition: filters.h:1088
std::string String
Definition: xmipp_strings.h:34
BadPixelFilterType type
Definition: filters.h:1470
void substractBackgroundRollingBall(MultidimArray< double > &I, int radius)
Definition: filters.cpp:75
void alignSetOfImages(MetaData &MD, MultidimArray< double > &Iavg, int Niter=10, bool considerMirror=true)
Definition: filters.cpp:2199
int mu
constexpr double LOG2
Definition: filters.h:33
double tomographicDiffusion(MultidimArray< double > &V, const Matrix1D< double > &alpha, double lambda)
Definition: filters.cpp:2764
doublereal * u
Matrix2D< double > R
Definition: filters.h:510
#define SWAP(a, b, tmp)
Definition: xmipp_macros.h:428
void fillTriangle(MultidimArray< double > &img, int *tx, int *ty, double color)
Definition: filters.cpp:3012
void noisyZonesFilter(MultidimArray< double > &I, int kernelSize=10)
Definition: filters.cpp:870
double fastCorrentropy(const MultidimArray< T > &x, const MultidimArray< T > &y, double sigma, const GaussianInterpolator &G)
Definition: filters.h:361
constexpr int K
float r2
double EntropySegmentation(MultidimArray< double > &V)
Definition: filters.cpp:1078
double svdCorrelation(const MultidimArray< double > &I1, const MultidimArray< double > &I2, const MultidimArray< int > *mask=nullptr)
Definition: filters.cpp:1535
#define SPEED_UP_tempsInt
Definition: xmipp_macros.h:408
void fastMergeSort(MultidimArray< T > &x, MultidimArray< T > &y, MultidimArray< T > &v)
Definition: filters.h:867
Matrix2D< double > ARS
Definition: filters.h:508
Polar< std::complex< double > > polarFourierI
Definition: filters.h:525
void initZeros(const MultidimArray< T1 > &op)
#define FOR_ALL_ELEMENTS_IN_COMMON_IN_ARRAY3D(V1, V2)
void localThresholding(MultidimArray< double > &img, double C, double dimLocal, MultidimArray< int > &result, MultidimArray< int > *mask=nullptr)
Definition: filters.cpp:3164
int labelImage3D(const MultidimArray< double > &V, MultidimArray< double > &label)
Definition: filters.cpp:669
Matrix2D< double > R2
Definition: filters.h:577
double correntropy(const MultidimArray< T > &x, const MultidimArray< T > &y, double sigma)
Definition: filters.h:381
void substractBackgroundPlane(MultidimArray< double > &I)
Definition: filters.cpp:40
int * n
doublereal * a
double a
Definition: filters.h:1488
void inertiaMoments(const MultidimArray< double > &img, const MultidimArray< int > *mask, Matrix1D< double > &v_out, Matrix2D< double > &u)
Definition: filters.cpp:2970
double fastBestRotationAroundX(const MultidimArray< double > &IrefCylX, const MultidimArray< double > &I, CorrelationAux &aux, VolumeAlignmentAux &aux2)
Definition: filters.cpp:2304
Image< int > * mask
Definition: filters.h:1601