+ output = clitk::Labelize<MaskImageType>(output, GetBackgroundValue(), false, 500);
+ // output = RemoveLabels<MaskImageType>(output, BG, param->GetLabelsToRemove());
+ output = clitk::KeepLabels<MaskImageType>(output, GetBackgroundValue(),
+ GetForegroundValue(), 1, 1, 0);
+ this->template StopCurrentStep<MaskImageType>(output);
+
+
+ //--------------------------------------------------------------------
+ // Step 8: Trial segmentation KMeans
+ if (0) {
+ StartNewStep("K means");
+ // Take input, crop like current mask
+ typedef CropLikeImageFilter<ImageType> CropLikeFilterType;
+ typename CropLikeFilterType::Pointer cropLikeFilter = CropLikeFilterType::New();
+ cropLikeFilter->SetInput(input);
+ cropLikeFilter->SetCropLikeImage(output);
+ cropLikeFilter->Update();
+ ImagePointer working_input = cropLikeFilter->GetOutput();
+ writeImage<ImageType>(working_input, "crop-input.mhd");
+ // Set bG at -1000
+ working_input = clitk::SetBackground<ImageType, MaskImageType>(working_input, output, GetBackgroundValue(), -1000, true);
+ writeImage<ImageType>(working_input, "crop-input2.mhd");
+ // Kmeans
+ typedef itk::ScalarImageKmeansImageFilter<ImageType> KMeansFilterType;
+ typename KMeansFilterType::Pointer kmeansFilter = KMeansFilterType::New();
+ kmeansFilter->SetInput(working_input);
+ // const unsigned int numberOfInitialClasses = 3;
+ // const unsigned int useNonContiguousLabels = 0;
+ kmeansFilter->AddClassWithInitialMean(-1000);
+ kmeansFilter->AddClassWithInitialMean(30);
+ kmeansFilter->AddClassWithInitialMean(-40); // ==> I want this one
+ DD("Go!");
+ kmeansFilter->Update();
+ DD("End");
+ typename KMeansFilterType::ParametersType estimatedMeans = kmeansFilter->GetFinalMeans();
+ const unsigned int numberOfClasses = estimatedMeans.Size();
+ for ( unsigned int i = 0 ; i < numberOfClasses ; ++i ) {
+ std::cout << "cluster[" << i << "] ";
+ std::cout << " estimated mean : " << estimatedMeans[i] << std::endl;
+ }
+ MaskImageType::Pointer kmeans = kmeansFilter->GetOutput();
+ kmeans = clitk::SetBackground<MaskImageType, MaskImageType>(kmeans, kmeans,
+ 1, GetBackgroundValue(), true);
+ writeImage<MaskImageType>(kmeans, "kmeans.mhd");
+ // Get final results, and remove from current mask
+ boolFilter = BoolFilterType::New();
+ boolFilter->InPlaceOn();
+ boolFilter->SetInput1(output);
+ boolFilter->SetInput2(kmeans);
+ boolFilter->SetOperationType(BoolFilterType::And);
+ boolFilter->Update();
+ output = boolFilter->GetOutput();
+ writeImage<MaskImageType>(output, "out-kmean.mhd");
+ this->template StopCurrentStep<MaskImageType>(output);
+
+ // TODO -> FillMASK ?
+ // comment speed ? mask ? 2 class ?
+
+
+ //TODO
+ // Confidence connected ?
+
+ }
+
+ //--------------------------------------------------------------------
+ // Step 8: Lower limits from lung (need separate lung ?)
+ if (0) {
+ // StartNewStep("Trial : minus segmented struct");
+ // MaskImagePointer heart = GetAFDB()->template GetImage <MaskImageType>("heart");
+ // boolFilter = BoolFilterType::New();
+ // boolFilter->InPlaceOn();
+ // boolFilter->SetInput1(output);
+ // boolFilter->SetInput2(heart);
+ // boolFilter->SetOperationType(BoolFilterType::AndNot);
+ // boolFilter->Update();
+ // output = boolFilter->GetOutput(); // not needed because InPlace
+
+ // Not below the heart
+ // relPosFilter = RelPosFilterType::New();
+ // relPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId());
+ // relPosFilter->VerboseStepFlagOff();
+ // relPosFilter->WriteStepFlagOff();
+ // relPosFilter->SetInput(output);
+ // relPosFilter->SetInputObject(heart);
+ // relPosFilter->SetOrientationType(RelPosFilterType::SupTo);
+ // relPosFilter->SetIntermediateSpacing(GetIntermediateSpacing());
+ // relPosFilter->SetFuzzyThreshold(GetFuzzyThreshold3());
+ // relPosFilter->Update();
+ // output = relPosFilter->GetOutput();
+ }
+
+ //--------------------------------------------------------------------
+ // Step 8: Lower limits from lung (need separate lung ?)
+ if (0) {
+ StartNewStep("Lower limits with lungs");
+ // TODO BOFFF ????
+ relPosFilter = RelPosFilterType::New();
+ relPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId());
+ relPosFilter->VerboseStepFlagOff();
+ relPosFilter->WriteStepFlagOff();
+ relPosFilter->SetInput(output);
+ // relPosFilter->SetInputObject(left_lung);
+ relPosFilter->SetInputObject(lung);
+ relPosFilter->AddOrientationType(RelPosFilterType::SupTo);
+ relPosFilter->SetIntermediateSpacing(GetIntermediateSpacing());
+ relPosFilter->SetFuzzyThreshold(GetFuzzyThreshold3());
+ relPosFilter->Update();
+ output = relPosFilter->GetOutput();
+ this->template StopCurrentStep<MaskImageType>(output);
+ }
+
+ //--------------------------------------------------------------------
+ // Step 10: Slice by Slice CCL
+ StartNewStep("Slice by Slice keep only one component");
+ typedef clitk::ExtractSliceFilter<MaskImageType> ExtractSliceFilterType;
+ // typename ExtractSliceFilterType::Pointer
+ ExtractSliceFilterType::Pointer extractSliceFilter = ExtractSliceFilterType::New();
+ extractSliceFilter->SetInput(output);
+ extractSliceFilter->SetDirection(2);
+ extractSliceFilter->Update();
+ typedef typename ExtractSliceFilterType::SliceType SliceType;
+ std::vector<typename SliceType::Pointer> mSlices;
+ extractSliceFilter->GetOutputSlices(mSlices);
+ for(unsigned int i=0; i<mSlices.size(); i++) {
+ mSlices[i] = Labelize<SliceType>(mSlices[i], 0, true, 100);
+ mSlices[i] = KeepLabels<SliceType>(mSlices[i], 0, 1, 1, 1, true);
+ }
+ typedef itk::JoinSeriesImageFilter<SliceType, MaskImageType> JoinSeriesFilterType;
+ typename JoinSeriesFilterType::Pointer joinFilter = JoinSeriesFilterType::New();
+ joinFilter->SetOrigin(output->GetOrigin()[2]);
+ joinFilter->SetSpacing(output->GetSpacing()[2]);
+ for(unsigned int i=0; i<mSlices.size(); i++) {
+ joinFilter->PushBackInput(mSlices[i]);
+ }
+ joinFilter->Update();
+ output = joinFilter->GetOutput();
+ this->template StopCurrentStep<MaskImageType>(output);
+
+ //--------------------------------------------------------------------
+ // Step 9: Binarize to remove too high HU
+ // --> warning CCL slice by slice must be done before
+ if (0) {
+ StartNewStep("Remove hypersignal (bones and injected part");
+ // Crop initial ct like current support
+ typedef CropLikeImageFilter<ImageType> CropLikeFilterType;
+ typename CropLikeFilterType::Pointer cropLikeFilter = CropLikeFilterType::New();
+ cropLikeFilter->SetInput(input);
+ cropLikeFilter->SetCropLikeImage(output);
+ cropLikeFilter->Update();
+ ImagePointer working_input = cropLikeFilter->GetOutput();
+ // writeImage<ImageType>(working_input, "crop-ct.mhd");
+ // Binarize
+ typedef itk::BinaryThresholdImageFilter<ImageType, MaskImageType> InputBinarizeFilterType;
+ typename InputBinarizeFilterType::Pointer binarizeFilter=InputBinarizeFilterType::New();
+ binarizeFilter->SetInput(working_input);
+ binarizeFilter->SetLowerThreshold(GetLowerThreshold());
+ binarizeFilter->SetUpperThreshold(GetUpperThreshold());
+ binarizeFilter->SetInsideValue(this->GetBackgroundValue()); // opposite
+ binarizeFilter->SetOutsideValue(this->GetForegroundValue()); // opposite
+ binarizeFilter->Update();
+ MaskImagePointer working_bin = binarizeFilter->GetOutput();
+ // writeImage<MaskImageType>(working_bin, "bin.mhd");
+ // Remove from support
+ boolFilter = BoolFilterType::New();
+ boolFilter->InPlaceOn();
+ boolFilter->SetInput1(output);
+ boolFilter->SetInput2(working_bin);
+ boolFilter->SetOperationType(BoolFilterType::AndNot);
+ boolFilter->Update();
+ output = boolFilter->GetOutput();
+ StopCurrentStep<MaskImageType>(output);
+ }
+
+ //--------------------------------------------------------------------
+ // Step 10 : AutoCrop
+ StartNewStep("AutoCrop");
+ output = clitk::AutoCrop<MaskImageType>(output, GetBackgroundValue());
+ this->template StopCurrentStep<MaskImageType>(output);
+
+ // Bones ? pb with RAM ? FillHoles ?
+
+ // how to do with post part ? spine /lung ?
+ // POST the spine (should be separated from the rest)
+ /// DO THAT ---->>
+ // histo Y on the whole bones_post (3D) -> result is the Y center on the spine (?)
+ // by slice on bones_post
+ // find the most ant point in the center
+ // from this point go to post until out of bones.
+ //
+
+
+ // End, set the real size
+ this->GetOutput(0)->SetRegions(output->GetLargestPossibleRegion());
+ this->GetOutput(0)->SetLargestPossibleRegion(output->GetLargestPossibleRegion());
+ this->GetOutput(0)->SetRequestedRegion(output->GetLargestPossibleRegion());
+ this->GetOutput(0)->SetBufferedRegion(output->GetLargestPossibleRegion());
+}
+//--------------------------------------------------------------------