MorphoGraphX  2.0-1-227
MeshProcessSignal.hpp
Go to the documentation of this file.
1 //
2 // This file is part of MorphoGraphX - http://www.MorphoGraphX.org
3 // Copyright (C) 2012-2015 Richard S. Smith and collaborators.
4 //
5 // If you use MorphoGraphX in your work, please cite:
6 // http://dx.doi.org/10.7554/eLife.05864
7 //
8 // MorphoGraphX is free software, and is licensed under under the terms of the
9 // GNU General (GPL) Public License version 2.0, http://www.gnu.org/licenses.
10 //
11 #ifndef MESH_PROCESS_SIGNAL_HPP
12 #define MESH_PROCESS_SIGNAL_HPP
13 
14 #include <Process.hpp>
15 
16 #include <Curvature.hpp>
17 
18 class Ui_LoadHeatMap;
19 
20 namespace mgx
21 {
22  typedef std::map<int, HVec3U> IntHVec3UMap;
23 
25 
28 
34  class mgxBase_EXPORT ViewMeshProcess : public Process
35  {
36  public:
37  ViewMeshProcess(const Process& process) : Process(process)
38  {
39  setName("Mesh/System/View");
40  setDesc("Modify how the current mesh is viewed. Useful for scripts.");
41  setIcon(QIcon(":/images/Palette.png"));
42 
43  addParm("Show Surface","Draw mesh as a continuous surface","", QStringList() << "" << "Yes" << "No");
44  addParm("Use Parents","Use parent labels","", QStringList() << "" << "Yes" << "No");
45  addParm("Surface Type","Vertex: show projected signal, Tris: color by triangle, Cells: Color by Label)", "",
46  QStringList() << "" << "Vertex" << "Tris" << "Cells");
47  addParm("Vertex Signal","Signal: show projected signal, Stack Texture: Use 3D stack as texture, Image Texture: Use 2D texture (height map)", "",
48  QStringList() << "" << "Signal" << "Stack Texture" << "Image Texture");
49  addParm("Cells Signal","Label: show labels, Label Heat: show heat map, Wall Heat: show wall heat map, Cell Color: show cell color", "",
50  QStringList() << "" << "Label" << "Label Heat" << "Wall Heat" << "Cell Color");
51  addParm("Blend","Semi-transparent mesh, for example to superimpose to meshes or view the stack through the mesh.", "",
52  QStringList() << "" << "Yes" << "No");
53  addParm("Cull","Color the triangles (with signal or labels) only on the top of the mesh.", "",
54  QStringList() << "" << "Yes" << "No");
55  addParm("Show Mesh","Draw triangle edges and nodes","", QStringList() << "" << "Yes" << "No"); // 5
56  addParm("Mesh View","All: draw all triangles, Border: draw outside edge of the mesh only, Cells: draw cell outlines only, "
57  "Selected: draw selected nodes only", "", QStringList() << "" << "All" << "Border" << "Cells" << "Selected");
58  addParm("Show Lines","Show connecting lines between nodes in the mesh.","", QStringList() << "" << "Yes" << "No");
59  addParm("Show Points","Show mesh nodes.","", QStringList() << "" << "Yes" << "No");
60  addParm("Show Map","Mapping of text on the labels (e.g. label number)","", QStringList() << "" << "Yes" << "No");
61  addParm("Scale","Change scaling of mesh/stacks, independently in 3 directions (x,y,z). NB: ","", QStringList() << "" << "Yes" << "No");
62  addParm("Transform","a stack saved with 'Scale' turned on will have a modified voxel size, while saved meshes are unaffected. ", "",
63  QStringList() << "" << "Yes" << "No");
64  addParm("BBox","Apply rotation and translation to the mesh/stack.","", QStringList() << "" << "Yes" << "No");
65  addParm("Brightness","Display the bounding box (i.e. total size) of a stack.","-1");
66  addParm("Opacity","Brightness of signal, labels or heat","-1");
67  }
68  bool run();
69  };
70 
76  class mgxBase_EXPORT ProjectSignal : public Process
77  {
78  public:
79  ProjectSignal(const Process& process) : Process(process)
80  {
81  setName("Mesh/Signal/Project Signal");
82  setDesc("Project signal onto mesh, perpendicular to its curved surface.");
83  setIcon(QIcon(":/images/ProjectColor.png"));
84 
85  addParm("Use absolute","Use absolute values of signal, instead of normalizing it, useful for signal quantification.","No",booleanChoice()); // 0
86  addParm("Min Dist (µm)","Distance (triangle-voxel) above which the signal is projected.","2.0"); // 1
87  addParm("Max Dist (µm)","Maximal distance (triangle-voxel) used for signal projection.","6.0"); // 2
88  addParm("Min Signal","Lower bound of signal value if 'Use absolute' is chosen","0.0"); // 3
89  addParm("Max Signal","Upper bound of projected signal value.","60000.0"); // 4
90  }
91 
92  bool run()
93  {
94  if(!checkState().store(STORE_NON_LABEL).mesh(MESH_NON_EMPTY))
95  return false;
96  return run(currentStack()->currentStore(), currentMesh(), stringToBool(parm("Use absolute")),
97  parm("Min Dist (µm)").toFloat(), parm("Max Dist (µm)").toFloat(), parm("Min Signal").toFloat(), parm("Max Signal").toFloat());
98  }
99 
100  bool run(const Store* store, Mesh* mesh, bool useAbsSignal, float minDist,
101  float maxDist, float absSignalMin, float absSignalMax);
102  void projSignal(const Stack* stack, const HVecUS& data, vertex v, float mindist, float maxdist);
103 
104  };
105 
106 
112  class mgxBase_EXPORT ProjectLabel : public Process
113  {
114  public:
115  ProjectLabel(const Process& process) : Process(process)
116  {
117  setName("Mesh/Segmentation/Project 3D Labels on Mesh");
118  setDesc("Project labels onto mesh, perpendicular to its curved surface.");
119  setIcon(QIcon(":/images/ProjectColor.png"));
120 
121  addParm("Use absolute","Use absolute values of signal, instead of normalizing it, useful for signal quantification.","No",booleanChoice()); // 0
122  addParm("Min Dist (µm)","Distance (triangle-voxel) above which the signal is projected.","2.0"); // 1
123  addParm("Max Dist (µm)","Maximal distance (triangle-voxel) used for signal projection.","6.0"); // 2
124  addParm("Labeling Method","Labeling Method","Majority",QStringList() << "Majority" << "Absolute Majority"); // 2
125  addParm("Ignore Zero","Ignore Zero","No",booleanChoice()); // 2
126  }
127 
128  bool run()
129  {
130  return run(currentStack()->currentStore(), currentMesh(),
131  parm("Min Dist (µm)").toFloat(), parm("Max Dist (µm)").toFloat(), parm("Labeling Method"), stringToBool(parm("Ignore Zero")));
132  }
133 
134  bool run(const Store* store, Mesh* mesh, float minDist,
135  float maxDist, QString method, bool ignoreZero);
136  void projLabel(const Stack* stack, const HVecUS& data, vertex v, float mindist, float maxdist, int zeroLabel, QString method, bool ignoreZero);
137 
138  };
139 
145  class mgxBase_EXPORT ProjectLabelsOnMesh : public Process
146  {
147  public:
148  ProjectLabelsOnMesh(const Process& process) : Process(process)
149  {
150  setName("Mesh/Segmentation/Project Nearest 3D Label on Mesh");
151  setDesc("Find the stack labeled for the positions of each vertex. Might not be needed anymore!");
152  setIcon(QIcon(":/images/MakeHeatMap.png"));
153 
154  addParm("Split Border","Split Border","Yes",booleanChoice());
155  addParm("Search Radius","Search Radius","0");
156  }
157 
158  bool run()
159  {
160  Stack* s1 = currentStack();
161  Store* store1 = s1->main();
162  Mesh* m = currentMesh();
163  return run(s1, store1, m, stringToBool(parm("Split Border")), parm("Search Radius").toInt());
164  }
165 
166  bool run(Stack* s1, Store* store1, Mesh* m, bool splitBorder, int searchNeighborhood);
167 
168  };
169 
170 
171 
177  class mgxBase_EXPORT SmoothMeshSignal : public Process
178  {
179  public:
180  SmoothMeshSignal(const Process& process) : Process(process)
181  {
182  setName("Mesh/Signal/Smooth Mesh Signal");
183  setDesc("Averages the signal of each node, based on its immediate neighbors.");
184  setIcon(QIcon(":/images/SmoothColor.png"));
185 
186  addParm("Passes","Number of smoothing iterations.","3");
187  }
188 
189  bool run()
190  {
191  if(!checkState().mesh(MESH_NON_EMPTY))
192  return false;
193  return run(currentMesh(), parm("Passes").toUInt());
194  }
195 
196  bool run(Mesh* mesh, uint passes);
197 
198  };
199 
205  class mgxBase_EXPORT MeshBrightness : public Process {
206  public:
207  MeshBrightness(const Process& process) : Process(process)
208  {
209  setName("Mesh/Signal/Mesh Brighness");
210  setDesc("Changes the brightness of the signal on a mesh.");
211  setIcon(QIcon(":/images/Brightness.png"));
212 
213  addParm("Amount","Amount to multiply the signal, >1 is brighter","2.0");
214  }
215 
216  bool run()
217  {
218  if(!checkState().mesh(MESH_NON_EMPTY))
219  return false;
220  return run(currentMesh(), parm("Amount").toFloat());
221  }
222 
223  bool run(Mesh* mesh, float amount);
224 
225  };
226 
232  class mgxBase_EXPORT ClearMeshSignal : public Process
233  {
234  public:
235  ClearMeshSignal(const Process& process) : Process(process)
236  {
237  setName("Mesh/Signal/Clear Mesh Signal");
238  setDesc("Erase the signal on the mesh");
239  setIcon(QIcon(":/images/ClearSignal.png"));
240 
241  addParm("Value","Assign this signal value to the mesh.","50000");
242  }
243 
244  bool run()
245  {
246  if(!checkState().mesh(MESH_NON_EMPTY))
247  return false;
248  return run(currentMesh(), parm("Value").toUInt());
249  }
250 
251  bool run(Mesh* mesh, uint value);
252 
253  };
254 
261  class mgxBase_EXPORT ProjectCurvature : public Process
262  {
263  public:
264  ProjectCurvature(const Process& process) : Process(process)
265  {
266  setName("Mesh/Signal/Project Mesh Curvature");
267  setDesc("Compute curvature at each node of the mesh, for a given neighborhood size. Curvature values are stored as signal.");
268  setIcon(QIcon(":/images/Curvature.png"));
269 
270  addParm("Output","Name of output file, if desired.","");
271  addParm("Type","Minimal = minCurv, Maximal = maxCurv, Gaussian = maxCurv * minCurv, SumSquare = maxCurv^2 + minCurv^2, Average = (maxCurv + minCurv)/2, SignedAverageAbs = sign(max or min) x (abs(maxCurv) + abs(minCurv))/2","Gaussian", QStringList() << "Minimal" << "Maximal" << "Gaussian" << "SumSquare" << "Average" << "SignedAverageAbs");
272  addParm("Neighborhood (µm)","Neighborhood (µm)","3.0");
273  addParm("AutoScale","Clip max and min signal range according to curvature distribution","Yes",booleanChoice());
274  addParm("Min Curv","Minimal curvature value displayed","-50.0");
275  addParm("Max Curv","Maximal curvature value displayed","50.0");
276  addParm("Autoscale percentile","Auto-scale signal range based on curvature percentile","85");
277  }
278 
279  bool run()
280  {
281  if(!checkState().mesh(MESH_NON_EMPTY))
282  return false;
283  bool ok;
284  float neighborhood = parm("Neighborhood (µm)").toFloat(&ok);
285  if(not ok)
286  return setErrorMessage("Error, parameter 'Neighborhood' must be a number");
287  float mincurv = parm("Min Curv").toFloat(&ok);
288  if(not ok)
289  return setErrorMessage("Error, parameter 'Min Curv' must be a number");
290  float maxcurv = parm("Max Curv").toFloat(&ok);
291  if(not ok)
292  return setErrorMessage("Error, parameter 'Max Curv' must be a number");
293  float percentile = parm("Autoscale percentile").toFloat(&ok);
294  if(not ok)
295  return setErrorMessage("Error, parameter 'Percentile' must be a number");
296  return run(currentMesh(), parm("Output"), parm("Type"), neighborhood, stringToBool(parm("AutoScale")),
297  mincurv, maxcurv, percentile);
298  }
299 
300  bool run(Mesh* mesh, QString output, QString type, float neighborhood,
301  bool auto_scale, float mincurv, float maxcurv, int percentile);
302 
303  };
304 
305 
311  class mgxBase_EXPORT MeshSignalGrad : public Process
312  {
313  public:
314  MeshSignalGrad(const Process& process) : Process(process)
315  {
316  setName("Mesh/Signal/Signal Gradient");
317  setDesc("Gradient of mesh signal");
318  setIcon(QIcon(":/images/Blur.png"));
319 
320  addParm("Radius (µm)","Size of neighborhood used for Gaussian blur. The blur function standard deviation is given by sigma = radius/2. ","2.0");
321  }
322 
323  bool run()
324  {
325  if(!checkState().mesh(MESH_NON_EMPTY))
326  return false;
327  return run(currentMesh());
328  }
329 
330  bool run(Mesh* mesh);
331 
332  };
333 
334 
335 
341  class mgxBase_EXPORT MeshGaussianBlur : public Process
342  {
343  public:
344  MeshGaussianBlur(const Process& process) : Process(process)
345  {
346  setName("Mesh/Signal/Gaussian Blur");
347  setDesc("Apply Gaussian Blur to mesh signal");
348  setIcon(QIcon(":/images/Blur.png"));
349 
350  addParm("Radius (µm)","Size of neighborhood used for Gaussian blur. The blur function standard deviation is given by sigma = radius/2. ","2.0");
351  }
352 
353  bool run()
354  {
355  if(!checkState().mesh(MESH_NON_EMPTY))
356  return false;
357  return run(currentMesh(), parm("Radius (µm)").toFloat());
358  }
359 
360  bool run(Mesh* mesh, float radius);
361 
362  };
363 
369  class mgxBase_EXPORT MeshDiffGaussians : public Process
370  {
371  public:
372  MeshDiffGaussians(const Process& process) : Process(process)
373  {
374  setName("Mesh/Signal/Difference of Gaussians");
375  setDesc("Calculate a difference of Gaussians for the mesh signal");
376  setIcon(QIcon(":/images/Blur.png"));
377 
378  addParm("Radius1 (µm)","Size of first neighborhood","1.0");
379  addParm("Radius2 (µm)","Size of second neighborhood","5.0");
380  }
381 
382  bool run()
383  {
384  if(!checkState().mesh(MESH_NON_EMPTY))
385  return false;
386  return run(currentMesh(), parm("Radius1 (µm)").toFloat(), parm("Radius2 (µm)").toFloat());
387  }
388 
389  bool run(Mesh* mesh, float radius1, float radius2);
390 
391  };
392 
398  class mgxBase_EXPORT MeshLocalMinima : public Process
399  {
400  public:
401  MeshLocalMinima(const Process& process) : Process(process)
402  {
403  setName("Mesh/Segmentation/Auto Seeding");
404  setDesc("Put a seed at local minima of mesh signal.");
405  setIcon(QIcon(":/images/LocalMinima.png"));
406 
407  addParm("Radius (µm)","Size of neighborhood used for search of local minima. Typically, the radius of smallest cells in the sample.","3.0"); // 0
408  addParm("Consider existing Labels","Consider existing Labels","Yes",booleanChoice()); // 0
409  }
410 
411  bool run()
412  {
413  if(!checkState().mesh(MESH_NON_EMPTY))
414  return false;
415  return run(currentMesh(), parm("Radius (µm)").toFloat());
416  }
417 
418  bool run(Mesh* mesh, float radius);
419 
420  };
421 
427  class mgxBase_EXPORT MeshNormalize : public Process
428  {
429  public:
430  MeshNormalize(const Process& process) : Process(process)
431  {
432  setName("Mesh/Signal/Normalize Signal");
433  setDesc("Normalize mesh signal locally.");
434  setIcon(QIcon(":/images/Normalize.png"));
435 
436  addParm("Radius (µm)","Size of neighborhood used for normalization.","5.0");
437  }
438 
439  bool run()
440  {
441  if(!checkState().mesh(MESH_NON_EMPTY))
442  return false;
443  return run(currentMesh(), parm("Radius (µm)").toFloat());
444 
445  }
446 
447  bool run(Mesh* mesh, float radius);
448 
449  };
450 
458  class mgxBase_EXPORT MeshDilation : public Process
459  {
460  public:
461  MeshDilation(const Process& process) : Process(process)
462  {
463  setName("Mesh/Signal/Dilate Signal");
464  setDesc("Morphological dilation of signal on mesh.");
465  setIcon(QIcon(":/images/Dilate.png"));
466 
467  addParm("Radius (µm)","Size of neighborhood used for dilation.","1.0"); // 0
468  }
469 
470  bool run()
471  {
472  if(!checkState().mesh(MESH_NON_EMPTY))
473  return false;
474  return run(currentMesh(), parm("Radius (µm)").toFloat());
475  }
476 
477  bool run(Mesh* mesh, float radius);
478 
479  };
480 
488  class mgxBase_EXPORT MeshLabelDilation : public Process
489  {
490  public:
491  MeshLabelDilation(const Process& process) : Process(process)
492  {
493  setName("Mesh/Segmentation/Dilate Labels");
494  setDesc("Morphological dilation of labels on mesh.");
495  setIcon(QIcon(":/images/Dilate.png"));
496 
497  addParm("Radius (µm)","Size of neighborhood used for dilation.","1.0"); // 0
498  }
499 
500  bool run()
501  {
502  if(!checkState().mesh(MESH_NON_EMPTY))
503  return false;
504  return run(currentMesh(), parm("Radius (µm)").toFloat());
505  }
506 
507  bool run(Mesh* mesh, float radius);
508 
509  };
510 
511 
512 
520  class mgxBase_EXPORT MeshErosion : public Process
521  {
522  public:
523  MeshErosion(const Process& process) : Process(process)
524  {
525  setName("Mesh/Signal/Erode Signal");
526  setDesc("Apply morphological erosion to mesh signal (opposite to Dilate Signal).");
527  setIcon(QIcon(":/images/Erode.png"));
528 
529  addParm("Radius (µm)","Size of neighborhood used for erosion.","1.0");
530  }
531 
532  bool run()
533  {
534  if(!checkState().mesh(MESH_NON_EMPTY))
535  return false;
536  return run(currentMesh(), parm("Radius (µm)").toFloat());
537  }
538 
539  bool run(Mesh* mesh, float radius);
540 
541  };
542 
550  class mgxBase_EXPORT MeshLabelErosion : public Process
551  {
552  public:
553  MeshLabelErosion(const Process& process) : Process(process)
554  {
555  setName("Mesh/Segmentation/Erode Labels");
556  setDesc("Apply morphological erosion to mesh signal (opposite to Dilate Labels).");
557  setIcon(QIcon(":/images/Erode.png"));
558 
559  addParm("Radius (µm)","Size of neighborhood used for erosion.","1.0");
560  }
561 
562  bool run()
563  {
564  if(!checkState().mesh(MESH_NON_EMPTY))
565  return false;
566  return run(currentMesh(), parm("Radius (µm)").toFloat());
567  }
568 
569  bool run(Mesh* mesh, float radius);
570 
571  };
572 
573 
580  class mgxBase_EXPORT MeshClosing : public Process
581  {
582  public:
583  MeshClosing(const Process& process) : Process(process)
584  {
585  setName("Mesh/Signal/Close Signal");
586  setDesc("Apply morphological dilation followed by erosion to mesh signal.");
587  setIcon(QIcon(":/images/Closing.png"));
588 
589  addParm("Radius (µm)","Size of neighborhood used for dilation/erosion.","1.0");
590  }
591 
592  bool run()
593  {
594  if(!checkState().mesh(MESH_NON_EMPTY))
595  return false;
596  return run(currentMesh(), parm("Radius (µm)").toFloat());
597  }
598 
599  bool run(Mesh* mesh, float radius);
600 
601  };
602 
609  class mgxBase_EXPORT MeshOpening : public Process
610  {
611  public:
612  MeshOpening(const Process& process) : Process(process)
613  {
614  setName("Mesh/Signal/Open Signal");
615  setDesc("Apply morphological erosion followed by dilation to mesh signal.");
616  setIcon(QIcon(":/images/Opening.png"));
617 
618  addParm("Radius (µm)","Size of neighborhood used for erosion/dilation.","1.0");
619  }
620 
621  bool run()
622  {
623  if(!checkState().mesh(MESH_NON_EMPTY))
624  return false;
625  return run(currentMesh(), parm("Radius (µm)").toFloat());
626  }
627 
628  bool run(Mesh* mesh, float radius);
629 
630  };
631 
632  class mgxBase_EXPORT RescaleSignal : public Process
633  {
634  public:
635  RescaleSignal(const Process& process) : Process(process)
636  {
637  setName("Mesh/Signal/Rescale Signal");
638  setDesc("Change the colorbar of the signal. \n"
639  "If percentile is set to 0, it uses the minimum and maximum arguments. \n"
640  "Only the visualization is affected, the signal projection remains unchanged");
641  setIcon(QIcon(":/images/Normalize.png"));
642 
643  addParm("Zero as reference","If true, 0 will be used as a reference. \n"
644  "If the signal is all positive (resp. negative), 0 will be added as a minimum (resp. maximum). \n"
645  "If the signal is both positive and negative, 0 will be place at the center of the range","No",booleanChoice());
646  addParm("Percentile","Keep only this percentage of the signal to compute the range.","99");
647  addParm("Minimum","If the percentile specified is 0, uses this as the minimum value for the range","0");
648  addParm("Maximum","If the percentile specified is 0, uses this as the maximum value for the range","1");
649  }
650 
651  bool run()
652  {
653  if(!checkState().mesh(MESH_NON_EMPTY))
654  return false;
655  bool ok;
656  float percentile = parm("Percentile").toFloat(&ok);
657  if(!ok)
658  return setErrorMessage("Error, argument 'Percentile' must be a number");
659  float minimum = parm("Minimum").toFloat(&ok);
660  if(!ok)
661  return setErrorMessage("Error, argument 'Minimum' must be a number");
662  float maximum = parm("Maximum").toFloat(&ok);
663  if(!ok)
664  return setErrorMessage("Error, argument 'Maximum' must be a number");
665  return run(currentMesh(), stringToBool(parm("Zero as reference")), percentile, minimum, maximum);
666  }
667 
668  bool run(Mesh* mesh, bool use_zero, float percentile, float minimum, float maximum);
669 
670  };
671 
677  class mgxBase_EXPORT SetSignalProcess : public Process
678  {
679  public:
680  SetSignalProcess(const Process& process) : Process(process)
681  {
682  setName("Mesh/Signal/Set Signal");
683  setDesc("Set the signal for the whole mesh, or for the currently selected part of it.");
684  setIcon(QIcon(":/images/Sharpen.png"));
685 
686  addParm("Value","New value for the signal","1");
687  addParm("Rescale","If true, the signal bounds will be rescaled","Yes",booleanChoice());
688  addParm("Percentile","If rescaling, which percentile to use?","100");
689  addParm("Use zero","If rescaling, should we use zero as reference?","No",booleanChoice());
690  }
691 
692  bool run()
693  {
694  if(not checkState().mesh(MESH_VISIBLE))
695  return false;
696  bool ok;
697  float value = parm("Value").toFloat(&ok);
698  if(not ok)
699  return setErrorMessage("Parameter 'Value' must be a number");
700  float percentile = parm("Percentile").toFloat(&ok);
701  if(not ok)
702  return setErrorMessage("Parameter 'Percentile' must be a number");
703  return run(currentMesh(), value, stringToBool(parm("Rescale")), percentile,
704  stringToBool(parm("Use zero")));
705  }
706 
707  bool run(Mesh* m, float value, bool rescale, float percentile, bool use_zero);
708 
709  };
710 
712 
713  class mgxBase_EXPORT ProjectCurvatureOp
714  {
715  public:
716  ProjectCurvatureOp(const vvGraph& S, const VtxVec& vs, std::string type, float radius,
717  FloatVec& values, std::vector<Curvature>& curvs);
718  void operator()(int i);
719 
720  private:
721  const vvGraph& S;
722  const VtxVec& vs;
723  std::string type;
724  float radius;
725  FloatVec& values;
726  std::vector<Curvature>& curvs;
727  };
728 
729  class mgxBase_EXPORT MeshSignalGradOp
730  {
731  public:
732  MeshSignalGradOp(const vvGraph& S, const VtxVec& vs, VtxFloatAttr &result);
733  void operator()(int i);
734 
735  private:
736  const vvGraph& S;
737  const VtxVec& vs;
738  float radius;
739  VtxFloatAttr& result;
740  };
741 
742 
743  class mgxBase_EXPORT MeshGaussianBlurOp
744  {
745  public:
746  MeshGaussianBlurOp(const vvGraph& S, const VtxVec& vs, float radius, VtxFloatAttr &result);
747  void operator()(int i);
748 
749  private:
750  const vvGraph& S;
751  const VtxVec& vs;
752  float radius;
753  VtxFloatAttr& result;
754  };
755 
756  class mgxBase_EXPORT MeshLocalMinimaOp
757  {
758  public:
759  MeshLocalMinimaOp(const vvGraph& S, const VtxVec& vs, float radius, int startLabel, bool overwrite);
760  void operator()(int i);
761 
762  private:
763  const vvGraph& S;
764  const VtxVec& vs;
765  float radius;
766  int label;
767  bool overwrite;
768  };
769 
770  class mgxBase_EXPORT MeshNormalizeOp
771  {
772  public:
773  MeshNormalizeOp(const vvGraph& S, const VtxVec& vs, float radius, VtxFloatAttr &result);
774 
775  void operator()(int i);
776 
777  private:
778  const vvGraph& S;
779  const VtxVec& vs;
780  float radius;
781  VtxFloatAttr& result;
782  };
783 
784  class mgxBase_EXPORT MeshDilationOp
785  {
786  public:
787  MeshDilationOp(const vvGraph& S, const VtxVec& vs, float radius, VtxFloatAttr &result);
788  void operator()(int vi);
789 
790  private:
791  const vvGraph& S;
792  const VtxVec& vs;
793  float radius;
794  VtxFloatAttr& result;
795  };
796 
797  class mgxBase_EXPORT MeshLabelDilationOp
798  {
799  public:
800  MeshLabelDilationOp(const vvGraph& S, const VtxVec& vs, float radius, VtxIntAttr &result);
801  void operator()(int vi);
802 
803  private:
804  const vvGraph& S;
805  const VtxVec& vs;
806  float radius;
807  VtxIntAttr& result;
808  };
809 
810  class mgxBase_EXPORT MeshErosionOp
811  {
812  public:
813  MeshErosionOp(const vvGraph& S, const VtxVec& vs, float radius, VtxFloatAttr &result);
814  void operator()(int vi);
815 
816  private:
817  const vvGraph& S;
818  const VtxVec& vs;
819  float radius;
820  VtxFloatAttr& result;
821  };
822 
823  class mgxBase_EXPORT MeshLabelErosionOp
824  {
825  public:
826  MeshLabelErosionOp(const vvGraph& S, const VtxVec& vs, float radius, VtxIntAttr &result);
827  void operator()(int vi);
828 
829  private:
830  const vvGraph& S;
831  const VtxVec& vs;
832  float radius;
833  VtxIntAttr& result;
834  };
835 
836 
837  class mgxBase_EXPORT MeshCircularHistogram : public Process
838  {
839  public:
840  MeshCircularHistogram(const Process& process) : Process(process)
841  {
842  setName("Mesh/Signal/Export Histogram Circular");
843  setDesc("Computes a circular histogram in counter-clockwise direction of the active main store signal values around the given cartesian axis.");
844  setIcon(QIcon(":/images/StackHistoCirc.png"));
845 
846  addParm("Central Axis","Central Axis","Z", QStringList() << "X" << "Y" << "Z");
847  addParm("Bin Number","Number of bins for the whole circle","360");
848  addParm("Value Threshold (%)","Ignore voxels with values lower than this threshold (% from max value). Set to 0 to include all","1.0");
849  addParm("Distance Min (um)","Only consider voxels with a minimum distance to the Bezier larger than this. Set to -1 to include all.","-1");
850  addParm("Distance Max (um)","Only consider voxels with a maximum distance to the Bezier smaller than this. Set to -1 to include all.","-1");
851  addParm("Align at Max","Align at Max","No", QStringList() << "Align at Max of Signal Sum" << "Align at Signal Max" << "No");
852  addParm("Weight by Area","Weight signal values by the triangle area","Yes",booleanChoice());
853  addParm("Filename","Filename","");
854  addParm("Set Mesh Labels to Bin","Set Mesh Labels to Bin","No",booleanChoice());
855  }
856 
857  bool initialize(QWidget* parent);
858 
859  bool run()
860  {
861  Stack* s1 = currentStack();
862  Mesh* m1 = currentMesh();
863  return run(s1, m1, parm("Central Axis"), parm("Bin Number").toInt(), parm("Value Threshold (%)").toDouble(), parm("Distance Min (um)").toDouble(),
864  parm("Distance Max (um)").toDouble(), parm("Align at Max"), stringToBool(parm("Weight by Volume")), parm("Filename"), stringToBool(parm("Set Mesh Labels to Bin")));
865  }
866  bool run(Stack* s1, Mesh* m1, QString centralAxis, int binNumber, double thresholdValue, double minDis, double maxDis, QString align, bool weightVol, QString filename, bool writeLabels);
867 
868  };
869 
870 
871 }
872 
873 #endif
mgx::MeshOpening::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:621
mgx::MeshClosing
Definition: MeshProcessSignal.hpp:580
mgx::ClearMeshSignal::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:244
mgx::ProjectSignal
Definition: MeshProcessSignal.hpp:76
mgx::MeshLabelErosion::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:562
mgx::uint
unsigned int uint
Definition: Geometry.hpp:41
mgx::MeshLabelErosion
Definition: MeshProcessSignal.hpp:550
Process.hpp
mgx::SmoothMeshSignal::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:189
mgx::MeshNormalize::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:439
mgx::VtxVec
std::vector< vertex > VtxVec
Vector of vertices.
Definition: Types.hpp:135
mgx::MeshErosion::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:532
mgx::MeshBrightness
Definition: MeshProcessSignal.hpp:205
mgx::RescaleSignal::RescaleSignal
RescaleSignal(const Process &process)
Definition: MeshProcessSignal.hpp:635
mgx::MeshLocalMinima::MeshLocalMinima
MeshLocalMinima(const Process &process)
Definition: MeshProcessSignal.hpp:401
mgx::MeshBrightness::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:216
mgx::ProjectCurvature
Definition: MeshProcessSignal.hpp:261
mgx::MeshLabelDilationOp
Definition: MeshProcessSignal.hpp:797
mgx::SetSignalProcess::SetSignalProcess
SetSignalProcess(const Process &process)
Definition: MeshProcessSignal.hpp:680
mgx::MeshLocalMinima
Definition: MeshProcessSignal.hpp:398
mgx::MeshGaussianBlurOp
Definition: MeshProcessSignal.hpp:743
mgx::MeshDilationOp
Definition: MeshProcessSignal.hpp:784
mgx::HVecUS
thrust::host_vector< ushort > HVecUS
Definition: CudaExport.hpp:23
mgx::SmoothMeshSignal::SmoothMeshSignal
SmoothMeshSignal(const Process &process)
Definition: MeshProcessSignal.hpp:180
mgx::SetSignalProcess
Definition: MeshProcessSignal.hpp:677
mgx::MeshCircularHistogram::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:859
mgx::MeshCircularHistogram
Definition: MeshProcessSignal.hpp:837
mgx::MeshErosion
Definition: MeshProcessSignal.hpp:520
mgx::MeshDilation::MeshDilation
MeshDilation(const Process &process)
Definition: MeshProcessSignal.hpp:461
mgx::MeshLabelDilation::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:500
mgx::Stack::main
const Store * main() const
Access the main store.
Definition: Stack.hpp:82
mgx::MeshNormalize::MeshNormalize
MeshNormalize(const Process &process)
Definition: MeshProcessSignal.hpp:430
mgx::MeshLabelDilation::MeshLabelDilation
MeshLabelDilation(const Process &process)
Definition: MeshProcessSignal.hpp:491
mgx::ProjectSignal::ProjectSignal
ProjectSignal(const Process &process)
Definition: MeshProcessSignal.hpp:79
mgx::ProjectLabel
Definition: MeshProcessSignal.hpp:112
mgx::MeshNormalize
\claass MeshNormalize ProcessSignal.hpp <MeshProcessSignal.hpp>
Definition: MeshProcessSignal.hpp:427
mgx::Stack
Definition: Stack.hpp:33
mgx::MeshNormalizeOp
Definition: MeshProcessSignal.hpp:770
mgx
Distributed matrix library.
Definition: Assert.hpp:26
mgx::ProjectLabelsOnMesh::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:158
mgx::ClearMeshSignal::ClearMeshSignal
ClearMeshSignal(const Process &process)
Definition: MeshProcessSignal.hpp:235
mgx::ProjectLabel::ProjectLabel
ProjectLabel(const Process &process)
Definition: MeshProcessSignal.hpp:115
mgx::ProjectLabel::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:128
mgx::ProjectLabelsOnMesh::ProjectLabelsOnMesh
ProjectLabelsOnMesh(const Process &process)
Definition: MeshProcessSignal.hpp:148
mgx::SetSignalProcess::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:692
mgx::MeshDilation::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:470
mgx::ViewMeshProcess::ViewMeshProcess
ViewMeshProcess(const Process &process)
Definition: MeshProcessSignal.hpp:37
mgx::Process
Definition: Process.hpp:219
mgx::RescaleSignal::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:651
mgx::MeshClosing::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:592
mgx::MeshSignalGrad::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:323
mgx::stringToBool
mgx_EXPORT bool stringToBool(const QString &string)
Helper function converting a string into a boolean.
mgx::MeshLabelErosion::MeshLabelErosion
MeshLabelErosion(const Process &process)
Definition: MeshProcessSignal.hpp:553
mgx::FloatVec
std::vector< float > FloatVec
Vector of floats.
Definition: Types.hpp:82
mgx::ClearMeshSignal
Definition: MeshProcessSignal.hpp:232
mgx::MeshErosion::MeshErosion
MeshErosion(const Process &process)
Definition: MeshProcessSignal.hpp:523
mgx::MeshDiffGaussians::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:382
mgx::ProjectSignal::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:92
mgx::MeshSignalGrad
Definition: MeshProcessSignal.hpp:311
mgx::MeshClosing::MeshClosing
MeshClosing(const Process &process)
Definition: MeshProcessSignal.hpp:583
mgx::MeshLocalMinima::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:411
mgx::Mesh
Definition: Mesh.hpp:54
mgx::MeshOpening
Definition: MeshProcessSignal.hpp:609
mgx::SmoothMeshSignal
Definition: MeshProcessSignal.hpp:177
mgx::ProjectCurvatureOp
Definition: MeshProcessSignal.hpp:713
mgx::MeshDilation
Definition: MeshProcessSignal.hpp:458
mgx::MeshSignalGradOp
Definition: MeshProcessSignal.hpp:729
mgx::Vector
Namespace containing all the utility classes.
Definition: Vector.hpp:48
mgx::IntHVec3UMap
std::map< int, HVec3U > IntHVec3UMap
Definition: MeshProcessSignal.hpp:22
mgx::MeshDiffGaussians::MeshDiffGaussians
MeshDiffGaussians(const Process &process)
Definition: MeshProcessSignal.hpp:372
mgx::ViewMeshProcess
Definition: MeshProcessSignal.hpp:34
mgx::MeshSignalGrad::MeshSignalGrad
MeshSignalGrad(const Process &process)
Definition: MeshProcessSignal.hpp:314
mgx::MeshGaussianBlur
Definition: MeshProcessSignal.hpp:341
mgx::MeshLocalMinimaOp
Definition: MeshProcessSignal.hpp:756
mgx::MeshGaussianBlur::MeshGaussianBlur
MeshGaussianBlur(const Process &process)
Definition: MeshProcessSignal.hpp:344
Curvature.hpp
mgx::MeshLabelErosionOp
Definition: MeshProcessSignal.hpp:823
mgx::MeshGaussianBlur::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:353
mgx::VVGraph< VertexData, EdgeData >
mgx::MeshOpening::MeshOpening
MeshOpening(const Process &process)
Definition: MeshProcessSignal.hpp:612
mgx::ProjectCurvature::ProjectCurvature
ProjectCurvature(const Process &process)
Definition: MeshProcessSignal.hpp:264
mgx::ProjectLabelsOnMesh
Definition: MeshProcessSignal.hpp:145
mgx::ProjectCurvature::run
bool run()
Runs the process.
Definition: MeshProcessSignal.hpp:279
mgx::MeshLabelDilation
Definition: MeshProcessSignal.hpp:488
mgx::MeshBrightness::MeshBrightness
MeshBrightness(const Process &process)
Definition: MeshProcessSignal.hpp:207
mgx::MeshCircularHistogram::MeshCircularHistogram
MeshCircularHistogram(const Process &process)
Definition: MeshProcessSignal.hpp:840
mgx::MeshDiffGaussians
Definition: MeshProcessSignal.hpp:369
mgx::RescaleSignal
Definition: MeshProcessSignal.hpp:632
mgx::AttrMap
Attribute map wraps std::map.
Definition: Attributes.hpp:686
mgx::MeshErosionOp
Definition: MeshProcessSignal.hpp:810
mgx::Vertex
Definition: Vertex.hpp:58
mgx::calcSignalBounds
Point2f calcSignalBounds(const vvGraph &S)
mgx::Store
Definition: Store.hpp:33