X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=segmentation%2FclitkRelativePositionList.txx;h=4f4702b981c809b6705f1102bd1b4cebc32ac95d;hb=2d9ef51e893a0b5b93d44a88594c9c76e4b61239;hp=aff21e41618eb80a373a85bd66cadc0d33ed677b;hpb=adeedbea1fbf8bc34e2c9565867b992ad13ccc57;p=clitk.git diff --git a/segmentation/clitkRelativePositionList.txx b/segmentation/clitkRelativePositionList.txx index aff21e4..4f4702b 100644 --- a/segmentation/clitkRelativePositionList.txx +++ b/segmentation/clitkRelativePositionList.txx @@ -16,11 +16,28 @@ - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ======================================================================-====*/ +#include "clitkLabelImageOverlapMeasureFilter.h" //-------------------------------------------------------------------- template clitk::RelativePositionList:: -RelativePositionList() { +RelativePositionList(): + clitk::FilterBase(), + clitk::FilterWithAnatomicalFeatureDatabaseManagement(), + itk::ImageToImageFilter() +{ + ComputeOverlapFlagOff(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::RelativePositionList:: +SetReferenceImageForOverlapMeasure(ImagePointer ref) { + m_reference = ref; + ComputeOverlapFlagOn(); } //-------------------------------------------------------------------- @@ -77,7 +94,6 @@ Read(std::string filename) { if (!is) stop = true; else { std::getline(is, s); - // DD(s); if (s.find("object") != std::string::npos) stop=true; else ss << s << std::endl; if (!is) stop = true; @@ -88,19 +104,23 @@ Read(std::string filename) { std::ofstream os; openFileForWriting(os, tmpfilename); os << text; + os << "input = nothing" << std::endl; + os << "output = nothing" << std::endl; os.close(); - // Create a struct to store options + // Create a struct to store options. I use two step to allow to + // fill the args values with de default and then check + // automatically the options. ArgsInfoType args_info; - args_info.input_given = 1; - args_info.input_arg = new char[1]; - args_info.output_given = 1; - args_info.output_arg = new char[1]; std::vector writable(tmpfilename.size() + 1); std::copy(tmpfilename.begin(), tmpfilename.end(), writable.begin()); - cmdline_parser_clitkRelativePosition_configfile(&writable[0], &args_info, 1, 1, 0); - - // Store the args + char ** argv = new char*[1]; + argv[0] = new char[1]; + struct cmdline_parser_clitkRelativePosition_params params; + params.override = 0; + params.initialize = 1; + params.check_required = 0; + cmdline_parser_clitkRelativePosition_configfile(&writable[0], &args_info, 1, 1, 1); mArgsInfoList.push_back(args_info); // Delete the temporary file @@ -138,39 +158,76 @@ GenerateOutputInformation() { // Get input m_working_input = dynamic_cast(itk::ProcessObject::GetInput(0)); + std::string s = GetInputName(); + + // Debug + if (GetDisplayUsedStructuresOnlyFlag()) { + for(uint i=0; i(&*relPosFilter)->SetDirection(2); + typename SliceRelPosFilterType::Pointer f = SliceRelPosFilterType::New(); + relPosFilter = f; + SetFilterOptions(relPosFilter, mArgsInfoList[i]); + f->SetDirection(2); + // Set SbS specific options + f->SetUniqueConnectedComponentBySliceFlag(mArgsInfoList[i].uniqueCCL_flag); + f->SetObjectCCLSelectionFlag(mArgsInfoList[i].uniqueObjectCCL_flag); + f->IgnoreEmptySliceObjectFlagOn(); + //f->SetObjectCCLSelectionDimension(0); + //f->SetObjectCCLSelectionDirection(-1); + //f->SetAutoCropFlag(false); + // Print if needed + if (mArgsInfoList[i].verboseOptions_flag) f->PrintOptions(); } else { relPosFilter = clitk::AddRelativePositionConstraintToLabelImageFilter::New(); + SetFilterOptions(relPosFilter, mArgsInfoList[i]); + // Print if needed + if (mArgsInfoList[i].verboseOptions_flag) relPosFilter->PrintOptions(); } - relPosFilter->VerboseStepFlagOff(); - relPosFilter->WriteStepFlagOff(); - relPosFilter->SetVerboseImageSizeFlag(GetVerboseImageSizeFlag()); - relPosFilter->SetInput(m_working_input); - SetFilterOptions(relPosFilter, mArgsInfoList[i]); - //relPosFilter->PrintOptions(); + + // Set input + relPosFilter->SetInput(m_working_input); + + // Run the filter relPosFilter->Update(); m_working_input = relPosFilter->GetOutput(); StopCurrentStep(m_working_input); + + // Compute overlap with reference if needed + if (GetComputeOverlapFlag()) { + typedef clitk::LabelImageOverlapMeasureFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); + filter->SetInput(0, m_working_input); + filter->SetInput(1, m_reference); + filter->Update(); + } + } } //-------------------------------------------------------------------- @@ -192,33 +249,41 @@ GenerateData() template void clitk::RelativePositionList:: -SetFilterOptions(typename RelPosFilterType::Pointer filter, - ArgsInfoType & options) { +SetFilterOptions(typename RelPosFilterType::Pointer filter, ArgsInfoType & options) { - if (options.orientation_given != 1) { - DD("ERRROR DEBUG TODO no more than 1 orientation yet"); - exit(0); + if (options.orientation_given > 1) { + clitkExceptionMacro("Error in the RelPos options. I need a single --orientation (for the moment)." + << " Current options are for obj = '" << options.object_arg + << "', threshold = " << options.threshold_arg << std::endl); } ImagePointer object = GetAFDB()->template GetImage(options.object_arg); filter->SetInputObject(object); + filter->WriteStepFlagOff(); + filter->SetVerboseImageSizeFlag(GetVerboseImageSizeFlag()); filter->SetFuzzyThreshold(options.threshold_arg); filter->SetInverseOrientationFlag(options.inverse_flag); // MUST BE BEFORE AddOrientationTypeString - for(uint i=0; iAddOrientationTypeString(options.orientation_arg[i]); + + if (options.orientation_given == 1) { + for(uint i=0; iAddOrientationTypeString(options.orientation_arg[i]); + } + else { + if (options.angle1_given && options.angle2_given) { + filter->AddAnglesInDeg(options.angle1_arg, options.angle2_arg); + } + else { + clitkExceptionMacro("Error in the RelPos options. I need --orientation or (--angle1 and --angle2)." + << " Current options are for obj = '" << options.object_arg + << "', threshold = " << options.threshold_arg << std::endl); + } + } filter->SetIntermediateSpacing(options.spacing_arg); if (options.spacing_arg == -1) filter->IntermediateSpacingFlagOff(); - filter->IntermediateSpacingFlagOn(); - - if (options.sliceBySlice_flag) { - SliceRelPosFilterType * f = dynamic_cast(&*filter); - f->SetUniqueConnectedComponentBySliceFlag(options.uniqueCCL_flag); - f->SetObjectCCLSelectionFlag(options.uniqueObjectCCL_flag); - f->IgnoreEmptySliceObjectFlagOn(); - //filter->SetObjectCCLSelectionDimension(0); - //filter->SetObjectCCLSelectionDirection(-1); - //filter->SetAutoCropFlag(false); - } + else filter->IntermediateSpacingFlagOn(); + filter->SetVerboseStepFlag(options.verboseStep_flag); filter->SetAutoCropFlag(!options.noAutoCrop_flag); } //-------------------------------------------------------------------- + +