X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkGammaIndex.cxx;h=7e5a92eba7cf32d67775e1910d596290c8f5eee9;hb=63bf9c1e1c6b812a8e9b5d8c6deca75d692169a0;hp=c9ceb7b1270858ec902087c20dc2027570328cc9;hpb=2b4640901e2d30671b1068519b56c80499063ad6;p=clitk.git diff --git a/tools/clitkGammaIndex.cxx b/tools/clitkGammaIndex.cxx index c9ceb7b..7e5a92e 100644 --- a/tools/clitkGammaIndex.cxx +++ b/tools/clitkGammaIndex.cxx @@ -35,6 +35,12 @@ using std::cout; #include #include #include +#include + +#include +#include +typedef itk::Image OutputImageType; +typedef itk::ImageRegionIterator OutputImageIterator; vtkImageData* loadImage(const std::string& filename) { @@ -49,13 +55,14 @@ vtkImageData* loadImage(const std::string& filename) return image; } -void saveImage(vtkImageData *image,const std::string &filename) { - cout << "saving " << filename << endl; - vtkImageWriter *writer = vtkMetaImageWriter::New(); - writer->SetFileName(filename.c_str()); - writer->SetInput(image); - writer->Write(); - writer->Delete(); +void saveImage(OutputImageType* image,const std::string &filename) { + vvImage::Pointer vvimage = vvImage::New(); + vvimage->AddItkImage(image); + + vvImageWriter::Pointer writer = vvImageWriter::New(); + writer->SetOutputFileName(filename.c_str()); + writer->SetInput(vvimage); + writer->Update(); } @@ -217,6 +224,17 @@ int main(int argc,char * argv[]) // load reference vtkImageData* reference = loadImage(reference_filename); assert(reference); + + // translate target with arguments values + // reference is translated instead of target so that the output space stay the same as target + { + double reference_origin[3]; + reference->GetOrigin(reference_origin); + reference_origin[0] -= args_info.translation_x_arg; + reference_origin[1] -= args_info.translation_y_arg; + reference_origin[2] -= args_info.translation_z_arg; + reference->SetOrigin(reference_origin); + } // intensity normalisation if (!use_dose_margin) { @@ -236,21 +254,30 @@ int main(int argc,char * argv[]) locator->BuildLocator(); // load target - vtkImageData *target = loadImage(target_filename); + vtkImageData* target = loadImage(target_filename); assert(target); + // allocate output - vtkImageData *output = vtkImageData::New(); - output->SetExtent(target->GetWholeExtent()); - output->SetOrigin(target->GetOrigin()); - output->SetSpacing(target->GetSpacing()); - output->SetScalarTypeToFloat(); - output->AllocateScalars(); + OutputImageType::Pointer output = OutputImageType::New(); + { + OutputImageType::SizeType::SizeValueType output_array_size[2]; + output_array_size[0] = target->GetDimensions()[0]; + output_array_size[1] = target->GetDimensions()[1]; + OutputImageType::SizeType output_size; + output_size.SetSize(output_array_size); + output->SetRegions(OutputImageType::RegionType(output_size)); + output->SetOrigin(target->GetOrigin()); + output->SetSpacing(target->GetSpacing()); + output->Allocate(); + } // fill output - unsigned long total = 0; + unsigned long kk = 0; unsigned long over_one = 0; - for (int kk=0; kkGetNumberOfPoints(); kk++) { + OutputImageIterator iter(output,output->GetLargestPossibleRegion()); + iter.GoToBegin(); + while (!iter.IsAtEnd()) { double *point = target->GetPoint(kk); double value = target->GetPointData()->GetScalars()->GetTuple1(kk); assert(value>=0); @@ -268,24 +295,23 @@ int main(int argc,char * argv[]) locator->FindClosestPoint(point,closest_point,cell_id,foo,squared_distance); double distance = sqrt(squared_distance); - output->GetPointData()->GetScalars()->SetTuple1(kk,distance); + iter.Set(distance); if (distance>1) over_one++; - total++; - + kk++; + ++iter; } if (verbose) { - cout << "total=" << total << endl; + cout << "total=" << kk << endl; cout << "over_one=" << over_one << endl; - cout << "ratio=" << static_cast(over_one)/total << endl; + cout << "ratio=" << static_cast(over_one)/kk << endl; } locator->Delete(); target->Delete(); saveImage(output,gamma_filename); - output->Delete(); return 0; }