[ITK-users] husdorff distance measure
stefano serviddio
s.serviddio at gmail.com
Mon Sep 28 17:52:11 EDT 2015
Hi,
I'm trying to measure Husdorff distance between two dicom/png image for
evaluating the difference before and after registration, but I have a weird
result because, also I see that the images are exactly aligned the husdroff
distance increases instead decreases.
This is my code, probably I have done some mistakes.
#include <fstream>
#include <time.h>
#include "itkImageRegionIterator.h"
#include "itkImageFileReader.h"
#include "itkGDCMImageIO.h"
#include "itkPNGImageIO.h"
#include "itkDirectedHausdorffDistanceImageFilter.h"
#include "itkHausdorffDistanceImageFilter.h"
int main()
{
typedef unsigned short PixelType1;
typedef unsigned short PixelType2;
const unsigned int Dimension=2;
time_t now = time(0);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
std::ofstream resultfile;
char Risultati[] = "D:/Immagini/HusdorffResul.txt";
resultfile.open(Risultati, std::ios::app);
if (resultfile.is_open())
{
std::cout << "File Open exists\n";
}
resultfile<<"Data :"<<buf<<std::endl;
typedef itk::Image<PixelType1, Dimension> Image1Type;
typedef itk::Image<PixelType2, Dimension> Image2Type;
typedef itk::ImageFileReader<Image1Type> FileReaderType1;
typedef itk::ImageFileReader<Image2Type> FileReaderType2;
FileReaderType1::Pointer reader1=FileReaderType1::New();
FileReaderType2::Pointer reader2=FileReaderType2::New();
reader1->SetFileName("D:/Images/12.png");
reader1->SetImageIO(itk::PNGImageIO::New());
reader2->SetFileName("D:/Images/240.png");
reader2->SetImageIO(itk::PNGImageIO::New());
typedef itk::GDCMImageIO GDCMType;
GDCMType::Pointer gdcm=GDCMType::New();
/*reader1->SetImageIO(gdcm);
reader2->SetImageIO(gdcm);*/
reader1->Update();
reader2->Update();
std::cout<<"Image Loading Complete!!!"<<std::endl;
Image1Type::Pointer image1 = reader1->GetOutput();
Image2Type::Pointer image2 = reader2->GetOutput();
image1->Allocate();
image2->Allocate();
Image1Type::PointType origin1;
Image1Type::PointType origin2;
Image1Type::SpacingType spacing;
origin1.Fill(0.0);
spacing.Fill(1.0);
image1->SetOrigin(origin1);
image1->SetSpacing(spacing);
std::cout<<"Immagini allocate in memoria"<<std::endl;
resultfile << "Dim Immagine Fix: " <<
image1->GetLargestPossibleRegion().GetSize() << std::endl;
resultfile << "Dim Immagine Mov: " <<
image2->GetLargestPossibleRegion().GetSize() << std::endl;
image2->SetOrigin(image1->GetOrigin());
image2->SetSpacing(image1->GetSpacing());
resultfile<<"Nuova Origine Mov:
"<<reader2->GetOutput()->GetOrigin()<<std::endl;
resultfile<<"Nuovo Spacing Mov:
"<<reader2->GetOutput()->GetSpacing()<<std::endl;
std::cout<<"Nuova Origine Mov:
"<<reader2->GetOutput()->GetOrigin()<<std::endl;
std::cout<<"Nuovo Spacing Mov:
"<<reader2->GetOutput()->GetSpacing()<<std::endl;
{
typedef itk::DirectedHausdorffDistanceImageFilter<Image1Type,Image2Type>
DirectHausdType;
DirectHausdType::Pointer filter1=DirectHausdType::New();
filter1->SetInput1(image1);
filter1->SetInput2(image2);
filter1->SetUseImageSpacing(true);
try
{
filter1->Update();
DirectHausdType::RealType distance=filter1->GetDirectedHausdorffDistance();
resultfile<<"Distanza h(a,b) Immagini: "<<(double)distance<<" mm
"<<std::endl;
resultfile<<"Distanza Media h(a,b) le due Immagini mov-fix:
"<<(double)filter1->GetAverageHausdorffDistance()<<" mm"<<std::endl;
std::cout<<"Distanza h(a,b) Immagini: "<<(double)distance<<std::endl;
std::cout<<"Distanza Media h(a,b) Immagini mov-fix:
"<<(double)filter1->GetAverageHausdorffDistance()<<" mm "<<std::endl;
}
catch( itk::ExceptionObject & err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
}
{
typedef itk::DirectedHausdorffDistanceImageFilter<Image2Type,Image1Type>
DirectHausdType2;
DirectHausdType2::Pointer filter=DirectHausdType2::New();
filter->SetInput1(image2);
filter->SetInput2(image1);
try
{
filter->SetUseImageSpacing(true);
filter->Update();
DirectHausdType2::RealType distance=filter->GetDirectedHausdorffDistance();
resultfile<<"Distanza h(b,a) Immagini: "<<(double)distance<<" mm
"<<std::endl;
resultfile<<"Distanza media h(b,a) Immagini fix-mov:
"<<(double)filter->GetAverageHausdorffDistance()<<" mm"<<std::endl;
std::cout<<"Distanza tra le due Immagini: "<<(double)distance<<std::endl;
std::cout<<"Distanza media le due Immagini fix-mov:
"<<(double)filter->GetAverageHausdorffDistance()<<std::endl;
}
catch( itk::ExceptionObject & err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
}
// Hausdorff distance H(image1,image2)
{
typedef itk::HausdorffDistanceImageFilter<Image1Type,Image2Type>
FilterType;
FilterType::Pointer filter = FilterType::New();
filter->SetInput1( image1 );
filter->SetInput2( image2 );
try{
filter->SetUseImageSpacing(true);
filter->Update();
FilterType::RealType distance = filter->GetHausdorffDistance();
resultfile << " H(a,b) Distanza Hausdorff " << (double)distance <<" mm
"<< std::endl;
resultfile << " H(a,b) Distanza Hausdorff Media " <<
filter->GetAverageHausdorffDistance() << " mm "<< std::endl;
std::cout << " H(a,b) Distanza Hausdorff " << (double)distance <<
std::endl;
std::cout << " H(a,b) Distanza Hausdorff Media " <<
filter->GetAverageHausdorffDistance() << std::endl;
}catch( itk::ExceptionObject & err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
}
// Hausdorff distance H(image2,image1)
{
typedef itk::HausdorffDistanceImageFilter<Image2Type,Image1Type>
FilterType;
FilterType::Pointer filter = FilterType::New();
filter->SetInput1( image2 );
filter->SetInput2( image1 );
try{
filter->SetUseImageSpacing(true);
filter->Update();
FilterType::RealType distance = filter->GetHausdorffDistance();
resultfile << " H(b,a) Distanza Hausdorff " << (double)distance <<" mm
"<< std::endl;
resultfile << " H(b,a) Distanza Hausdorff Media " <<
(double)filter->GetAverageHausdorffDistance() <<" mm "<< std::endl;
std::cout << " H(b,a) Distanza Hausdorff " << (double)distance <<
std::endl;
std::cout << " H(b,a) Distanza Hausdorff Media " << (double)
filter->GetAverageHausdorffDistance() << std::endl;
}
catch( itk::ExceptionObject & err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
}
resultfile.close();
return EXIT_SUCCESS;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20150928/dfe399c8/attachment-0001.html>
More information about the Insight-users
mailing list