int
main(int argc, char * argv[])
{
if (argc < 3)
{
std::cerr << "Missing command line arguments" << std::endl;
std::cerr << "Usage : ImageMutualInformation1 inputImage1 inputImage2 "
<< std::endl;
return EXIT_FAILURE;
}
using PixelComponentType = unsigned char;
ReaderType::Pointer reader1 = ReaderType::New();
ReaderType::Pointer reader2 = ReaderType::New();
reader1->SetFileName(argv[1]);
reader2->SetFileName(argv[2]);
JoinFilterType::Pointer joinFilter = JoinFilterType::New();
joinFilter->SetInput1(reader1->GetOutput());
joinFilter->SetInput2(reader2->GetOutput());
try
{
joinFilter->Update();
}
catch (const itk::ExceptionObject & excp)
{
std::cerr << excp << std::endl;
return EXIT_FAILURE;
}
using VectorImageType = JoinFilterType::OutputImageType;
using HistogramFilterType =
HistogramFilterType::Pointer histogramFilter = HistogramFilterType::New();
histogramFilter->SetInput(joinFilter->GetOutput());
histogramFilter->SetMarginalScale(10.0);
using HistogramSizeType = HistogramFilterType::HistogramSizeType;
HistogramSizeType size(2);
size[0] = 255;
size[1] = 255;
histogramFilter->SetHistogramSize(size);
using HistogramMeasurementVectorType =
HistogramFilterType::HistogramMeasurementVectorType;
HistogramMeasurementVectorType binMinimum(3);
HistogramMeasurementVectorType binMaximum(3);
binMinimum[0] = -0.5;
binMinimum[1] = -0.5;
binMinimum[2] = -0.5;
binMaximum[0] = 255.5;
binMaximum[1] = 255.5;
binMaximum[2] = 255.5;
histogramFilter->SetHistogramBinMinimum(binMinimum);
histogramFilter->SetHistogramBinMaximum(binMaximum);
histogramFilter->Update();
using HistogramType = HistogramFilterType::HistogramType;
const HistogramType * histogram = histogramFilter->GetOutput();
HistogramType::ConstIterator itr = histogram->Begin();
HistogramType::ConstIterator end = histogram->End();
const double Sum = histogram->GetTotalFrequency();
double JointEntropy = 0.0;
while (itr != end)
{
const double count = itr.GetFrequency();
if (count > 0.0)
{
const double probability = count / Sum;
JointEntropy += -probability * std::log(probability) / std::log(2.0);
}
++itr;
}
std::cout << "Joint Entropy = " << JointEntropy << " bits "
<< std::endl;
size[0] = 255;
size[1] = 1;
histogramFilter->SetHistogramSize(size);
histogramFilter->Update();
itr = histogram->Begin();
end = histogram->End();
double Entropy1 = 0.0;
while (itr != end)
{
const double count = itr.GetFrequency();
if (count > 0.0)
{
const double probability = count / Sum;
Entropy1 += -probability * std::log(probability) / std::log(2.0);
}
++itr;
}
std::cout << "Image1 Entropy = " << Entropy1 << " bits " << std::endl;
size[0] = 1;
size[1] = 255;
histogramFilter->SetHistogramSize(size);
histogramFilter->Update();
itr = histogram->Begin();
end = histogram->End();
double Entropy2 = 0.0;
while (itr != end)
{
const double count = itr.GetFrequency();
if (count > 0.0)
{
const double probability = count / Sum;
Entropy2 += -probability * std::log(probability) / std::log(2.0);
}
++itr;
}
std::cout << "Image2 Entropy = " << Entropy2 << " bits " << std::endl;
double MutualInformation = Entropy1 + Entropy2 - JointEntropy;
std::cout << "Mutual Information = " << MutualInformation << " bits "
<< std::endl;
double NormalizedMutualInformation1 =
2.0 * MutualInformation / (Entropy1 + Entropy2);
std::cout << "Normalized Mutual Information 1 = "
<< NormalizedMutualInformation1 << std::endl;
double NormalizedMutualInformation2 = (Entropy1 + Entropy2) / JointEntropy;
std::cout << "Normalized Mutual Information 2 = "
<< NormalizedMutualInformation2 << std::endl;
return EXIT_SUCCESS;
}