Authors belong to:
- University of LYON http://www.universite-lyon.fr/
- - Léon Bérard cancer center http://www.centreleonberard.fr
+ - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
- CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
This software is distributed WITHOUT ANY WARRANTY; without even
- BSD See included LICENSE.txt file
- CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
- ===========================================================================**/
+ ======================================================================-====*/
// clitk
#include "clitkSegmentationUtils.h"
clitk::AddRelativePositionConstraintToLabelImageFilter<ImageType>()
{
SetDirection(2);
- UniqueConnectedComponentBySliceOff();
+ UniqueConnectedComponentBySliceFlagOff();
SetIgnoreEmptySliceObjectFlag(false);
- UseASingleObjectConnectedComponentBySliceFlagOn();
+ UseTheLargestObjectCCLFlagOff();
this->VerboseStepFlagOff();
this->WriteStepFlagOff();
this->SetCombineWithOrFlag(false);
+ ObjectCCLSelectionFlagOff();
+ SetObjectCCLSelectionDimension(0);
+ SetObjectCCLSelectionDirection(1);
+ ObjectCCLSelectionIgnoreSingleCCLFlagOff();
}
//--------------------------------------------------------------------
DD(this->GetIntermediateSpacingFlag());
DD(this->GetIntermediateSpacing());
DD(this->GetFuzzyThreshold());
- DD(this->GetUniqueConnectedComponentBySlice());
+ DD(this->GetUniqueConnectedComponentBySliceFlag());
DD(this->GetAutoCropFlag());
DD(this->GetInverseOrientationFlag());
DD(this->GetRemoveObjectFlag());
DD(this->GetCombineWithOrFlag());
+ DD(this->GetUseTheLargestObjectCCLFlag());
+ DD(this->GetObjectCCLSelectionFlag());
+ DD(this->GetObjectCCLSelectionDimension());
+ DD(this->GetObjectCCLSelectionIgnoreSingleCCLFlag());
}
//--------------------------------------------------------------------
if ((!GetIgnoreEmptySliceObjectFlag()) || (nb!=0)) {
// Select or not a single CCL ?
- if (GetUseASingleObjectConnectedComponentBySliceFlag()) {
+ if (GetUseTheLargestObjectCCLFlag()) {
mObjectSlices[i] = KeepLabels<SliceType>(mObjectSlices[i], 0, 1, 1, 1, true);
}
+ // Select a single according to a position if more than one CCL
+ if (GetObjectCCLSelectionFlag()) {
+ // if several CCL, choose the most extrema according a direction,
+ // if not -> should we consider this slice ?
+ if (nb<2) {
+ if (GetObjectCCLSelectionIgnoreSingleCCLFlag()) {
+ mObjectSlices[i] = SetBackground<SliceType, SliceType>(mObjectSlices[i], mObjectSlices[i],
+ 1, this->GetBackgroundValue(),
+ true);
+ }
+ }
+ int dim = GetObjectCCLSelectionDimension();
+ int direction = GetObjectCCLSelectionDirection();
+ std::vector<typename SliceType::PointType> centroids;
+ ComputeCentroids<SliceType>(mObjectSlices[i], this->GetBackgroundValue(), centroids);
+ uint index=1;
+ for(uint j=1; j<centroids.size(); j++) {
+ if (direction == 1) {
+ if (centroids[j][dim] > centroids[index][dim]) index = j;
+ }
+ else {
+ if (centroids[j][dim] < centroids[index][dim]) index = j;
+ }
+ }
+ for(uint v=1; v<centroids.size(); v++) {
+ if (v != index) {
+ mObjectSlices[i] = SetBackground<SliceType, SliceType>(mObjectSlices[i], mObjectSlices[i],
+ (char)v, this->GetBackgroundValue(),
+ true);
+ }
+ }
+ } // end GetbjectCCLSelectionFlag = true
+
// Relative position
typedef clitk::AddRelativePositionConstraintToLabelImageFilter<SliceType> RelPosFilterType;
typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
relPosFilter->SetInput(mInputSlices[i]);
relPosFilter->SetInputObject(mObjectSlices[i]);
relPosFilter->SetRemoveObjectFlag(this->GetRemoveObjectFlag());
+ // This flag (InverseOrientation) *must* be set before
+ // AddOrientation because AddOrientation can change it.
+ relPosFilter->SetInverseOrientationFlag(this->GetInverseOrientationFlag());
for(int j=0; j<this->GetNumberOfAngles(); j++) {
relPosFilter->AddOrientationTypeString(this->GetOrientationTypeString(j));
+ //DD(this->GetOrientationTypeString(j));
}
- relPosFilter->SetInverseOrientationFlag(this->GetInverseOrientationFlag());
+ //DD(this->GetInverseOrientationFlag());
//relPosFilter->SetOrientationType(this->GetOrientationType());
relPosFilter->SetIntermediateSpacing(this->GetIntermediateSpacing());
relPosFilter->SetIntermediateSpacingFlag(this->GetIntermediateSpacingFlag());
mInputSlices[i] = relPosFilter->GetOutput();
// Select main CC if needed
- if (GetUniqueConnectedComponentBySlice()) {
+ if (GetUniqueConnectedComponentBySliceFlag()) {
mInputSlices[i] = Labelize<SliceType>(mInputSlices[i], 0, true, 1);
mInputSlices[i] = KeepLabels<SliceType>(mInputSlices[i], 0, 1, 1, 1, true);
}
+ /*
+ // Select unique CC according to the most in a given direction
+ if (GetUniqueConnectedComponentBySliceAccordingToADirection()) {
+ int nb;
+ mInputSlices[i] = LabelizeAndCountNumberOfObjects<SliceType>(mInputSlices[i], 0, true, 1, nb);
+ std::vector<typename ImageType::PointType> & centroids;
+ ComputeCentroids
+ }
+ */
}
}