[vtkusers] avoiding/removing non-manifold parts from the result of vtkMarchingCubes

Dr. Roman Grothausmann grothausmann.roman at mh-hannover.de
Mon Aug 5 01:44:23 EDT 2013


On 02/08/13 23:14, Bill Lorensen wrote:
> vtkDiscreteMarchingCubes should be used for segmented data. vtkMarchingCubes for
> "continuous" data.
>
> In your case, a medical dataset, it is unusual to have 8 bit data. Most medical
> data (e.g. DICOM) is 16 bit.

Well, it is preprocessed med. data. Originally it is 16bit but we have to 
segment it semi-manually with itksnap, so we end up with a binary image (either 
0 or 255). As we have a certain uncertainty in the borders of the segmentation 
and some segmentation border voxels with e.g. 2 adjacent bg voxels, a mean or 
gauss filter is applied which yields the "continous" data. Applying 
vtkMarchingCubes at level 127 gives a surface much smoother than using either 
itkAntiAliasBinaryImageFilter or vtkWindowedSincFilter afterwards.

Still, I wonder what causes the smoothness of vtkMarchingCubes surface. If I 
understand it correctly, vtkDiscreteMarchingCubes (despite its 256 mc-cases) 
only creates triangles whose normals can point in only 26 discrete orientations. 
vtkMarchingCubes on a binary image (containing only values of 0 or 255) seems to 
generate the same surface using a level of 127. Now if I have "continuous" data, 
vtkMarchingCubes seems to generate triangles oriented in far more than 26 
discrete directions. Are the triangle orientations of the 256 mc-cases adjusted 
to point in the direction of the image-gradient in a second step of 
vtkMarchingCubes? Are the cube-contour intersection positions of the 256 
mc-cases adjusted as well, i.e. not restricted any more to intersect the cube 
edges in the middle of the edge?


>
>
> On Fri, Aug 2, 2013 at 4:59 PM, Dr. Roman Grothausmann
> <grothausmann.roman at mh-hannover.de <mailto:grothausmann.roman at mh-hannover.de>>
> wrote:
>
>     On 02/08/13 22:50, Bill Lorensen wrote:
>
>
>         Since your data is unsigned char, and you used an isovalue of 127, I suspect
>         there must be some degenerate triangles produced. I did produce two
>         nonmanifold
>         edges with isovalue 127 (I'm surprised).
>
>         Try specifying a non-integral value (e.g. 127.001). I do not see
>         non-manifold
>         edges with that value.
>
>
>
>     I will. Many thanks for the solution.
>     What should I read to understand that a non-integral value circumvents the
>     problem (and that an integral value causes it)?
>     Also I've searched long for an explanation what causes the difference
>     concerning surface smoothness using vtkMarchingCubes on a binary image or
>     one that has a gradient (understanding that that allows to calculate normals
>     pointing in more than 26 directions) simply created with a mean-filer on the
>     binary image. Is there a kind of additional internal filter that only is
>     applied if the input has gradients?
>
>     Many thanks Bill for looking into this.
>     Roman
>
>         On Fri, Aug 2, 2013 at 4:30 PM, Bill Lorensen <bill.lorensen at gmail.com
>         <mailto:bill.lorensen at gmail.com>
>         <mailto:bill.lorensen at gmail.__com <mailto:bill.lorensen at gmail.com>>> wrote:
>
>              Great. I generated a surface. It will take be a few minutes to generate
>              feature edges.
>
>
>
>              On Fri, Aug 2, 2013 at 4:25 PM, Dr. Roman Grothausmann
>         <grothausmann.roman at mh-__hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>
>         <mailto:grothausmann.roman at mh-__hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>>> wrote:
>
>                  On 02/08/13 22:20, Bill Lorensen wrote:
>
>                      what level do you use?
>
>
>                  Sorry, forgot to mention that: level 127
>
>
>
>
>                      On Fri, Aug 2, 2013 at 4:07 PM, Dr. Roman Grothausmann
>         <grothausmann.roman at mh-____hannover.de
>         <mailto:grothausmann.roman at mh-__hannover.de>
>         <mailto:grothausmann.roman at mh-__hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>>
>         <mailto:grothausmann.roman at mh-____hannover.de
>         <mailto:grothausmann.roman at mh-__hannover.de>
>         <mailto:grothausmann.roman at mh-__hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>>>>
>
>                      wrote:
>
>                           On 02/08/13 16:06, Bill Lorensen wrote:
>
>                               Marching Cubes should not generate non-manifold
>         surfaces.
>                      The offending
>                               triangle
>                               looks suspicious. What does the rest of your
>         pipeline look
>                      like?
>
>
>                           Thanks Bill for looking into this. I get the very same
>         output
>                      using paraview
>                           and its contour filter when ticking "Generate
>         Triangles" or using
>                           vmtkmarchingcubes (which seems to use only
>         vtkMarchingCubes in
>                           vmtkmarchingcubes.py). To check it trice I used the simple
>                      program below and
>                           got the same output again. Only paraview and its
>         contour filter
>                      without
>                           ticking "Generate Triangles" yields a different result.
>
>                           _____________________________
>
>                           #include <vtkSmartPointer.h>
>                           #include <vtkMetaImageReader.h>
>                           //#include <vtkImageConstantPad.h>
>                           #include <vtkMarchingCubes.h>
>                           #include <vtkXMLPolyDataWriter.h>//for vtp-files
>
>                           #include <vtkCallbackCommand.h>
>                           #include <vtkCommand.h>
>
>
>                           void ProgressFunction ( vtkObject* caller, long
>         unsigned int
>                      eventId, void*
>                           clientData, void* callData )
>                                 {
>
>                                 vtkAlgorithm *d=
>         static_cast<vtkAlgorithm*>(______caller);
>
>
>                                 fprintf(stderr, "\rFilter progress: %5.1f%%",
>         100.0 *
>                      d->GetProgress());
>                                 std::cerr.flush();
>
>                                 }
>
>                           int main(int argc, char* argv[]){
>                                 if( argc != 5 )
>                                    {
>                                    std::cerr << "Usage: " << argv[0];
>                                    std::cerr << " inputImage";
>                                    std::cerr << " outputMesh";
>                                    std::cerr << " level normals";
>                                    std::cerr << std::endl;
>                                    return EXIT_FAILURE;
>                                    }
>
>                                 if(!(strcasestr(argv[1],".mhd"______))) {
>
>
>                                    std::cout << "The input should end with .mhd" <<
>                      std::endl;
>                                    return -1;
>                                    }
>
>                                 if(!(strcasestr(argv[2],".vtp"______))) {
>
>
>                                    std::cout << "The input should end with .vtp" <<
>                      std::endl;
>                                    return -1;
>                                    }
>
>                                 vtkSmartPointer<______vtkCallbackCommand>
>         progressCallback =
>                           vtkSmartPointer<______vtkCallbackCommand>::New();
>
>           progressCallback->SetCallback(______ProgressFunction);
>
>                                 vtkSmartPointer<______vtkMetaImageReader> reader =
>
>           vtkSmartPointer<______vtkMetaImageReader>::New();
>
>
>
>                                 reader->SetFileName(argv[1]);
>                                 reader->Update();
>
>                                 vtkSmartPointer<______vtkMarchingCubes> mc=
>                           vtkSmartPointer<______vtkMarchingCubes>::New();
>
>
>           mc->SetInputConnection(reader-______>GetOutputPort());
>
>
>                                 mc->SetValue(0, atof(argv[3]));
>                                 //mc->ComputeNormalsOn();
>                                 mc->SetComputeNormals(atoi(______argv[4]));
>
>
>                                 //mc->ComputeGradientsOn();
>                                 //mc->ComputeScalarsOn();
>                                 std::cout << "Executing discrete marching
>         cubes..." <<
>                      std::endl;
>                                 mc->AddObserver(vtkCommand::______ProgressEvent,
>
>                      progressCallback);
>
>                                 mc->Update();
>                                 std::cout << std::endl << "done." << std::endl;
>
>                                 vtkSmartPointer<______vtkXMLPolyDataWriter>
>         Pwriter =
>                           vtkSmartPointer<______vtkXMLPolyDataWriter>::New();
>                                 Pwriter->SetFileName(argv[2]);
>
>           Pwriter->SetInputConnection(______mc->GetOutputPort());
>
>
>
>                                 Pwriter->Update();
>
>                                 return EXIT_SUCCESS;
>                                 }
>
>
>
>
>
>                               On Fri, Aug 2, 2013 at 8:23 AM, Dr. Roman Grothausmann
>         <grothausmann.roman at mh-______hannover.de
>         <mailto:grothausmann.roman at mh-____hannover.de>
>         <mailto:grothausmann.roman at mh-____hannover.de
>         <mailto:grothausmann.roman at mh-__hannover.de>>
>         <mailto:grothausmann.roman at mh-____hannover.de
>         <mailto:grothausmann.roman at mh-__hannover.de>
>         <mailto:grothausmann.roman at mh-__hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>>>
>         <mailto:grothausmann.roman at mh-______hannover.de
>         <mailto:grothausmann.roman at mh-____hannover.de>
>         <mailto:grothausmann.roman at mh-____hannover.de
>         <mailto:grothausmann.roman at mh-__hannover.de>>
>
>
>         <mailto:grothausmann.roman at mh-____hannover.de
>         <mailto:grothausmann.roman at mh-__hannover.de>
>         <mailto:grothausmann.roman at mh-__hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>>>>>
>
>                               wrote:
>
>                                    Dear mailing list members,
>
>
>                                    Recently, I came across a voxel-dataset that when
>                      meshed with
>                                    vtkMarchingCubes results in a mesh that contains
>                      non-manifold edges
>                               (magenta
>                                    line in attached image).
>                                    How can this be avoided?
>                                    Using paraview's contour filter and switching off
>         "Generate Triangles"
>                                    creates a slightly different surface mesh
>         that does
>                      not contain
>                               non-manifold
>                                    edges. However vtkMarchingCubes does not seem
>         to have
>                      any option
>                               concerning
>                                    triangulation.
>                                    What filter/option do I have to use to get
>         the same
>                      result just
>                               with pure VTK?
>
>                                    As a workaround: Is it possible to split the
>         mesh at
>                      non-manifold
>                               edges?
>                                    vtkIntersectionPolyDataFilter sounds
>         promising but
>                      seems to need
>                               surfaces
>                                    not just the edges.
>
>                                    Any help or hints are very much appreciated
>                                    Roman
>
>
>
>                               --
>                               Unpaid intern in BillsBasement at noware dot com
>
>
>                           --
>                           Dr. Roman Grothausmann
>
>                           Tomographie und Digitale Bildverarbeitung
>                           Tomography and Digital Image Analysis
>
>                           Institut für Funktionelle und Angewandte Anatomie, OE 4120
>                           Medizinische Hochschule Hannover
>                           Carl-Neuberg-Str. 1
>                           D-30625 Hannover
>
>                           Tel. +49 511 532-9574 <tel:%2B49%20511%20532-9574>
>         <tel:%2B49%20511%20532-9574>
>         <tel:%2B49%20511%20532-9574>
>
>                           _____________________________________________________
>
>                           Powered by www.kitware.com <http://www.kitware.com>
>         <http://www.kitware.com>
>         <http://www.kitware.com>
>
>
>                           Visit other Kitware open-source projects at
>         http://www.kitware.com/______opensource/opensource.html
>         <http://www.kitware.com/____opensource/opensource.html>
>         <http://www.kitware.com/____opensource/opensource.html
>         <http://www.kitware.com/__opensource/opensource.html>>
>
>
>         <http://www.kitware.com/____opensource/opensource.html
>         <http://www.kitware.com/__opensource/opensource.html>
>         <http://www.kitware.com/__opensource/opensource.html
>         <http://www.kitware.com/opensource/opensource.html>>>
>
>                           Please keep messages on-topic and check the VTK FAQ at:
>         http://www.vtk.org/Wiki/VTK_______FAQ <http://www.vtk.org/Wiki/VTK_____FAQ>
>         <http://www.vtk.org/Wiki/VTK_____FAQ <http://www.vtk.org/Wiki/VTK___FAQ>>
>
>         <http://www.vtk.org/Wiki/VTK_____FAQ <http://www.vtk.org/Wiki/VTK___FAQ>
>         <http://www.vtk.org/Wiki/VTK___FAQ <http://www.vtk.org/Wiki/VTK_FAQ>>>
>
>
>                           Follow this link to subscribe/unsubscribe:
>         http://www.vtk.org/mailman/______listinfo/vtkusers
>         <http://www.vtk.org/mailman/____listinfo/vtkusers>
>         <http://www.vtk.org/mailman/____listinfo/vtkusers
>         <http://www.vtk.org/mailman/__listinfo/vtkusers>>
>
>
>         <http://www.vtk.org/mailman/____listinfo/vtkusers
>         <http://www.vtk.org/mailman/__listinfo/vtkusers>
>         <http://www.vtk.org/mailman/__listinfo/vtkusers
>         <http://www.vtk.org/mailman/listinfo/vtkusers>>>
>
>
>
>
>                      --
>                      Unpaid intern in BillsBasement at noware dot com
>
>
>                  --
>                  Dr. Roman Grothausmann
>
>                  Tomographie und Digitale Bildverarbeitung
>                  Tomography and Digital Image Analysis
>
>                  Institut für Funktionelle und Angewandte Anatomie, OE 4120
>                  Medizinische Hochschule Hannover
>                  Carl-Neuberg-Str. 1
>                  D-30625 Hannover
>
>                  Tel. +49 511 532-9574 <tel:%2B49%20511%20532-9574>
>         <tel:%2B49%20511%20532-9574>
>
>
>
>
>
>              --
>              Unpaid intern in BillsBasement at noware dot com
>
>
>
>
>         --
>         Unpaid intern in BillsBasement at noware dot com
>
>
>     --
>     Dr. Roman Grothausmann
>
>     Tomographie und Digitale Bildverarbeitung
>     Tomography and Digital Image Analysis
>
>     Institut für Funktionelle und Angewandte Anatomie, OE 4120
>     Medizinische Hochschule Hannover
>     Carl-Neuberg-Str. 1
>     D-30625 Hannover
>
>     Tel. +49 511 532-9574 <tel:%2B49%20511%20532-9574>
>
>
>
>
> --
> Unpaid intern in BillsBasement at noware dot com

-- 
Dr. Roman Grothausmann

Tomographie und Digitale Bildverarbeitung
Tomography and Digital Image Analysis

Institut für Funktionelle und Angewandte Anatomie, OE 4120
Medizinische Hochschule Hannover
Carl-Neuberg-Str. 1
D-30625 Hannover

Tel. +49 511 532-9574



More information about the vtkusers mailing list