X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkPadImage.cxx;h=ad93eaa4b56e160c6ce1a58a52eb43c523d52bac;hb=0d94c6c40728776ea1db6347a14606b044e25abc;hp=8b6570bfcda4a64d0453dc946fe5b92a84f797be;hpb=4e01ca1a00455f4bacc778aca446bbdf2bc1c74d;p=clitk.git diff --git a/tools/clitkPadImage.cxx b/tools/clitkPadImage.cxx index 8b6570b..ad93eaa 100644 --- a/tools/clitkPadImage.cxx +++ b/tools/clitkPadImage.cxx @@ -5,6 +5,7 @@ #include "clitkCommon.h" #include "clitkPadImage_ggo.h" #include +#include "itkMath.h" enum { @@ -16,13 +17,14 @@ enum typedef unsigned int DimType; template -int pad_like(typename ImageType::Pointer input, const std::string& likeFile, PadBoundType* pad_lower, PadBoundType* pad_upper) +int pad_like(typename ImageType::Pointer input, const std::string& likeFile, PadBoundType* padLower, PadBoundType* padUpper) { typedef typename ImageType::SpacingType SpacingType; typedef typename ImageType::RegionType RegionType; typedef typename ImageType::SizeType SizeType; typedef typename ImageType::IndexType IndexType; typedef typename ImageType::PointType PointType; + typedef typename ImageType::PointValueType PointValueType; typedef itk::ImageFileReader ImageReaderType; typename ImageReaderType::Pointer reader = ImageReaderType::New(); @@ -33,27 +35,34 @@ int pad_like(typename ImageType::Pointer input, const std::string& likeFile, Pad SpacingType spacing = input->GetSpacing(), like_spacing = like_image->GetSpacing(); if (spacing != like_spacing) { - std::cerr << spacing << " " << like_spacing << std::endl; + std::cerr << "Like-image must have same spacing as input: " << spacing << " " << like_spacing << std::endl; return ERR_NOT_SAME_SPACING; } SizeType size = input->GetLargestPossibleRegion().GetSize(), like_size = like_image->GetLargestPossibleRegion().GetSize(); PointType origin = input->GetOrigin(), like_origin = like_image->GetOrigin(); - IndexType lower_bound, like_lower_bound; - SizeType upper_bound, like_upper_bound; + + PointType lower_bound, like_lower_bound; + PointType upper_bound, like_upper_bound; + PointValueType auxl = 0, auxu = 0; for (DimType i = 0; i < dim; i++) { lower_bound[i] = origin[i]; like_lower_bound[i] = like_origin[i]; - pad_lower[i] = (PadBoundType)(abs(like_lower_bound[i] - lower_bound[i])/spacing[i]); + auxl = itk::Math::Round(((lower_bound[i] - like_lower_bound[i])/spacing[i])); upper_bound[i] = (lower_bound[i] + size[i]*spacing[i]); like_upper_bound[i] = (like_lower_bound[i] + like_size[i]*spacing[i]); - pad_upper[i] = (PadBoundType)((like_upper_bound[i] - upper_bound[i])/spacing[i]); - if (pad_upper[i] < 0) - pad_upper[i] = 0; - } + auxu = itk::Math::Round(((like_upper_bound[i] - upper_bound[i])/spacing[i])); + + if (auxl < 0 || auxu < 0) { + std::cerr << "Like-image's bounding box must be larger than input's" << std::endl; + return ERR_NOT_LIKE_LARGER; + } - + padLower[i] = (PadBoundType)auxl; + padUpper[i] = (PadBoundType)auxu; + } + return ERR_SUCCESS; } @@ -65,16 +74,16 @@ int main(int argc, char** argv) typedef itk::ImageFileReader ImageReaderType; typedef itk::ImageFileWriter ImageWriterType; typedef itk::ConstantPadImageFilter PadFilterType; - typedef typename PadFilterType::SizeValueType PadBoundType; + typedef PadFilterType::SizeValueType PadBoundType; GGO(clitkPadImage, args_info); - typename ImageReaderType::Pointer reader = ImageReaderType::New(); + ImageReaderType::Pointer reader = ImageReaderType::New(); reader->SetFileName(args_info.input_arg); reader->Update(); PadBoundType pad_lower[dim], pad_upper[dim]; - typename ImageType::Pointer input = reader->GetOutput(); + ImageType::Pointer input = reader->GetOutput(); if (args_info.like_given) { int err = pad_like(input, args_info.like_arg, pad_lower, pad_upper); if (err) { @@ -89,15 +98,15 @@ int main(int argc, char** argv) } } - typename PadFilterType::Pointer filter = PadFilterType::New(); + PadFilterType::Pointer filter = PadFilterType::New(); filter->SetPadLowerBound(pad_lower); filter->SetPadUpperBound(pad_upper); filter->SetInput(input); filter->SetConstant(args_info.value_arg); filter->Update(); - typename ImageType::Pointer output = filter->GetOutput(); - typename ImageWriterType::Pointer writer = ImageWriterType::New(); + ImageType::Pointer output = filter->GetOutput(); + ImageWriterType::Pointer writer = ImageWriterType::New(); writer->SetInput(output); writer->SetFileName(args_info.output_arg); writer->Update();