16 #include <vnl/vnl_random.h> 19 #include <itksys/SystemTools.hxx> 25 #include <itkImageRegionIterator.h> 36 #include <QStringList> 38 #include <itkLabelOverlapMeasuresImageFilter.h> 39 #include <itkImageRegionIteratorWithIndex.h> 42 #include <itkNeighborhood.h> 53 typedef itk::Image<double,3> DoubleImageType;
54 typedef itk::Image<short,3> ShortImageType;
55 typedef itk::ConstNeighborhoodIterator<DoubleImageType> NeighborhoodType;
59 m_FeatureImageVector.clear();
62 m_FeatureImageVector.push_back(raw_image);
67 m_FeatureImageVector.push_back(smoothed);
73 m_FeatureImageVector.push_back(csf_prob);
79 m_FeatureImageVector.push_back(les_prob);
85 m_FeatureImageVector.push_back(brain_prob);
87 std::vector<unsigned int> FOS_sizes;
88 FOS_sizes.push_back(1);
90 DoubleImageType::Pointer input;
91 ShortImageType::Pointer
mask;
95 for(
unsigned int i = 0 ; i < FOS_sizes.size(); i++)
97 FOSFilerType::Pointer filter = FOSFilerType::New();
98 filter->SetNeighborhoodSize(FOS_sizes[i]);
99 filter->SetInput(input);
100 filter->SetMask(mask);
103 FOSFilerType::DataObjectPointerArray array = filter->GetOutputs();
105 for(
unsigned int i = 0; i < FunctorType::OutputCount; i++)
109 m_FeatureImageVector.push_back(featureimage);
116 filter->SetInput(input);
117 filter->SetImageMask(mask);
126 m_FeatureImageVector.push_back(o1);
127 m_FeatureImageVector.push_back(o2);
128 m_FeatureImageVector.push_back(o3);
133 filter->SetInput(input);
134 filter->SetImageMask(mask);
135 filter->SetInnerScale(1.5);
136 filter->SetOuterScale(3);
144 m_FeatureImageVector.push_back(o1);
145 m_FeatureImageVector.push_back(o2);
146 m_FeatureImageVector.push_back(o3);
151 filter->SetInput(input);
152 filter->SetImageMask(mask);
158 m_FeatureImageVector.push_back(o1);
164 std::vector<mitk::Point3D> result;
165 for(
int i = 0 ; i < mps->GetSize(); i++)
166 result.push_back(mps->GetPoint(i));
170 int main(
int argc,
char* argv[])
186 parser.
setTitle(
"Evaluationtool for Manual-Segmentation");
187 parser.
setDescription(
"Uses Datacollection to calculate DICE scores for CSF LES BRA");
191 std::map<std::string, us::Any> parsedArgs = parser.
parseArguments(argc, argv);
192 if (parsedArgs.size()==0)
195 std::string inputdir =
us::any_cast<std::string>(parsedArgs[
"inputdir"]);
196 std::string outputdir =
us::any_cast<std::string>(parsedArgs[
"outputdir"]);
197 std::string mitkprojectdata =
us::any_cast<std::string>(parsedArgs[
"mitkprojectdata"]);
198 std::string csf_mps_name =
us::any_cast<std::string>(parsedArgs[
"csfmps"]);
199 std::string les_mps_name =
us::any_cast<std::string>(parsedArgs[
"lesmps"]);
200 std::string bra_mps_name =
us::any_cast<std::string>(parsedArgs[
"bramps"]);
207 std::map<unsigned int, unsigned int>
map;
209 raw_image = map.size() <= 7 ?
dynamic_cast<mitk::Image *
>(so[0].GetPointer()) : dynamic_cast<mitk::Image *>(so[1].GetPointer());
210 class_mask = map.size() <= 7 ?
dynamic_cast<mitk::Image *
>(so[1].GetPointer()) : dynamic_cast<mitk::Image *>(so[0].GetPointer());
212 CSF_mps = mitk::IOUtil::Load<mitk::PointSet>(inputdir +
"/" + csf_mps_name);
213 LES_mps = mitk::IOUtil::Load<mitk::PointSet>(inputdir +
"/" + les_mps_name);
214 BRA_mps = mitk::IOUtil::Load<mitk::PointSet>(inputdir +
"/" + bra_mps_name);
216 unsigned int num_points = CSF_mps->GetSize() + LES_mps->GetSize() + BRA_mps->GetSize();
217 MITK_INFO <<
"Found #" << num_points <<
" points over all classes.";
221 std::map<unsigned int, unsigned int> tmpMap;
230 class_mask_sampled = class_mask->Clone();
231 itk::Image<short,3>::Pointer itk_classmask_sampled;
233 itk::ImageRegionIteratorWithIndex<itk::Image<short,3> >::IndexType index;
234 itk::ImageRegionIteratorWithIndex<itk::Image<short,3> > iit(itk_classmask_sampled,itk_classmask_sampled->GetLargestPossibleRegion());
236 std::ofstream myfile;
237 myfile.open (inputdir +
"/results_3.csv");
239 Eigen::MatrixXd X_test;
241 unsigned int count_test = 0;
243 X_test = Eigen::MatrixXd(count_test, m_FeatureImageVector.size());
245 unsigned int pos = 0;
246 for(
const auto &
image : m_FeatureImageVector)
248 X_test.col(pos) = mitk::CLUtil::Transform<double>(
image,class_mask);
252 unsigned int runs = 20;
253 for(
unsigned int k = 0 ;
k < runs;
k++)
259 itk_classmask_sampled->FillBuffer(0);
262 std::random_shuffle(CSF_vec.begin(), CSF_vec.end());
263 class_mask->GetGeometry()->WorldToIndex(CSF_vec.back(),index);
268 std::random_shuffle(LES_vec.begin(), LES_vec.end());
269 class_mask->GetGeometry()->WorldToIndex(LES_vec.back(),index);
274 std::random_shuffle(BRA_vec.begin(), BRA_vec.end());
275 class_mask->GetGeometry()->WorldToIndex(BRA_vec.back(),index);
280 std::stringstream ss;
282 while(!(CSF_vec.empty() && LES_vec.empty() && BRA_vec.empty()))
288 classifier->SetTreeCount(40);
289 classifier->SetSamplesPerTree(0.66);
291 Eigen::MatrixXd X_train;
293 unsigned int count_train = 0;
295 X_train = Eigen::MatrixXd(count_train, m_FeatureImageVector.size() );
297 unsigned int pos = 0;
298 for(
const auto &
image : m_FeatureImageVector)
300 X_train.col(pos) = mitk::CLUtil::Transform<double>(
image,class_mask_sampled);
304 Eigen::MatrixXi Y = mitk::CLUtil::Transform<int>(class_mask_sampled,class_mask_sampled);
305 classifier->Train(X_train,Y);
307 Eigen::MatrixXi Y_test = classifier->Predict(X_test);
310 itk::Image<short,3>::Pointer itk_result_mask, itk_class_mask;
315 itk::LabelOverlapMeasuresImageFilter<itk::Image<short,3> >::Pointer overlap_filter = itk::LabelOverlapMeasuresImageFilter<itk::Image<short,3> >::New();
316 overlap_filter->SetInput(0,itk_result_mask);
317 overlap_filter->SetInput(1,itk_class_mask);
318 overlap_filter->Update();
320 MITK_INFO <<
"DICE (" << num_points - (CSF_vec.size() + LES_vec.size() + BRA_vec.size()) <<
"): " << overlap_filter->GetDiceCoefficient();
321 ss << overlap_filter->GetDiceCoefficient() <<
",";
327 std::random_shuffle(CSF_vec.begin(), CSF_vec.end());
328 class_mask->GetGeometry()->WorldToIndex(CSF_vec.back(),index);
336 std::random_shuffle(LES_vec.begin(), LES_vec.end());
337 class_mask->GetGeometry()->WorldToIndex(LES_vec.back(),index);
345 std::random_shuffle(BRA_vec.begin(), BRA_vec.end());
346 class_mask->GetGeometry()->WorldToIndex(BRA_vec.back(),index);
353 myfile << ss.str() <<
"\n";
int main(int argc, char *argv[])
std::vector< mitk::Image::Pointer > m_FeatureImageVector
std::vector< mitk::Point3D > PointSetToVector(const mitk::PointSet::Pointer &mps)
void setContributor(std::string contributor)
DataCollection - Class to facilitate loading/accessing structured data.
ValueType * any_cast(Any *operand)
static void GaussianFilter(mitk::Image::Pointer image, mitk::Image::Pointer &smoothed, double sigma)
GaussianFilter.
void addArgument(const std::string &longarg, const std::string &shortarg, Type type, const std::string &argLabel, const std::string &argHelp=std::string(), const us::Any &defaultValue=us::Any(), bool optional=true, bool ignoreRest=false, bool deprecated=false, mitkCommandLineParser::Channel channel=mitkCommandLineParser::Channel::None)
std::map< std::string, us::Any > parseArguments(const StringContainerType &arguments, bool *ok=nullptr)
void ProcessFeatureImages(const mitk::Image::Pointer &raw_image, const mitk::Image::Pointer &brain_mask)
Image class for storing images.
static void ProbabilityMap(const mitk::Image::Pointer &sourceImage, double mean, double std_dev, mitk::Image::Pointer &resultImage)
ProbabilityMap.
void setCategory(std::string category)
mitk::Image::Pointer image
MITKMATCHPOINTREGISTRATION_EXPORT ResultImageType::Pointer map(const InputImageType *input, const RegistrationType *registration, bool throwOnOutOfInputAreaError=false, const double &paddingValue=0, const ResultImageGeometryType *resultGeometry=nullptr, bool throwOnMappingError=true, const double &errorValue=0, mitk::ImageMappingInterpolator::Type interpolatorType=mitk::ImageMappingInterpolator::Linear)
void setArgumentPrefix(const std::string &longPrefix, const std::string &shortPrefix)
void CastToMitkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, itk::SmartPointer< mitk::Image > &mitkoutputimage)
Cast an itk::Image (with a specific type) to an mitk::Image.
void MITKCORE_EXPORT CastToItkImage(const mitk::Image *mitkImage, itk::SmartPointer< ItkOutputImageType > &itkOutputImage)
Cast an mitk::Image to an itk::Image with a specific type.
static void MergeLabels(mitk::Image::Pointer &img, const std::map< unsigned int, unsigned int > &map)
MergeLabels.
mitk::Image::Pointer mask
void setTitle(std::string title)
static void CountVoxel(mitk::Image::Pointer image, std::map< unsigned int, unsigned int > &map)
CountVoxel.
void setDescription(std::string description)
static DataStorage::SetOfObjects::Pointer Load(const std::string &path, DataStorage &storage, const ReaderOptionsFunctorBase *optionsCallback=nullptr)
Load a file into the given DataStorage.