[Insight-users] itkMutualInformationImageToImageMetric
Maarten Beek
beekmaarten at yahoo.com
Wed Jun 26 09:34:20 EDT 2013
Hi all,
Is it possible to use the itkMutualInformationImageToImageMetric class by it self, to calculate mutual information values between two data sets?
I currently implemented something like below, but get positive as well as negative values.
Should I set up a full registration pipeline instead (like Examples/Registration/ImageRegistration2.cxx) and get the MI value after one iteration (optimizer->SetNumberOfIterations(1))?
Thanks Maarten
#include <vector>
#include <fstream>
#include "itkImage.h"
#include "itkMutualInformationImageToImageMetric.h"
#include "itkTranslationTransform.h"
#include "itkLinearInterpolateImageFunction.h"
const unsigned int Dimension = 1;
typedef double PixelType;
typedef itk::Image<PixelType, Dimension> ImageType;
ImageType::Pointer readData(const std::string& filename);
int main(int argc, const char* argv[])
{
typedef itk::MutualInformationImageToImageMetric<ImageType, ImageType> MetricType;
typedef itk::TranslationTransform<double, Dimension> TransformType;
typedef itk::LinearInterpolateImageFunction<ImageType, double> InterpolatorType;
TransformType::Pointer transform = TransformType::New();
transform->SetIdentity();
InterpolatorType::Pointer interpolator = InterpolatorType::New();
std::string file1 = "C:\\Users\\Maarten\\Documents\\Visual Studio 2010\\Projects\\itkMI\\files\\X2.txt";
std::string file2 = "C:\\Users\\Maarten\\Documents\\Visual Studio 2010\\Projects\\itkMI\\files\\Y2.txt";
ImageType::Pointer data1 = readData(file1);
ImageType::Pointer data2 = readData(file2);
interpolator->SetInputImage(data2);
MetricType::Pointer metric = MetricType::New();
metric->SetFixedImage(data1);
metric->SetFixedImageRegion(data1->GetLargestPossibleRegion());
metric->SetMovingImage(data2);
metric->SetTransform(transform);
metric->SetInterpolator(interpolator);
//metric->ReinitializeSeed(12345); // with constant seed value -> deterministic
//metric->SetFixedImageStandardDeviation( 0.4 );
//metric->SetMovingImageStandardDeviation( 0.4 );
const unsigned int numberOfPixels = data1->GetBufferedRegion().GetNumberOfPixels();
//metric->SetNumberOfSpatialSamples( numberOfPixels*0.1 );
MetricType::MeasureType measure = metric->GetValue(transform->GetParameters());
std::cout << "MI value: " << measure << std::endl;
return 1;
}
ImageType::Pointer readData(const std::string& filename)
{
ImageType::Pointer data = ImageType::New();
data->Initialize();
typedef itk::ImageRegionIteratorWithIndex<ImageType> IteratorType;
std::vector<double> values;
std::ifstream file(filename);
if( file.is_open() )
{
double value;
while( !file.eof() )
{
file >> value;
values.push_back(value);
}
}
unsigned int numValues = values.size();
if( 0 < numValues )
{
// maybe use itk::ImportImageFilter?
ImageType::IndexType start;
start[0] = 0;
ImageType::SizeType size;
size[0] = numValues;
ImageType::RegionType region;
region.SetSize(size);
region.SetIndex(start);
data->SetRegions(region);
data->Allocate();
ImageType::PointType origin;
origin[0] = 0.0;
data->SetOrigin(origin);
ImageType::SpacingType spacing;
spacing[0] = 1.0;
data->SetSpacing(spacing);
IteratorType it(data, data->GetLargestPossibleRegion());
int i = 0;
for ( it.GoToBegin(); !it.IsAtEnd(); ++it, ++i)
{
it.Set(values[i]);
}
}
return data;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20130626/abfe7c65/attachment.htm>
More information about the Insight-users
mailing list