#ifndef __errorStatistics_txx #define __errorStatistics_txx #include "errorStatistics.h" #include //Constructors: template errorStatistics::errorStatistics(): m_Percentage(.85), trim_bottom(0){ } template errorStatistics::errorStatistics(typename InputImageType::Pointer image1, typename Edge1Type::Pointer edge_image): m_Image1(image1), m_EdgeImage1(edge_image), m_EdgeImage1Region(m_EdgeImage1->GetRequestedRegion()), m_Image1Region(m_Image1->GetRequestedRegion()),trim_bottom(0){ } template errorStatistics::errorStatistics(typename InputImageType::Pointer image1,typename Edge1Type::Pointer edge_image, double percentage): m_Image1(image1), m_EdgeImage1(edge_image), m_Percentage(percentage), m_EdgeImage1Region(m_EdgeImage1->GetRequestedRegion()), m_Image1Region(m_Image1->GetRequestedRegion()),trim_bottom(0){ } //Member Functions: //Set Functions: template void errorStatistics::SetImage1(typename InputImageType::Pointer image1){ m_Image1 = image1; } template void errorStatistics::SetEdgeImage1(typename Edge1Type::Pointer image1){ m_EdgeImage1 = image1; } template void errorStatistics::SetPercentage(double percentage){ m_Percentage = percentage; } template void errorStatistics::SetImage1Region(typename InputImageType::RegionType region){ m_Image1Region = region; } template void errorStatistics::SetEdgeImage1Region(typename Edge1Type::RegionType region){ m_EdgeImage1Region = region; } //ComputeValues() ////////////////////////////// //Function to get distance metrics template void errorStatistics::ComputeValues(){ //initialize metrics double RMS = 0.0; //First put all distances in a vector std::vector allDistancesAcc; ConstIteratorType Iter1(m_Image1, m_Image1Region); EdgeConstIteratorType eIter(m_EdgeImage1,m_EdgeImage1Region); for(Iter1.GoToBegin(),eIter.GoToBegin();!Iter1.IsAtEnd();++Iter1, ++eIter){ if(eIter.Get()>0){ double dist = 0; dist = Iter1.Get(); if(dist >= 0){ RMS+=dist*dist; allDistancesAcc.push_back(dist); } } } int i; double numMeasurements = allDistancesAcc.size(); std::sort(allDistancesAcc.begin(),allDistancesAcc.end()); // max double max = allDistancesAcc[(unsigned)(numMeasurements-1)]; // Partial max metric double Pmax = allDistancesAcc[(unsigned)(numMeasurements*m_Percentage-1)]; double rec_perc = 1.-m_Percentage; double AvgDistance = 0.0; double LTSDistance = 0.0; double MDistance = 0.0; double mean = 0.0; //Get robust metrics for(std::vector::const_iterator mI=allDistancesAcc.begin(); mI!=allDistancesAcc.end();mI++) mean += *mI; mean /= numMeasurements; // IP-A(AVG) // Trim the bottom and top of the measurement vector unsigned firstItem; firstItem = unsigned(numMeasurements*(1.-m_Percentage)/2.); for(std::vector::const_iterator mI=allDistancesAcc.begin()+firstItem; mI!=allDistancesAcc.end()-firstItem;mI++) AvgDistance += *mI; AvgDistance /= numMeasurements*m_Percentage; // M-estimated Distance // double thresh = 0; if(trim_bottom){ thresh = allDistancesAcc[unsigned(numMeasurements*(1.-m_Percentage))]; for(std::vector::const_iterator mI=allDistancesAcc.begin(); mI!=allDistancesAcc.end();mI++){ double distance = *mI; if(distance::const_iterator mI=allDistancesAcc.begin(); mI!=allDistancesAcc.end();mI++){ double distance = *mI; if(distance>thresh) MDistance += thresh; else MDistance += distance; } } MDistance /= numMeasurements; //IP-LTS // Least Trimmed Squares // if(trim_bottom){ unsigned lastItem; lastItem = unsigned(numMeasurements*(1.-m_Percentage)); for(std::vector::const_iterator mI=allDistancesAcc.begin()+lastItem; mI!=allDistancesAcc.end();mI++){ LTSDistance += *mI; } LTSDistance /= numMeasurements*m_Percentage; } else{ unsigned lastItem; lastItem = unsigned(numMeasurements*m_Percentage); for(std::vector::const_iterator mI=allDistancesAcc.begin(); mI!=allDistancesAcc.begin()+lastItem;mI++){ LTSDistance += *mI; } LTSDistance /= numMeasurements*m_Percentage; } //LMS, least median squares double LMS=0.0; double min = 2000; unsigned endItem; endItem = unsigned(numMeasurements*(.5)); for(int x = 0;x