@@ -289,6 +289,66 @@ ReadImage(char * fn)
289289 return target;
290290}
291291
292+
293+ template <typename TImageType>
294+ void
295+ ReadVectorImage (itk::SmartPointer<TImageType> & target, const char * file)
296+ {
297+ typedef TImageType ImageType;
298+ typedef itk::ImageFileReader<ImageType> FileSourceType;
299+
300+ typename FileSourceType::Pointer reffilter = nullptr ;
301+
302+ if (FileIsPointer (file))
303+ {
304+ void * ptr;
305+ sscanf (file, " %p" , (void **)&ptr);
306+ using Scalar = typename TImageType::PixelType::ComponentType;
307+ using VecImageType = itk::VectorImage<Scalar, TImageType::ImageDimension>;
308+ auto vecImagePtr = *(static_cast <typename VecImageType::Pointer *>(ptr));
309+ using CastFilterType = itk::CastImageFilter<VecImageType, TImageType>;
310+ typename CastFilterType::Pointer caster = CastFilterType::New ();
311+ caster->SetInput (vecImagePtr);
312+ caster->Update ();
313+ target = caster->GetOutput ();
314+ target->DisconnectPipeline ();
315+ }
316+ else
317+ {
318+ // Read the image files begin
319+ if (!ANTSFileExists (std::string (file)))
320+ {
321+ std::cerr << " file " << std::string (file) << " does not exist . " << std::endl;
322+ target = nullptr ;
323+ return ;
324+ }
325+ if (!ANTSFileIsImage (file))
326+ {
327+ std::cerr << " file " << std::string (file) << " is not recognized as a supported image format . " << std::endl;
328+ target = nullptr ;
329+ return ;
330+ }
331+
332+ reffilter = FileSourceType::New ();
333+ reffilter->SetFileName (file);
334+ try
335+ {
336+ reffilter->Update ();
337+ }
338+ catch (const itk::ExceptionObject & e)
339+ {
340+ std::cerr << " Exception caught during reference file reading " << std::endl;
341+ std::cerr << e << " file " << file << std::endl;
342+ target = nullptr ;
343+ return ;
344+ }
345+
346+ target = reffilter->GetOutput ();
347+ }
348+
349+ }
350+
351+
292352template <typename ImageType>
293353typename ImageType::Pointer
294354ReadTensorImage (char * fn, bool takelog = true , double backgroundMD = 0.0 )
@@ -752,6 +812,87 @@ WriteDisplacementField2(TField * field, std::string filename, std::string app)
752812 return ;
753813}
754814
815+ /* * Convert a displacement field to another vector type */
816+ template <typename DisplacementFieldType, typename VectorImageType>
817+ typename VectorImageType::Pointer
818+ ConvertDisplacementFieldToVectorImage (DisplacementFieldType * displacementField)
819+ {
820+ enum
821+ {
822+ ImageDimension = DisplacementFieldType::ImageDimension
823+ };
824+
825+ typename VectorImageType::Pointer vectorImage = VectorImageType::New ();
826+
827+ vectorImage->SetRegions (displacementField->GetLargestPossibleRegion ());
828+ vectorImage->SetSpacing (displacementField->GetSpacing ());
829+ vectorImage->SetOrigin (displacementField->GetOrigin ());
830+ vectorImage->SetDirection (displacementField->GetDirection ());
831+ vectorImage->SetNumberOfComponentsPerPixel (ImageDimension);
832+ vectorImage->AllocateInitialized ();
833+
834+ itk::ImageRegionIteratorWithIndex<VectorImageType> It (vectorImage,
835+ vectorImage->GetLargestPossibleRegion ());
836+
837+ for (It.GoToBegin (); !It.IsAtEnd (); ++It)
838+ {
839+ typename DisplacementFieldType::IndexType index = It.GetIndex ();
840+
841+ typename DisplacementFieldType::PixelType dispVoxel = displacementField->GetPixel (index);
842+ typename VectorImageType::PixelType vectorVoxel;
843+ vectorVoxel.SetSize (ImageDimension);
844+
845+ for (itk::SizeValueType n = 0 ; n < ImageDimension; n++)
846+ {
847+ vectorVoxel[n] = dispVoxel[n];
848+ }
849+ It.Set (vectorVoxel);
850+ }
851+
852+ return vectorImage;
853+
854+ }
855+
856+ /* * Convert a vector image to a displacement field */
857+ template <typename VectorImageType, typename DisplacementFieldType>
858+ typename DisplacementFieldType::Pointer
859+ ConvertVectorImageToDisplacementField (VectorImageType * vectorImage)
860+ {
861+ enum
862+ {
863+ ImageDimension = VectorImageType::ImageDimension
864+ };
865+
866+ typename DisplacementFieldType::Pointer displacementField = DisplacementFieldType::New ();
867+
868+ displacementField->SetRegions (vectorImage->GetLargestPossibleRegion ());
869+ displacementField->SetSpacing (vectorImage->GetSpacing ());
870+ displacementField->SetOrigin (vectorImage->GetOrigin ());
871+ displacementField->SetDirection (vectorImage->GetDirection ());
872+ displacementField->AllocateInitialized ();
873+
874+ itk::ImageRegionIteratorWithIndex<DisplacementFieldType> It (displacementField,
875+ displacementField->GetLargestPossibleRegion ());
876+
877+ for (It.GoToBegin (); !It.IsAtEnd (); ++It)
878+ {
879+ typename DisplacementFieldType::IndexType index = It.GetIndex ();
880+ typename DisplacementFieldType::PixelType dispVoxel = It.Get ();
881+ typename VectorImageType::PixelType vectorVoxel = vectorImage->GetPixel (index);
882+
883+ for (itk::SizeValueType n = 0 ; n < ImageDimension; n++)
884+ {
885+ dispVoxel[n] = vectorVoxel[n];
886+ }
887+ It.Set (dispVoxel);
888+ }
889+
890+ return displacementField;
891+
892+ }
893+
894+
895+
755896template <typename TTimeSeriesImageType, typename MultiChannelImageType>
756897typename MultiChannelImageType::Pointer
757898ConvertTimeSeriesImageToMultiChannelImage (TTimeSeriesImageType * timeSeriesImage)
0 commit comments