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

Bill Lorensen bill.lorensen at gmail.com
Fri Aug 2 16:50:28 EDT 2013


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.



On Fri, Aug 2, 2013 at 4:30 PM, Bill Lorensen <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> 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>
>>> >>
>>>
>>> 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>
>>> >>>
>>>
>>>         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>
>>>
>>>     ______________________________**___________________
>>>     Powered by 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
>>
>
>
>
> --
> Unpaid intern in BillsBasement at noware dot com
>



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


More information about the vtkusers mailing list