<div dir="ltr"><span style="font-size:12.8000001907349px">Hi,</span><div style="font-size:12.8000001907349px">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.</div><div style="font-size:12.8000001907349px">This is my code, probably I have done some mistakes.</div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><div>#include <fstream></div><div>#include <time.h></div><div><br></div><div>#include "itkImageRegionIterator.h"</div><div>#include "itkImageFileReader.h"</div><div><br></div><div>#include "itkGDCMImageIO.h"</div><div>#include "itkPNGImageIO.h"</div><div><br></div><div>#include "itkDirectedHausdorffDistanceImageFilter.h"</div><div>#include "itkHausdorffDistanceImageFilter.h"</div><div><br></div><div><br></div><div><br></div><div>int main()</div><div>{</div><div><span style="white-space:pre-wrap">    </span></div><div><span style="white-space:pre-wrap"> </span></div><div>  typedef unsigned short PixelType1;</div><div>  typedef unsigned short PixelType2;</div><div>  const unsigned int Dimension=2;</div><div><br></div><div>  </div><div>  </div><div>  </div><div>      time_t     now = time(0);</div><div>      struct tm  tstruct;</div><div>      char       buf[80];</div><div>      tstruct = *localtime(&now);</div><div>      strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);</div><div><span style="white-space:pre-wrap">        </span>  </div><div>     std::ofstream resultfile;</div><div>      char Risultati[] = "D:/Immagini/HusdorffResul.txt";</div><div>      <span style="white-space:pre-wrap">      </span>   </div><div>    resultfile.open(Risultati, std::ios::app);  </div><div>    if (resultfile.is_open())</div><div>     {</div><div>        std::cout << "File Open exists\n";</div><div>  </div><div>     }</div><div>   </div><div><span style="white-space:pre-wrap">       </span>resultfile<<"Data :"<<buf<<std::endl;</div><div><br></div><div><br></div><div>  typedef itk::Image<PixelType1, Dimension> Image1Type;</div><div>  typedef itk::Image<PixelType2, Dimension> Image2Type;</div><div><br></div><div>  typedef itk::ImageFileReader<Image1Type> FileReaderType1;</div><div>  typedef itk::ImageFileReader<Image2Type> FileReaderType2;</div><div>  </div><div>  FileReaderType1::Pointer reader1=FileReaderType1::New();</div><div>  FileReaderType2::Pointer reader2=FileReaderType2::New();</div><div><br></div><div> </div><div>  reader1->SetFileName("D:/Images/12.png");</div><div>  reader1->SetImageIO(itk::PNGImageIO::New());</div><div><br></div><div>  reader2->SetFileName("D:/Images/240.png");</div><div>  reader2->SetImageIO(itk::PNGImageIO::New());</div><div><br></div><div>   </div><div>  typedef itk::GDCMImageIO GDCMType;</div><div>  GDCMType::Pointer gdcm=GDCMType::New();</div><div>  </div><div>  /*reader1->SetImageIO(gdcm);</div><div>  reader2->SetImageIO(gdcm);*/</div><div>  reader1->Update();</div><div>  reader2->Update();</div><div>  </div><div>  std::cout<<"Image Loading Complete!!!"<<std::endl;</div><div><br></div><div>  Image1Type::Pointer image1 = reader1->GetOutput();</div><div>  Image2Type::Pointer image2 = reader2->GetOutput();</div><div>  </div><div>   </div><div>  image1->Allocate();</div><div>  image2->Allocate();</div><div><br></div><div>  Image1Type::PointType origin1;</div><div>  Image1Type::PointType origin2;</div><div>  Image1Type::SpacingType spacing;</div><div>  origin1.Fill(0.0);</div><div>  </div><div>  spacing.Fill(1.0);</div><div>  image1->SetOrigin(origin1);</div><div>  image1->SetSpacing(spacing);</div><div>  </div><div>  </div><div>  std::cout<<"Immagini allocate in memoria"<<std::endl;</div><div><br></div><div>  </div><div>  resultfile << "Dim Immagine Fix: " << image1->GetLargestPossibleRegion().GetSize() << std::endl;</div><div>  resultfile << "Dim Immagine Mov: " << image2->GetLargestPossibleRegion().GetSize() << std::endl;</div><div>   </div><div>    </div><div><br></div><div>  image2->SetOrigin(image1->GetOrigin());</div><div>  </div><div>  image2->SetSpacing(image1->GetSpacing());</div><div>  resultfile<<"Nuova Origine Mov: "<<reader2->GetOutput()->GetOrigin()<<std::endl;</div><div> </div><div>  resultfile<<"Nuovo Spacing Mov: "<<reader2->GetOutput()->GetSpacing()<<std::endl;</div><div>  std::cout<<"Nuova Origine Mov: "<<reader2->GetOutput()->GetOrigin()<<std::endl;</div><div> </div><div>  std::cout<<"Nuovo Spacing Mov: "<<reader2->GetOutput()->GetSpacing()<<std::endl;</div><div>  </div><div>  {</div><div>  typedef itk::DirectedHausdorffDistanceImageFilter<Image1Type,Image2Type> DirectHausdType;</div><div><br></div><div>  DirectHausdType::Pointer filter1=DirectHausdType::New();</div><div><br></div><div>  filter1->SetInput1(image1);</div><div>  filter1->SetInput2(image2);</div><div>  </div><div>  filter1->SetUseImageSpacing(true);</div><div>    try</div><div>    {</div><div>    filter1->Update();</div><div><span style="white-space:pre-wrap">       </span>DirectHausdType::RealType distance=filter1->GetDirectedHausdorffDistance();</div><div>   resultfile<<"Distanza h(a,b) Immagini: "<<(double)distance<<" mm "<<std::endl;</div><div>   resultfile<<"Distanza Media h(a,b) le due Immagini mov-fix: "<<(double)filter1->GetAverageHausdorffDistance()<<" mm"<<std::endl;</div><div><br></div><div>   std::cout<<"Distanza h(a,b) Immagini: "<<(double)distance<<std::endl;</div><div>   std::cout<<"Distanza Media h(a,b) Immagini mov-fix: "<<(double)filter1->GetAverageHausdorffDistance()<<" mm "<<std::endl;</div><div><br></div><div>  </div><div>    }</div><div>    catch( itk::ExceptionObject & err )</div><div>    {</div><div>    std::cerr << "ExceptionObject caught !" << std::endl;</div><div>    std::cerr << err << std::endl;</div><div>       return EXIT_FAILURE;</div><div>    }</div><div><span style="white-space:pre-wrap"> </span></div><div>  }</div><div>  </div><div>  </div><div>  { </div><div>  typedef itk::DirectedHausdorffDistanceImageFilter<Image2Type,Image1Type> DirectHausdType2;</div><div>  DirectHausdType2::Pointer filter=DirectHausdType2::New();</div><div>  </div><div>  </div><div>  filter->SetInput1(image2);</div><div> </div><div>  filter->SetInput2(image1);</div><div>   try</div><div>    {</div><div><span style="white-space:pre-wrap">            </span>filter->SetUseImageSpacing(true);</div><div>    filter->Update();</div><div><span style="white-space:pre-wrap">    </span>DirectHausdType2::RealType distance=filter->GetDirectedHausdorffDistance();</div><div>    resultfile<<"Distanza h(b,a) Immagini: "<<(double)distance<<" mm "<<std::endl;</div><div>    resultfile<<"Distanza media h(b,a) Immagini fix-mov: "<<(double)filter->GetAverageHausdorffDistance()<<" mm"<<std::endl;</div><div><br></div><div><span style="white-space:pre-wrap">       </span>std::cout<<"Distanza tra le due Immagini: "<<(double)distance<<std::endl;</div><div>    std::cout<<"Distanza media le due Immagini fix-mov: "<<(double)filter->GetAverageHausdorffDistance()<<std::endl;</div><div>    }</div><div>    catch( itk::ExceptionObject & err )</div><div>    {</div><div>    std::cerr << "ExceptionObject caught !" << std::endl;</div><div>    std::cerr << err << std::endl;</div><div>       return EXIT_FAILURE;</div><div>    }</div><div> </div><div>   }</div><div> </div><div>  //  Hausdorff distance H(image1,image2)</div><div>  {</div><div>  typedef itk::HausdorffDistanceImageFilter<Image1Type,Image2Type> FilterType;</div><div>  FilterType::Pointer filter = FilterType::New();</div><div><br></div><div>  filter->SetInput1( image1 );</div><div>  filter->SetInput2( image2 );</div><div>  try{</div><div><br></div><div>  filter->SetUseImageSpacing(true);</div><div>  filter->Update();</div><div>   FilterType::RealType distance = filter->GetHausdorffDistance();</div><div>  resultfile << " H(a,b) Distanza Hausdorff " << (double)distance <<" mm "<< std::endl;</div><div>  resultfile << " H(a,b) Distanza Hausdorff Media " << filter->GetAverageHausdorffDistance() << " mm "<< std::endl;</div><div><br></div><div>  std::cout << " H(a,b) Distanza Hausdorff " << (double)distance << std::endl;</div><div>  std::cout << " H(a,b) Distanza Hausdorff Media " << filter->GetAverageHausdorffDistance() << std::endl;</div><div><br></div><div>  }catch( itk::ExceptionObject & err )</div><div>    {</div><div>    std::cerr << "ExceptionObject caught !" << std::endl;</div><div>    std::cerr << err << std::endl;</div><div>       return EXIT_FAILURE;</div><div>    }</div><div><br></div><div>  </div><div>  </div><div><br></div><div> </div><div>  }</div><div>  //  Hausdorff distance H(image2,image1)</div><div>  {</div><div>  typedef itk::HausdorffDistanceImageFilter<Image2Type,Image1Type> FilterType;</div><div>  FilterType::Pointer filter = FilterType::New();</div><div><br></div><div>  filter->SetInput1( image2 );</div><div>  filter->SetInput2( image1 );</div><div>  </div><div>  </div><div>  try{</div><div>  filter->SetUseImageSpacing(true);</div><div>  filter->Update();</div><div>  </div><div>  FilterType::RealType distance = filter->GetHausdorffDistance();</div><div>  resultfile << " H(b,a) Distanza Hausdorff " << (double)distance <<" mm "<< std::endl;</div><div>  resultfile << " H(b,a) Distanza Hausdorff Media " << (double)filter->GetAverageHausdorffDistance() <<" mm "<< std::endl;</div><div><br></div><div>  std::cout << " H(b,a) Distanza Hausdorff " << (double)distance << std::endl;</div><div>  std::cout << " H(b,a) Distanza Hausdorff Media " << (double) filter->GetAverageHausdorffDistance() << std::endl;</div><div><br></div><div>  }</div><div>  catch( itk::ExceptionObject & err )</div><div>  {</div><div>    std::cerr << "ExceptionObject caught !" << std::endl;</div><div>    std::cerr << err << std::endl;</div><div>       return EXIT_FAILURE;</div><div>  }</div><div><br></div><div> </div><div>  </div><div>  </div><div>  }</div><div><br></div><div>  resultfile.close();</div><div>  return EXIT_SUCCESS; </div><div>  </div><div>  </div><div>}</div></div></div>