// Computes specificity of the model by comparing random samples of the model with the test mashes. float specificity(Logger& logger, StatisticalModelType::Pointer model, const MeshDataList& testMeshes, unsigned numberOfSamples) { // draw a number of samples and compute its distance to the closest training dataset double accumulatedDistToClosestTrainingShape = 0; for (unsigned i = 0; i < numberOfSamples; i++) { MeshType::Pointer sample = model->DrawSample(); double minDist = std::numeric_limits<double>::max(); for (MeshDataList::const_iterator it = testMeshes.begin(); it != testMeshes.end(); ++it) { MeshType::Pointer testMesh = it->first; // before we compute the distances between the meshes, we normalize the scale by scaling them // to optimally match the mean. This makes sure that models that include scale and those that have them normalized // ar etreated the same. MeshType::Pointer sampledScaledToMean = normalizeScale(sample, model->DrawMean()); MeshType::Pointer testScaledToMean = normalizeScale(testMesh, model->DrawMean()); double dist = computeAverageDistance(testScaledToMean, sampledScaledToMean, ConfigParameters::numSamplingPointsSpecificity); logger.Get(logINFO) << "distance " << dist << std::endl; if (dist < minDist) { minDist = dist; } } logger.Get(logINFO) << "closest distance for sample " << i << ": " << minDist << std::endl; accumulatedDistToClosestTrainingShape += minDist; } double avgDist = accumulatedDistToClosestTrainingShape / numberOfSamples; logger.Get(logINFO) << "average distance " << avgDist << std::endl; return avgDist; }
ImageDataList getImagesInDir (Logger& logger, std::string dirname) { ImageDataList images; itk::Directory::Pointer directory = itk::Directory::New(); directory->Load(dirname.c_str()); for (unsigned i = 0; i < directory->GetNumberOfFiles(); i++) { std::string filename(directory->GetFile(i)); if (filename.find(".vtk") != std::string::npos || filename.find(".mha") != std::string::npos) { std::string fullpath = std::string(dirname) +"/" + filename; logger.Get(logINFO) << "reading image " << fullpath << std::endl; BinaryImageType::Pointer image = readBinaryImage(fullpath); images.push_back(std::make_pair(image, fullpath)); } } return images; }