template <class ImageType>
class ITK_EXPORT SliceBySliceRelativePositionFilter:
- public clitk::FilterBase,
- public itk::ImageToImageFilter<ImageType, ImageType>
+ public AddRelativePositionConstraintToLabelImageFilter<ImageType>
{
public:
/** Standard class typedefs. */
- typedef itk::ImageToImageFilter<ImageType, ImageType> Superclass;
+ typedef AddRelativePositionConstraintToLabelImageFilter<ImageType> Superclass;
typedef SliceBySliceRelativePositionFilter Self;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
/** Input : initial image and object */
void SetInput(const ImageType * image);
void SetInputObject(const ImageType * image);
-
+
// Options
+ void PrintOptions();
itkGetConstMacro(Direction, int);
itkSetMacro(Direction, int);
- itkGetConstMacro(ObjectBackgroundValue, PixelType);
- itkSetMacro(ObjectBackgroundValue, PixelType);
+ // itkGetConstMacro(ObjectBackgroundValue, PixelType);
+ // itkSetMacro(ObjectBackgroundValue, PixelType);
- itkSetMacro(OrientationTypeString, std::string);
- itkGetConstMacro(OrientationTypeString, std::string);
+ // itkSetMacro(OrientationTypeString, std::string);
+ // itkGetConstMacro(OrientationTypeString, std::string);
- itkGetConstMacro(ResampleBeforeRelativePositionFilter, bool);
- itkSetMacro(ResampleBeforeRelativePositionFilter, bool);
- itkBooleanMacro(ResampleBeforeRelativePositionFilter);
+ // itkGetConstMacro(ResampleBeforeRelativePositionFilter, bool);
+ // itkSetMacro(ResampleBeforeRelativePositionFilter, bool);
+ // itkBooleanMacro(ResampleBeforeRelativePositionFilter);
- itkGetConstMacro(IntermediateSpacing, double);
- itkSetMacro(IntermediateSpacing, double);
+ // itkGetConstMacro(IntermediateSpacing, double);
+ // itkSetMacro(IntermediateSpacing, double);
- itkGetConstMacro(FuzzyThreshold, double);
- itkSetMacro(FuzzyThreshold, double);
+ // itkGetConstMacro(FuzzyThreshold, double);
+ // itkSetMacro(FuzzyThreshold, double);
itkGetConstMacro(UniqueConnectedComponentBySlice, bool);
itkSetMacro(UniqueConnectedComponentBySlice, bool);
itkBooleanMacro(UniqueConnectedComponentBySlice);
- itkGetConstMacro(AutoCropFlag, bool);
- itkSetMacro(AutoCropFlag, bool);
- itkBooleanMacro(AutoCropFlag);
+ // itkGetConstMacro(AutoCropFlag, bool);
+ // itkSetMacro(AutoCropFlag, bool);
+ // itkBooleanMacro(AutoCropFlag);
+
+ // itkGetConstMacro(InverseOrientationFlag, bool);
+ // itkSetMacro(InverseOrientationFlag, bool);
+ // itkBooleanMacro(InverseOrientationFlag);
+
+ // itkGetConstMacro(RemoveObjectFlag, bool);
+ // itkSetMacro(RemoveObjectFlag, bool);
+ // itkBooleanMacro(RemoveObjectFlag);
- itkGetConstMacro(NotFlag, bool);
- itkSetMacro(NotFlag, bool);
- itkBooleanMacro(NotFlag);
+ // itkGetConstMacro(CombineWithOrFlag, bool);
+ // itkSetMacro(CombineWithOrFlag, bool);
+ // itkBooleanMacro(CombineWithOrFlag);
protected:
SliceBySliceRelativePositionFilter();
virtual ~SliceBySliceRelativePositionFilter() {}
- int m_Direction;
- PixelType m_ObjectBackgroundValue;
+ // PixelType m_ObjectBackgroundValue;
// OrientationTypeEnumeration m_OrientationType;
- std::string m_OrientationTypeString;
- double m_IntermediateSpacing;
- double m_FuzzyThreshold;
- bool m_ResampleBeforeRelativePositionFilter;
+ // std::string m_OrientationTypeString;
+ // double m_IntermediateSpacing;
+ // double m_FuzzyThreshold;
+ // bool m_ResampleBeforeRelativePositionFilter;
virtual void GenerateOutputInformation();
virtual void GenerateInputRequestedRegion();
ImagePointer object;
ImagePointer m_working_input;
ImagePointer m_working_object;
- bool m_UniqueConnectedComponentBySlice;
- bool m_NotFlag;
- bool m_AutoCropFlag;
+ bool m_UniqueConnectedComponentBySlice;
+ int m_Direction;
+ // bool m_InverseOrientationFlag;
+ // bool m_RemoveObjectFlag;
+ // bool m_AutoCropFlag;
+ // bool m_CombineWithOrFlag;
private:
SliceBySliceRelativePositionFilter(const Self&); //purposely not implemented
template <class ImageType>
clitk::SliceBySliceRelativePositionFilter<ImageType>::
SliceBySliceRelativePositionFilter():
- clitk::FilterBase(),
- itk::ImageToImageFilter<ImageType, ImageType>()
+ clitk::AddRelativePositionConstraintToLabelImageFilter<ImageType>()
{
- this->SetNumberOfRequiredInputs(2);
SetDirection(2);
- SetObjectBackgroundValue(0);
- SetFuzzyThreshold(0.6);
- SetOrientationTypeString("Left");
- SetIntermediateSpacing(10);
- ResampleBeforeRelativePositionFilterOff();
UniqueConnectedComponentBySliceOff();
- NotFlagOff();
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
+//--------------------------------------------------------------------
+template <class ImageType>
+void
+clitk::SliceBySliceRelativePositionFilter<ImageType>::
+PrintOptions()
+{
+ DD(this->GetDirection());
+ DD((int)this->GetObjectBackgroundValue());
+ DDV(this->GetOrientationTypeString(), (uint)this->GetNumberOfAngles());
+ DD(this->GetResampleBeforeRelativePositionFilter());
+ DD(this->GetIntermediateSpacing());
+ DD(this->GetFuzzyThreshold());
+ DD(this->GetUniqueConnectedComponentBySlice());
+ DD(this->GetAutoCropFlag());
+ DD(this->GetInverseOrientationFlag());
+ DD(this->GetRemoveObjectFlag());
+ DD(this->GetCombineWithOrFlag());
+}
+//--------------------------------------------------------------------
+
+
//--------------------------------------------------------------------
template <class ImageType>
void
clitk::SliceBySliceRelativePositionFilter<ImageType>::
GenerateOutputInformation()
{
+ if (this->GetVerboseOptionFlag()) {
+ PrintOptions();
+ }
+
// Get input pointer
input = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(0));
object = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(1));
//--------------------------------------------------------------------
// Resample object to the same spacing than input
if (!clitk::HaveSameSpacing<ImageType, ImageType>(object, input)) {
- StartNewStep("Resample object to the same spacing than input");
+ this->StartNewStep("Resample object to the same spacing than input");
m_working_object = clitk::ResampleImageSpacing<ImageType>(object, input->GetSpacing());
- StopCurrentStep<ImageType>(m_working_object);
+ this->template StopCurrentStep<ImageType>(m_working_object);
}
else {
m_working_object = object;
//--------------------------------------------------------------------
// Pad object to the same size than input
if (!clitk::HaveSameSizeAndSpacing<ImageType, ImageType>(m_working_object, input)) {
- StartNewStep("Pad object to the same size than input");
+ this->StartNewStep("Pad object to the same size than input");
m_working_object = clitk::ResizeImageLike<ImageType>(m_working_object,
input,
- GetObjectBackgroundValue());
- StopCurrentStep<ImageType>(m_working_object);
+ this->GetObjectBackgroundValue());
+ this->template StopCurrentStep<ImageType>(m_working_object);
}
else {
}
//--------------------------------------------------------------------
// Extract input slices
- StartNewStep("Extract input slices");
+ this->StartNewStep("Extract input slices");
typedef clitk::ExtractSliceFilter<ImageType> ExtractSliceFilterType;
typename ExtractSliceFilterType::Pointer extractSliceFilter = ExtractSliceFilterType::New();
extractSliceFilter->SetInput(input);
typedef typename ExtractSliceFilterType::SliceType SliceType;
std::vector<typename SliceType::Pointer> mInputSlices;
extractSliceFilter->GetOutputSlices(mInputSlices);
- StopCurrentStep<SliceType>(mInputSlices[0]);
+ this->template StopCurrentStep<SliceType>(mInputSlices[0]);
//--------------------------------------------------------------------
// Extract object slices
- StartNewStep("Extract object slices");
+ this->StartNewStep("Extract object slices");
extractSliceFilter = ExtractSliceFilterType::New();
extractSliceFilter->SetInput(m_working_object);//object);
extractSliceFilter->SetDirection(GetDirection());
extractSliceFilter->Update();
std::vector<typename SliceType::Pointer> mObjectSlices;
extractSliceFilter->GetOutputSlices(mObjectSlices);
- StopCurrentStep<SliceType>(mObjectSlices[0]);
+ this->template StopCurrentStep<SliceType>(mObjectSlices[0]);
//--------------------------------------------------------------------
// Perform slice by slice relative position
- StartNewStep("Perform slice by slice relative position");
+ this->StartNewStep("Perform slice by slice relative position");
for(unsigned int i=0; i<mInputSlices.size(); i++) {
// Select main CC in each object slice (required ?)
mObjectSlices[i] = Labelize<SliceType>(mObjectSlices[i], 0, true, 1);
// Relative position
typedef clitk::AddRelativePositionConstraintToLabelImageFilter<SliceType> RelPosFilterType;
typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
- relPosFilter->VerboseStepOff();
- relPosFilter->WriteStepOff();
+ relPosFilter->VerboseStepFlagOff();
+ relPosFilter->WriteStepFlagOff();
relPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId());
+ relPosFilter->SetBackgroundValue(this->GetBackgroundValue());
relPosFilter->SetInput(mInputSlices[i]);
relPosFilter->SetInputObject(mObjectSlices[i]);
- relPosFilter->SetNotFlag(GetNotFlag());
- relPosFilter->SetOrientationTypeString(this->GetOrientationTypeString());
+ relPosFilter->SetRemoveObjectFlag(this->GetRemoveObjectFlag());
+ for(int j=0; j<this->GetNumberOfAngles(); j++) {
+ relPosFilter->AddOrientationTypeString(this->GetOrientationTypeString(j));
+ }
+ relPosFilter->SetInverseOrientationFlag(this->GetInverseOrientationFlag());
+ //relPosFilter->SetOrientationType(this->GetOrientationType());
relPosFilter->SetIntermediateSpacing(this->GetIntermediateSpacing());
relPosFilter->SetResampleBeforeRelativePositionFilter(this->GetResampleBeforeRelativePositionFilter());
relPosFilter->SetFuzzyThreshold(this->GetFuzzyThreshold());
relPosFilter->AutoCropFlagOff(); // important ! because we join the slices after this loop
+ relPosFilter->SetCombineWithOrFlag(this->GetCombineWithOrFlag());
relPosFilter->Update();
mInputSlices[i] = relPosFilter->GetOutput();
}
- 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++) {
- joinFilter->PushBackInput(mInputSlices[i]);
- }
- joinFilter->Update();
- m_working_input = joinFilter->GetOutput();
- StopCurrentStep<ImageType>(m_working_input);
+ // Join the slices
+ m_working_input = clitk::JoinSlices<ImageType>(mInputSlices, input, GetDirection());
+ this->template StopCurrentStep<ImageType>(m_working_input);
//--------------------------------------------------------------------
// Step 7: autocrop
- if (GetAutoCropFlag()) {
- StartNewStep("Final AutoCrop");
+ if (this->GetAutoCropFlag()) {
+ this->StartNewStep("Final AutoCrop");
typedef clitk::AutoCropFilter<ImageType> CropFilterType;
typename CropFilterType::Pointer cropFilter = CropFilterType::New();
cropFilter->SetInput(m_working_input);
cropFilter->ReleaseDataFlagOff();
cropFilter->Update();
m_working_input = cropFilter->GetOutput();
- StopCurrentStep<ImageType>(m_working_input);
+ this->template StopCurrentStep<ImageType>(m_working_input);
}
// Update output info