Internal:PODM 3D
Documentation
Fall 2019
- Read PODM3D paper✔
- Read Guaranteed Quality Tetrahedral Delaunay Meshing for Medical Images paper (Sect. 9) (TODO)
- Write a proper README.md file✔
- Add the CNF Example Meshes into the Appendix of the November Report✔
- Create CNF Adaptivity Report
Spring 2020
- Create a User Manual for PODM 3D and Tessellate2D within the fields of Medical Image Computing and Computational Nuclear Femptography ✔
Execution Examples
Fall 2019
- Create meshes for the Computational Nuclear Femtography part of CRTC_I2M_Suite Documentation. CNF Example Meshes ✔
Spring 2020
- Create meshes for the Medical Image Computing part of CRTC_I2M_Suite Documentation. Medical Imaging Example Meshes ✔
Summer 2020
- Create meshes for the Bioinformatics part of CRTC_I2M_Suite Documentation. Bioinformatics Example Meshes ✔
Code
Fall 2019
- Restructure repository of PODM3D based on Software engineering standards✔
- Decouple Args from PODM✔
- Create setArguments function✔
- Create setInputImage(ImageType::Pointer)✔
- Remove IOs from PODM✔
- Implement a sizing function that will work as an extra rule and it will use the point indices of the tetrahedron that is tested✔
- Create UML diagrams to understand the code and the Meshing Procedure in general✔
- Create a list of functions that need to be modified to implement the extra Rule ✔
- Modify the created list (Extra Rule sizing Function list) of functions✔
- Create the following test sizing function to understand if modifications have been done correctly✔
bool checkSizingFunction(double coordinatesOfTetrahedron**) { double volume = volume(coordinatesOfTetrahedron); double* baryCenter = baryCenter(coordinatesOfTetrahedron) // if x axis <= 55 and volume of tetrahedron > 10 if (baryCenter[0] <= 55 && volume > 10) return true; else return false }
- Create the infrastructure to support Sizing Function pointer✔
- Incorporate Function Pointer to PODM by creating a setSizingFunction()✔
- Replace the test sizing function with the Adaptivity function that was created by Christos (The algorithm is described here)✔
- Understand that the current implementation supports negative weights✔
- Change the current implementation to use the minimum-maximum edge length of the element instead of its volume✔
- Identify an issue of checking sample points outside the image and solve it according to Christos's suggestions✔
- Separate the interface, the IOs and the filters from PODM✔
Spring 2020
- Create a general PODM driver✔
- Set a warning if delta > min-spacing * min-dimension-size / 5✔
- Set a default delta: ✔
- if sizing-function is off then default delta = min-spacing * min-dimension-size / 100 ✔
- if sizing-function is on then default delta = min-spacing * min-dimension-size / 20 ✔
- Remove labels array if there is only 1 label of interest ✔
- Print a warning if a label is not recovered✔
- Add Numa flag in CmakeLists.txt ✔
- Add binary file support ✔
- Improve Text output ✔
- Create label-filter to filter labels of images properly ✔
- Remove redundant volume threadhold checks that don't contribute anything to the meshing procedure ✔
Summer 2020
- Libraries:
- Update ITK to v5.1.0 ✔
- Update VTK to v9.0.1 ✔
- Remove Boost from PODM (preserve it only for CGAL) ✔
- Save the label of a cell after its creation and Remove the expensive label recalculation in GetCleanMesh/GetCleanMeshParallel✔
- Compute Mesh Results in Parallel (TODO)
- Compute Box, Resized image and surface in Parallel ✔
- Sizing function:
- Control min edge and max edge using a percentage of the diagonal ✔
- Find values of samples points using linear interpolation ✔
- Make Image segmentation use spacing and origin ✔
Fall 2020
- Handle CNF images with spacing different than 1✔
- Upgrade Image Segmentation ✔
- Upgrade Sizing function ✔
- Upgrade Linear Interpolation ✔
- Fix shift of origin if delta not multiple of the spacing ✔
- Fix IO_WRITING truncation error when loading box ✔
- Replace BBox with itkBoundingBox if possible (TODO)
- Set Absolute bounds of image (TODO)
- For Getlabel
- Implement TransformPhysicalPointToIndexWithBounds
- Replace TransformPhysicalPointToIndex with TransformPhysicalPointToIndexWithBounds
- Constrain bounds of mesh by editing GetLabel:
- Code Example of constraining using image's bounds✔
unsigned char GetLabel(const Attributes& attr, const Point& p) { IndexType pixel_index; if (attr.ResizedImage->TransformPhysicalPointToIndex({p[0], p[1], p[2]}, pixel_index) ) { if (!(pp[0] < this->initial_image_origin[0] || pp[0] > (this->initial_image_size[0] - 1.0) * this->initial_image_sp[0] + this->initial_image_origin[0] || pp[1] < this->initial_image_origin[1] || pp[1] > (this->initial_image_size[1] - 1.0) * this->initial_image_sp[1] + this->initial_image_origin[1] || pp[2] < this->initial_image_origin[2] || pp[2] > (this->initial_image_size[2] - 1.0) * this->initial_image_sp[2] + this->initial_image_origin[2])) { return attr.ResizedImage->GetPixel(pixel_index); } } return 0; }
- This is needed because TransformPhysicalPointToIndex truncates to the closest integer, and therefore it accepts +-0.5 values out of the boundary
- Code Example of constraining using image's bounds✔
- For everything else
- Implement TransformPhysicalPointToBoundedIndex
- Replace TransformPhysicalPointToIndex with TransformPhysicalPointToBoundedIndex
- For Getlabel
- Remeshing by using a mesh instead of an image as input and background mesh (TODO)
- Create upscale-image-filter (TODO)
- Replace CGAL Predicates with: (TODO)
- Predicates Construction Kit:
- Paper
- Code
- Benchmark: PCK vs CGAL Predicates Benchmark
- Note: see Geogram branch
- Adaptive Precision Floating-Point Arithmetic and Fast Robust Predicates for Computational Geometry:
- Predicates Construction Kit:
- Smoothing (TODO)
- CGAL Sources:
- PODM3D citations:
- Volume conserving smoothing for piecewise linear curves, surfaces, and triple lines
- An anisotropic scale-invariant unstructured mesh generator suitable for volumetric imaging data
- Variational generation of prismatic boundary-layer meshes for biomedical computing, International Journal for Numerical Methods
- Prof, Andrey Suggestions:
- Μultiple δ (TODO)
- Implement multiple δ (TODO)
- Use different δ values (possibly uniform based) according to the surface of each label of a segmented image (TODO)
- Produce the Voronoi Mesh out of the Delaunay (TODO)
- Check what TetGen does (TODO)
- Research conversion methods (TODO)