2016-03-25 12 views
0

Ich bin neu zu VTK und versuche, den Dice Similarity Coefficient (DSC) zu berechnen, ausgehend von 2 Maschen. DSC kann als 2 Vab/(Va + Vb) berechnet werden, wobei die Überlappungs Vab Volumen unter mesh A und B. NetzVTK/ITK Würfel Ähnlichkeitskoeffizient auf Meshes

ein Netz lesen ich folgenden Schnipsel verwenden (dh eine Organ Kontur in .vtk Format 3D Slicer, https://www.slicer.org exportiert) :

string inputFilename1 = "organ1.vtk"; 

// Get all data from the file 
vtkSmartPointer<vtkGenericDataObjectReader> reader1 = vtkSmartPointer<vtkGenericDataObjectReader>::New(); 
reader1->SetFileName(inputFilename1.c_str()); 
reader1->Update(); 

vtkSmartPointer<vtkPolyData> struct1 = reader1->GetPolyDataOutput(); 

ich die Lautstärke der beiden Maschen berechnen kann mit vtkMassProperties (obwohl ich einige Unterschiede zwischen denen, mit VTK und diejenigen, berechnet mit 3D-Slicer berechnet beobachtet).

Um dann 2 Meshes zu schneiden, versuche ich vtkIntersectionPolyDataFilter zu verwenden. Die Ausgabe dieses Filters ist jedoch eine Reihe von Linien, die den Schnittpunkt der Eingabeobjekte vtkPolyData und KEINE geschlossene Oberfläche markieren. Ich muss daher irgendwie ein Netz aus diesen Linien generieren und sein Volumen berechnen.

Wissen Sie, welches eine gute, genaue Möglichkeit ist, ein solches Netz zu erzeugen und wie man es macht?


Alternativ habe ich versucht, ITK als auch zu verwenden. Ich habe ein Paket gefunden, das dieses Problem behandeln soll (http://www.insight-journal.org/browse/publication/762, 2010), aber ich kann es nicht mit der neuesten Version von ITK kompilieren. Es besagt, dass ITK mit dem (jetzt veralteten) ITK_USE_REVIEW Flag ON kompiliert werden muss. Unnötig zu sagen, ich kompilierte es mit der neuen Module_ITKReview auf ON eingestellt und auch mit Abwärtskompatibilität hatte aber kein Glück.

Schließlich, wenn Sie andere alternative (skriptfähige) Software/Bibliothek haben, um dieses Problem zu lösen, lassen Sie es mich bitte wissen. Ich muss diese Berechnung automatisch durchführen.

+0

Würfelüberlappung wird normalerweise mit Bildern verwendet. Wenn Sie zwei Meshes vergleichen möchten, warum verwenden Sie einfach Distanzmetrik, z. Verwenden von 'vtkDistancePolyDataFilter'? – mirni

+0

@mirni Der Dice Similarity Coefficient wird meines Wissens in der Literatur für medizinische Bildgebung verwendet. Insbesondere wird es von mehreren strahlentherapiebezogenen Arbeiten verwendet, auf denen ich meine Forschung gründe. Ich werde auch andere Metriken in Betracht ziehen: Danke für deinen Rat :) –

Antwort

1

könnten Sie versuchen, vtkBooleanOperationPolyDataFilter

http://www.vtk.org/doc/nightly/html/classvtkBooleanOperationPolyDataFilter.html

filter->SetOperationToIntersection(); 

, wenn Ihre Daten glatt und gut erzogene, dieser Filter ziemlich gut funktioniert. Jedoch können scharfe Strukturen, z.B. diejenigen, die aus dem binären Bildmarschwürfel-Algorithmus stammen, können ein Problem für sie darstellen. Das heißt, vtkPolyDataToImageStencil führt in dieser Hinsicht nicht unbedingt besser.

Ich hatte einmal Eindruck, dass die boolesche Operation auf Polygonen nicht wirklich ideal für "Organe" der Größe 100k Polygone und mehr ist. Hängt davon ab.

+0

Es funktioniert. Vielen Dank. –

0

Wenn Sie einen Dice Similarity Coefficient berechnen möchten, rate ich Ihnen, zunächst Volumes (Rasterize) aus den Meshes mit vtkPolyDataToImageStencil zu erzeugen. Dann ist es einfach, die DSC zu berechnen.

Viel Glück :)

+0

Hallo Simon, kannst du bitte deine Antwort ausarbeiten? Warum ist die Verwendung von ImageStencil eine gute Idee? Ich kann bereits Volumes für die Startnetze mit 'vtkMassProperties' berechnen. –

+1

Nun, nur weil ich denke, dass es schwierig ist, eine geschlossene Kreuzung zwischen zwei Meshes zu bekommen, zumindest mit VTK, also würde ich mit Bildern gehen, da es einfacher und direkter für mich scheint. Aber vielleicht kennt jemand einen Weg, nur mit Meshes zu tun, was Sie wollen. –

+0

Das ist genau der Grund, warum ich vorgeschlagen habe, dass DSC eine unangemessene Metrik sein könnte, da Ihre Daten nicht volumetrisch sind. Ich würde eine Entfernungsmetrik verwenden, z. mittlerer Abstand einer Oberfläche zur anderen Oberfläche. Es gibt 'vtkDistancePolyDataFilter', die dies für Sie tun und Sie würden keine Fehler einführen, weil Sie Ihre Meshes in Volumes schablonieren. – mirni

Verwandte Themen