lungSegmentation.cpp source
#include <FAST/Tools/CommandLineParser.hpp> #include <FAST/Exporters/MetaImageExporter.hpp> #include <FAST/Exporters/VTKMeshFileExporter.hpp> #include <FAST/Algorithms/CenterlineExtraction/CenterlineExtraction.hpp> #include <FAST/Visualization/LineRenderer/LineRenderer.hpp> #include "FAST/Importers/ImageFileImporter.hpp" #include "FAST/Visualization/ImageRenderer/ImageRenderer.hpp" #include "FAST/Visualization/SegmentationRenderer/SegmentationRenderer.hpp" #include "FAST/Visualization/TriangleRenderer/TriangleRenderer.hpp" #include "FAST/Visualization/SimpleWindow.hpp" #include "FAST/Algorithms/SurfaceExtraction/SurfaceExtraction.hpp" #include "FAST/Algorithms/LungSegmentation/LungSegmentation.hpp" using namespace fast; int main(int argc, char** argv) { CommandLineParser parser("Lung segmentation", "Segments the lungs, airways and blood vessels"); parser.addPositionVariable(1, "input-filename", Config::getTestDataPath() + "CT/CT-Thorax.mhd"); parser.addVariable("airway-seed", false, "Manual seed point coordinate for airway segmentation --airway-seed x,y,z"); parser.addVariable("lung-seed", false, "Manual seed point coordinate for lung segmentation --lung-seed x,y,z"); parser.addVariable("output-path", false, "Save data to this path in mhd and vtk format"); parser.addOption("blood-vessel-centerline", "Extract centerline from blood vessels"); parser.parse(argc, argv); // Import image from file using the ImageFileImporter auto importer = ImageFileImporter::create(parser.get("input-filename")); // Perform lung segmentation (this will also extract the airways using AirwaySegmentation) Vector3i airwaySeedPoint = Vector3i::Zero(); Vector3i lungSeedPoint = Vector3i::Zero(); if(parser.gotValue("airway-seed")) airwaySeedPoint = parser.get<Vector3i>("airway-seed"); if(parser.gotValue("lung-seed")) lungSeedPoint = parser.get<Vector3i>("lung-seed"); auto segmentation = LungSegmentation::create(airwaySeedPoint, lungSeedPoint, true) ->connect(importer); auto centerline = CenterlineExtraction::create(); if(parser.getOption("blood-vessel-centerline")) { centerline->connect(segmentation, 2); centerline->getReporter().setGlobalReportMethod(Reporter::COUT); } if(parser.gotValue("output-path")) { auto exporter = MetaImageExporter::create(join(parser.get("output-path"), "vessel_segmentation.mhd")); exporter->connect(segmentation, 2); auto exporter2 = MetaImageExporter::create(join(parser.get("output-path"), "lung_segmentation.mhd")); exporter2->connect(segmentation, 0); auto exporter3 = MetaImageExporter::create(join(parser.get("output-path"), "airway_segmentation.mhd")); exporter3->connect(segmentation, 1); if(parser.getOption("blood-vessel-centerline")) { auto exporter2 = VTKMeshFileExporter::create(join(parser.get("output-path"), "centerline.vtk")); exporter2->connect(centerline); exporter2->run(); } exporter->run(); exporter2->run(); exporter3->run(); } else { // Extract lung surface auto extraction = SurfaceExtraction::create() ->connect(segmentation); // Extract airway surface auto extraction2 = SurfaceExtraction::create() ->connect(segmentation, 1); // Extract blood vessel auto extraction3 = SurfaceExtraction::create() ->connect(segmentation, 2); // Render both surfaces with different color auto renderer = TriangleRenderer::New(); renderer->addInputConnection(extraction->getOutputPort(), Color::Green(), 0.6f); renderer->addInputConnection(extraction2->getOutputPort(), Color::Red(), 1.0f); renderer->addInputConnection(extraction3->getOutputPort(), Color::Blue(), 1.0f); auto window = SimpleWindow3D::create()->connect(renderer); if(parser.getOption("blood-vessel-centerline")) { auto lineRenderer = LineRenderer::create(Color::Green(), 1.0, true) ->connect(centerline); window->addRenderer(lineRenderer); } #ifdef FAST_CONTINUOUS_INTEGRATION // This will automatically close the window after 5 seconds, used for CI testing window->setTimeout(5*1000); #endif window->run(); } }