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

Bill Lorensen bill.lorensen at gmail.com
Fri Aug 2 17:14:03 EDT 2013


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.


On Fri, Aug 2, 2013 at 4:59 PM, Dr. Roman Grothausmann <
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 <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<grothausmann.roman at mh-hannover.de>
>>     <mailto:grothausmann.roman at mh-**hannover.de<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<grothausmann.roman at mh-__hannover.de>
>>             <mailto:grothausmann.roman at mh-**hannover.de<grothausmann.roman at mh-hannover.de>
>> >
>>             <mailto:grothausmann.roman at mh-**__hannover.de<grothausmann.roman at mh-__hannover.de>
>>             <mailto:grothausmann.roman at mh-**hannover.de<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<grothausmann.roman at mh-____hannover.de>
>>             <mailto:grothausmann.roman at mh-**__hannover.de<grothausmann.roman at mh-__hannover.de>
>> >
>>             <mailto:grothausmann.roman at mh-**__hannover.de<grothausmann.roman at mh-__hannover.de>
>>             <mailto:grothausmann.roman at mh-**hannover.de<grothausmann.roman at mh-hannover.de>
>> >>
>>             <mailto:grothausmann.roman at mh-**____hannover.de<grothausmann.roman at mh-____hannover.de>
>>             <mailto:grothausmann.roman at mh-**__hannover.de<grothausmann.roman at mh-__hannover.de>
>> >
>>
>>
>>             <mailto:grothausmann.roman at mh-**__hannover.de<grothausmann.roman at mh-__hannover.de>
>>             <mailto:grothausmann.roman at mh-**hannover.de<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>
>> >
>>
>>
>>             <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>
>>
>>
>>
>>
>>
>>     --
>>     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
>



-- 
Unpaid intern in BillsBasement at noware dot com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20130802/a7c9252f/attachment.htm>


More information about the vtkusers mailing list