// clitk
#include "clitkSegmentationUtils.h"
-// #include "clitkBooleanOperatorLabelImageFilter.h"
-// #include "clitkAutoCropFilter.h"
-// #include "clitkResampleImageWithOptionsFilter.h"
-// #include "clitkBooleanOperatorLabelImageFilter.h"
#include "clitkExtractSliceFilter.h"
-// // itk
-// #include <deque>
-// #include "itkStatisticsLabelMapFilter.h"
-// #include "itkLabelImageToStatisticsLabelMapFilter.h"
-// #include "itkRegionOfInterestImageFilter.h"
-// #include "itkBinaryThresholdImageFilter.h"
-// #include "itkBinaryErodeImageFilter.h"
-// #include "itkBinaryBallStructuringElement.h"
-
-// // itk [Bloch et al]
-// #include "RelativePositionPropImageFilter.h"
-
//--------------------------------------------------------------------
template <class ImageType>
clitk::SliceBySliceRelativePositionFilter<ImageType>::
{
this->SetNumberOfRequiredInputs(2);
SetDirection(2);
- SetObjectBackgroundValue(0);
+ SetObjectBackgroundValue(0);
+ SetFuzzyThreshold(0.6);
+ SetOrientationType(RelPosFilterType::LeftTo);
+ SetIntermediateSpacing(10);
+ ResampleBeforeRelativePositionFilterOff();
}
//--------------------------------------------------------------------
template <class ImageType>
void
clitk::SliceBySliceRelativePositionFilter<ImageType>::
-SetInput(const ImageType * image) {
+SetInput(const ImageType * image)
+{
// Process object is not const-correct so the const casting is required.
this->SetNthInput(0, const_cast<ImageType *>(image));
}
template <class ImageType>
void
clitk::SliceBySliceRelativePositionFilter<ImageType>::
-SetInputObject(const ImageType * image) {
+SetInputObject(const ImageType * image)
+{
// Process object is not const-correct so the const casting is required.
this->SetNthInput(1, const_cast<ImageType *>(image));
}
template <class ImageType>
void
clitk::SliceBySliceRelativePositionFilter<ImageType>::
-GenerateOutputInformation() {
+GenerateOutputInformation()
+{
ImagePointer input = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(0));
ImagePointer outputImage = this->GetOutput(0);
outputImage->SetRegions(input->GetLargestPossibleRegion());
template <class ImageType>
void
clitk::SliceBySliceRelativePositionFilter<ImageType>::
-GenerateInputRequestedRegion() {
+GenerateInputRequestedRegion()
+{
// Call default
itk::ImageToImageFilter<ImageType, ImageType>::GenerateInputRequestedRegion();
// Get input pointers and set requested region to common region
template <class ImageType>
void
clitk::SliceBySliceRelativePositionFilter<ImageType>::
-GenerateData() {
+GenerateData()
+{
// Get input pointer
input = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(0));
object = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(1));
else {
DD("no pad");
}
-
+
/*
+ - extract vector of slices in input, in object
+ - slice by slice rel position
+ - joint result
+ - post process
+ */
//--------------------------------------------------------------------
// Extract input slices
StartNewStep("Extract input slices");
typedef clitk::ExtractSliceFilter<ImageType> ExtractSliceFilterType;
- typename ExtractSliceFilterType::Pointer extractSliceFilter = Extractslicefilter::New();
+ typename ExtractSliceFilterType::Pointer extractSliceFilter = ExtractSliceFilterType::New();
extractSliceFilter->SetInput(input);
extractSliceFilter->SetDirection(GetDirection());
extractSliceFilter->Update();
typedef typename ExtractSliceFilterType::SliceType SliceType;
- std::vector<typename SliceType::Pointer> & mInputSlices = extractSliceFilter->GetOutput();
- DD(mInputSlices.size());
- StopCurrentStep<SliceType>(mInputSlices[5]);
+ std::vector<typename SliceType::Pointer> mInputSlices;
+ extractSliceFilter->GetOutputSlices(mInputSlices);
+ StopCurrentStep<SliceType>(mInputSlices[0]);
//--------------------------------------------------------------------
// Extract object slices
-
StartNewStep("Extract object slices");
- extractSliceFilter = Extractslicefilter::New();
- extractSliceFilter->SetInput(input);
+ extractSliceFilter = ExtractSliceFilterType::New();
+ extractSliceFilter->SetInput(object);
extractSliceFilter->SetDirection(GetDirection());
extractSliceFilter->Update();
- std::vector<typename SliceType::Pointer> & mObjectSlices = extractSliceFilter->GetOutput();
- DD(mObjectSlices.size());
- StopCurrentStep<SliceType>(mInputSlices[5]);
+ std::vector<typename SliceType::Pointer> mObjectSlices;
+ extractSliceFilter->GetOutputSlices(mObjectSlices);
+ StopCurrentStep<SliceType>(mObjectSlices[0]);
-
//--------------------------------------------------------------------
// Perform slice by slice relative position
StartNewStep("Perform slice by slice relative position");
- for(int i=0; i<mInputSlices.size(); i++) {
- DD(i);
+ for(unsigned int i=0; i<mInputSlices.size(); i++) {
+ // DD(i);
+ // DD(mInputSlices[i]->GetOrigin());
+ // writeImage<SliceType>(mInputSlices[i], "inp"+clitk::toString(i)+".mhd");
+
+ // Select main CC in each object slice : this should be the main bronchus
+ mObjectSlices[i] = Labelize<SliceType>(mObjectSlices[i], 0, true, 1);
+ mObjectSlices[i] = KeepLabels<SliceType>(mObjectSlices[i], 0, 1, 1, 1, true);
+
+ // Relative position
typedef clitk::AddRelativePositionConstraintToLabelImageFilter<SliceType> RelPosFilterType;
typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
relPosFilter->VerboseStepOff();
relPosFilter->WriteStepOff();
+ relPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId());
relPosFilter->SetInput(mInputSlices[i]);
relPosFilter->SetInputObject(mObjectSlices[i]);
- relPosFilter->SetOrientationType(GetOrientationType());
- relPosFilter->SetIntermediateSpacing(GetIntermediateSpacing());
- relPosFilter->SetFuzzyThreshold(GetFuzzyThreshold());
+ relPosFilter->SetOrientationType(this->GetOrientationType());
+ relPosFilter->SetIntermediateSpacing(this->GetIntermediateSpacing());
+ relPosFilter->SetResampleBeforeRelativePositionFilter(this->GetResampleBeforeRelativePositionFilter());
+ relPosFilter->SetFuzzyThreshold(this->GetFuzzyThreshold());
+ relPosFilter->AutoCropOff(); // important ! because we join the slices after this loop
relPosFilter->Update();
+ // writeImage<SliceType>(relPosFilter->GetOutput(), "inp-after"+clitk::toString(i)+".mhd");
mInputSlices[i] = relPosFilter->GetOutput();
}
- typedef itk::JoinSeriesImageFilter<SliceType, ImageType> JointSeriesFilterType;
- typename JointSeriesFilterType::Pointer jointFilter = JointSeriesFilterType::New();
- for(int i=0; i<mInputSlices.size(); i++) {
- jointFilter->SetInput(i, mInputSlices[i]);
+ DD(this->GetIntermediateSpacing());
+ DD(this->GetResampleBeforeRelativePositionFilter());
+ DD("End slice");
+
+ typedef itk::JoinSeriesImageFilter<SliceType, ImageType> JoinSeriesFilterType;
+ typename JoinSeriesFilterType::Pointer joinFilter = JoinSeriesFilterType::New();
+ joinFilter->SetOrigin(input->GetOrigin()[GetDirection()]);
+ joinFilter->SetSpacing(input->GetSpacing()[GetDirection()]);
+ for(unsigned int i=0; i<mInputSlices.size(); i++) {
+ // DD(mInputSlices[i]->GetLargestPossibleRegion().GetIndex());
+// DD(mInputSlices[i]->GetLargestPossibleRegion().GetSize());
+// DD(mInputSlices[i]->GetRequestedRegion().GetIndex());
+// DD(mInputSlices[i]->GetRequestedRegion().GetSize());
+ joinFilter->PushBackInput(mInputSlices[i]);
+ //SetInput(i, mInputSlices[i]);
}
- m_working_input = jointFilter->GetOutput();
+ DD("before update");
+ joinFilter->Update();
+ DD("after update");
+ m_working_input = joinFilter->GetOutput();
+
+ // Update the origin
+ DD(input->GetSpacing());
+ DD(input->GetOrigin());
+ DD(mInputSlices[0]->GetSpacing());
+ DD(mInputSlices[0]->GetOrigin());
DD(m_working_input->GetSpacing());
DD(m_working_input->GetOrigin());
+ // typename ImageType::PointType origin = m_working_input->GetOrigin();
+// origin[GetDirection()] = input->GetOrigin()[GetDirection()];
+// m_working_input->SetOrigin(origin);
+// DD(m_working_input->GetOrigin());
StopCurrentStep<ImageType>(m_working_input);
- */
-
-
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Final Step -> set output