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

Dr. Roman Grothausmann grothausmann.roman at mh-hannover.de
Fri Aug 2 16:59:06 EDT 2013


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>> 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>> 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>>>
>
>             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>>>>
>
>                      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>
>
>                  ___________________________________________________
>                  Powered by 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>>
>
>                  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>>
>
>
>                  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>>
>
>
>
>
>             --
>             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
>
>
>
>
> --
> 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