37 #include <vtkImageImport.h>
38 #include <vtkImageData.h>
39 #include <vtkImageShiftScale.h>
40 #include <ctkPluginContext.h>
56 #include "FAST/Algorithms/AirwaySegmentation/AirwaySegmentation.hpp"
57 #include "FAST/Algorithms/CenterlineExtraction/CenterlineExtraction.hpp"
58 #include "FAST/Importers/ImageFileImporter.hpp"
59 #include "FAST/Exporters/VTKImageExporter.hpp"
60 #include "FAST/Exporters/VTKLineSetExporter.hpp"
61 #include "FAST/Data/Segmentation.hpp"
62 #include "FAST/SceneGraph.hpp"
74 return "Airway Segmentation Filter";
79 return "AirwaysFilter";
85 "<h3>Airway Segmentation.</h3>"
86 "<p><i>Extracts segmentation and centerline from a CT volume. If method fails, try to crop volume. </br>Algorithm written by Erik Smistad.</i></p>"
98 QString q_filename =
"";
99 QString activePatienFolder =
patientService()->getActivePatientFolder();
100 QString inputImageFileName = mInputImage->getFilename();
101 if(!activePatienFolder.isEmpty())
102 q_filename = activePatienFolder+
"/"+inputImageFileName;
104 q_filename = inputImageFileName;
106 std::string filename = q_filename.toStdString();
110 fast::DeviceManager::getInstance().setKernelRootPath(kernelDir.toStdString());
112 fast::ImageFileImporter::pointer importer = fast::ImageFileImporter::New();
113 importer->setFilename(filename);
117 fast::Image::pointer image = importer->getOutputData<fast::Image>();
120 fast::AirwaySegmentation::pointer segmentation = fast::AirwaySegmentation::New();
121 segmentation->setInputConnection(importer->getOutputPort());
124 vtkSmartPointer<fast::VTKImageExporter> vtkExporter = fast::VTKImageExporter::New();
125 vtkExporter->setInputConnection(segmentation->getOutputPort());
126 vtkExporter->Update();
127 mSegmentationOutput = vtkExporter->GetOutput();
131 fast::Segmentation::pointer segmentationData = segmentation->getOutputData<fast::Segmentation>(0);
134 Eigen::Affine3f T = fast::SceneGraph::getEigenAffineTransformationFromData(segmentationData);
135 mTransformation.matrix() = T.matrix().cast<
double>();
138 fast::CenterlineExtraction::pointer centerline = fast::CenterlineExtraction::New();
139 centerline->setInputConnection(segmentation->getOutputPort());
142 vtkSmartPointer<fast::VTKLineSetExporter> vtkCenterlineExporter = fast::VTKLineSetExporter::New();
143 vtkCenterlineExporter->setInputConnection(centerline->getOutputPort());
144 mCenterlineOutput = vtkCenterlineExporter->GetOutput();
145 vtkCenterlineExporter->Update();
147 }
catch(fast::Exception& e) {
148 std::string error = e.what();
152 }
catch(cl::Error& e) {
156 }
catch (std::exception& e){
161 reportError(
"Airway segmentation algorithm threw a unknown exception.");
170 if(!mSegmentationOutput)
173 std::cout <<
"POST PROCESS" << std::endl;
176 double threshold = 1;
195 contour->get_rMd_History()->setRegistration(mTransformation);
201 QString uid = mInputImage->getUid() +
"_centerline%1";
202 QString name = mInputImage->getName() +
" centerline%1";
205 centerline->get_rMd_History()->setParentSpace(mInputImage->getUid());
206 centerline->get_rMd_History()->setRegistration(mTransformation);
223 temp->setValueName(
"Input");
224 temp->setHelp(
"Select input to run airway segmentation on.");
234 tempMeshStringAdapter->setValueName(
"Centerline");
235 tempMeshStringAdapter->setHelp(
"Generated centerline mesh (vtk-format).");
240 tempMeshStringAdapter->setValueName(
"Segmentation");
241 tempMeshStringAdapter->setHelp(
"Generated surface of the segmented volume.");
QString qstring_cast(const T &val)
std::vector< SelectDataStringPropertyBasePtr > mInputTypes
void reportError(QString msg)
boost::shared_ptr< class VisServices > VisServicesPtr
boost::shared_ptr< class Image > ImagePtr
virtual void createOutputTypes()
virtual void createOptions()
virtual bool postProcess()
AirwaysFilter(VisServicesPtr services)
static QString findConfigFolder(QString pathRelativeToConfigRoot, QString alternativeAbsolutePath="")
vtkSmartPointer< class vtkPolyData > vtkPolyDataPtr
boost::shared_ptr< class SelectDataStringPropertyBase > SelectDataStringPropertyBasePtr
PatientModelServicePtr patientService()
void setVtkPolyData(const vtkPolyDataPtr &polyData)
virtual void createInputTypes()
ImagePtr getCopiedInputImage(int index=0)
virtual QString getType() const
std::vector< SelectDataStringPropertyBasePtr > mOutputTypes
static StringPropertySelectMeshPtr New(PatientModelServicePtr patientModelService)
virtual bool postProcess()
static StringPropertySelectImagePtr New(PatientModelServicePtr patientModelService)
boost::shared_ptr< class Mesh > MeshPtr
boost::shared_ptr< class StringPropertySelectMesh > StringPropertySelectMeshPtr
virtual QString getName() const
virtual QString getHelp() const