2016-03-29 13 views
0

Ich versuche, mit den Bibliotheken von ITK eine Pipeline für die Bildsegmentierung zu erstellen. Aber wenn ich das ItkMorphologicalWatershedFromMarkersFilter anwende, ist das Ergebnis ein leeres Bild (binäres Bild mit nur 1en).Morphologische Wasserscheide von Markern Filter auf ITK

Kann jemand diesen Filter richtig anwenden?

Mein Eingabebild sollte der Gradient eines Bildes sein, und das Markierungsbild sollte das Ergebnis der Anwendung eines Wasserscheidenfilters auf demselben Bild sein.

Eingang image

Marker image

Und dies ist die Erklärung und die Anwendung des Filters:

typedef itk::MorphologicalWatershedFromMarkersImageFilter < OutputImageType, OutputImageType > 
     MorphologicalWatershedFromMarkersImageFilterType; 

MorphologicalWatershedFromMarkersImageFilterType::Pointer CwatershedFilter 
     = MorphologicalWatershedFromMarkersImageFilterType::New(); 


CwatershedFilter->SetInput1(reader1->GetOutput()); 
CwatershedFilter->SetMarkerImage(reader2->GetOutput()); 

CwatershedFilter->SetMarkWatershedLine(true); 

try{ 

    CwatershedFilter->Update(); 

} 
catch (itk::ExceptionObject & error) 
{ 
    std::cerr << "Error: " << error << std::endl; 
    getchar(); 
    return EXIT_FAILURE; 
} 

Auch dies ist der Link zu der Dokumentation dieses Filters von itk .org:

http://www.itk.org/Doxygen48/html/classitk_1_1MorphologicalWatershedFromMarkersImageFilter.html#a20e3b8de42219606ba759e822be0aaa2

Vielen Dank !!

+0

Es wäre hilfreich, wenn Sie relevanten Code eingefügt hätten. – siavashk

+0

Da ist der Code. Ich weiß nicht, ob es helfen würde, aber ich habe auch den Link zur Dokumentation des Filters eingefügt. –

+0

Wenn Sie Ihren Code mit einem einfacheren Bild füttern, funktioniert der Filter? Versuchen Sie beispielsweise, ein schwarzes Bild mit einem weißen Quadrat in der Mitte als Eingabe festzulegen und festzustellen, ob Ihr Code das richtige Ergebnis liefert. Dies wird helfen festzustellen, ob das Problem mit dem Code oder der Eingabe ist. – siavashk

Antwort

0

Während nicht C++ ITK, gibt es eine SimpleITK Notebooks, die es Nutzung demonstriert:

http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/32_Watersheds_Segmentation.html

Ihr Markierungsbild nur binär ist, und kein Label Bild. Damit meine ich, dass Ihr Bild nur 0 und 1 (oder 255) ist. Im verknüpft Beispiel ist folgendes zu beachten:

min_img = sitk.RegionalMinima(feature_img, backgroundValue=0, foregroundValue=1.0, fullyConnected=False, flatIsMinima=True) 
marker_img = sitk.ConnectedComponent(min_img, fullyConnected=False) 

Die „min_img“ ist ein binäres Bild, aber dann wird das Bild mit dem „ConnectedComponent“ Bildfilter verarbeitet, die jede „Insel“ eine eindeutige Nummer gibt. Dies wird für das Marker- (oder Label-) Bild für den WatershedFromMarker-Filter erwartet.

Ich werde auch feststellen, dass Ihr Eingangsbild einige Grenzlinien hat, die Sie nicht als Eingabe möchten.

+0

danke für dieses Beispiel. Meine Funktion ist der Farbverlauf des Originals. Und das Markerbild ist ein Binärbild mit einer gewissen Vorverarbeitung. –

+0

Ich bearbeitet die Frage für eine bessere Sicht auf die Bilder –

+0

Also sollte mein Eingabebild keine Grenzlinien haben? Aber wie kann ich diese Zeilen entfernen? Oder welches Bild soll ich verwenden? Das Original RGB oder die Graustufen? Das habe ich nicht verstanden. Vielen Dank für die Hilfe! –