AW: [Insight-users] How to transfer a set of 2D image data to a 3D image data?

Luis Ibanez luis.ibanez at kitware.com
Fri, 06 Feb 2004 08:37:55 -0500


Hideaki, Chunyan,

My apologies for swaping your names.

I meant to address the message to Hideaki.

That's what happens when people answer
emails in state of caffeine depletion...


Regards,


   Luis


---------------
jiang wrote:

> Hi Luis,
> I'm sorry that the JoinSeriesImageFilter<> is not posted by me. It is posted
> by Hideaki Hiraki. So I can not contribute this code. You can ask Hideaki
> Hiraki to handle it if you like.
> 
> Best regards,
> 
> chunyan
> 
> -----Ursprungliche Nachricht-----
> Von: insight-users-admin at itk.org [mailto:insight-users-admin at itk.org]Im
> Auftrag von Luis Ibanez
> Gesendet: Donnerstag, 5. Februar 2004 23:09
> An: HIRAKI Hideaki
> Cc: jiang at TI.Uni-Trier.DE; insight-users at itk.org
> Betreff: Re: [Insight-users] How to transfer a set of 2D image data to a
> 3D image data?
> 
> 
> 
> Hi Chunyan,
> 
> The JoinSeriesImageFilter<> that you posted
> to the list looks like a very useful filter.
> 
> Would you be willing to contribute this
> code to ITK ?
> 
> 
> Please let us know,
> 
> 
> Thanks
> 
> 
>     Luis
> 
> 
> 
> -------------------------
> HIRAKI Hideaki wrote:
> 
> 
>>vtkImageAppend in VTK can do it.
>>But if you want to process with itk::Image,
>>the attached code may help you.
>>
>>Regards,
>>
>>Hideaki Hiraki
>>
>>
>>"jiang" <jiang at TI.Uni-Trier.DE> wrote:
>>
>>
>>>Dear itk-users,
>>>I have a set of 2D image data. The type is, for example:
>>> typedef   unsigned char                      PixelType;
>>> typedef   itk::Image< InputPixelType, 2 >    ImageType;
>>>
>>>Now I want to transfer them to 3D image data:
>>> typedef   itk::Image< InputPixelType, 3 >    VolumeType;
>>>
>>>Then transfer the volume to vtk data in order to render it. How should I
> 
> do?
> 
>>>
>>>Thanks a lot!
>>>
>>>
>>>
>>>Chunyan
>>>
>>>
>>>
>>>------------------------------------------------------------------------
>>>
>>>/*========================================================================
> 
> =
> 
>>> Program:   Insight Segmentation & Registration Toolkit
>>> Module:    $RCSfile$
>>> Language:  C++
>>> Date:      $Date$
>>> Version:   $Revision$
>>>
>>> Copyright (c) Insight Software Consortium. All rights reserved.
>>> See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for
> 
> details.
> 
>>>    This software is distributed WITHOUT ANY WARRANTY; without even
>>>    the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
>>>    PURPOSE.  See the above copyright notices for more information.
>>>
>>>=========================================================================*
> 
> /
> 
>>>#ifndef __itkJoinSeriesImageFilter_h
>>>#define __itkJoinSeriesImageFilter_h
>>>
>>>#include "itkImageToImageFilter.h"
>>>
>>>namespace itk
>>>{
>>>
>>>/** \class JoinSeriesImageFilter
>>>* \brief Join N-D images into an (N+1)-D image
>>>*
>>>* Details should be described here.
>>>*
>>>* \ingroup GeometricTransforms
>>>*
>>>*/
>>>template <class TInputImage, class TOutputImage>
>>>class ITK_EXPORT JoinSeriesImageFilter:
>>>   public ImageToImageFilter<TInputImage,TOutputImage>
>>>{
>>>public:
>>> /** Standard class typedefs. */
>>> typedef JoinSeriesImageFilter  Self;
>>> typedef ImageToImageFilter<TInputImage,TOutputImage>  Superclass;
>>> typedef SmartPointer<Self>  Pointer;
>>> typedef SmartPointer<const Self>  ConstPointer;
>>>
>>> /** Method for creation through the object factory. */
>>> itkNewMacro(Self);
>>>
>>> /** Run-time type information (and related methods). */
>>> itkTypeMacro(JoinSeriesImageFilter, ImageToImageFilter);
>>>
>>> /** Compiler can't inherit typedef? */
>>> typedef typename Superclass::InputImageType InputImageType;
>>> typedef typename Superclass::OutputImageType OutputImageType;
>>> typedef typename InputImageType::Pointer InputImagePointer;
>>> typedef typename OutputImageType::Pointer OutputImagePointer;
>>> typedef typename InputImageType::RegionType InputImageRegionType;
>>> typedef typename OutputImageType::RegionType OutputImageRegionType;
>>>
>>> /** Compiler can't inherit ImageDimension enumeration? */
>>> itkStaticConstMacro(InputImageDimension, unsigned int,
>>>                     TInputImage::ImageDimension);
>>> itkStaticConstMacro(OutputImageDimension, unsigned int,
>>>                     TOutputImage::ImageDimension);
>>>
>>> /** IndexValueType is used to switch among the inputs and
>>>  * is used as the index value of the new dimension */
>>> typedef unsigned int IndexValueType;
>>>
>>> /** Set/Get spacing of the new dimension */
>>> itkSetMacro(Spacing, double);
>>> itkGetMacro(Spacing, double);
>>>
>>> /** Set/Get origin of the new dimension */
>>> itkSetMacro(Origin, double);
>>> itkGetMacro(Origin, double);
>>>
>>>protected:
>>> JoinSeriesImageFilter();
>>> ~JoinSeriesImageFilter() {};
>>> void PrintSelf(std::ostream& os, Indent indent) const;
>>>
>>> /** Overrides GenerateOutputInformation() in order to produce
>>>  * an image which has a different information than the first input.
>>>  * \sa ProcessObject::GenerateOutputInformaton() */
>>> virtual void GenerateOutputInformation();
>>>
>>> /** Overrides GenerateInputRequestedRegion() in order to inform
>>>  * the pipeline execution model of different input requested regions
>>>  * than the output requested region.
>>>  * \sa ImageToImageFilter::GenerateInputRequestedRegion() */
>>> virtual void GenerateInputRequestedRegion();
>>>
>>> /** JoinSeriesImageFilter can be implemented as a multithreaded filter.
>>>  * \sa ImageSource::ThreadedGenerateData(),
>>>  *     ImageSource::GenerateData() */
>>> virtual void ThreadedGenerateData(const OutputImageRegionType&
>>>                                   outputRegionForThread, int threadId );
>>>
>>>private:
>>> JoinSeriesImageFilter(const Self&); //purposely not implemented
>>> void operator=(const Self&); //purposely not implemented
>>>
>>> double m_Spacing;
>>> double m_Origin;
>>>
>>>};
>>>
>>>
>>>} // end namespace itk
>>>
>>>#ifndef ITK_MANUAL_INSTANTIATION
>>>#include "itkJoinSeriesImageFilter.txx"
>>>#endif
>>>
>>>#endif
>>>
>>>
>>>------------------------------------------------------------------------
>>>
>>>#ifndef _itkJoinSeriesImageFilter_txx
>>>#define _itkJoinSeriesImageFilter_txx
>>>
>>>#include "itkJoinSeriesImageFilter.h"
>>>#include "itkProgressReporter.h"
>>>#include "itkImageRegionConstIterator.h"
>>>#include "itkImageRegionIterator.h"
>>>
>>>namespace itk
>>>{
>>>
>>>template <class TInputImage, class TOutputImage>
>>>JoinSeriesImageFilter<TInputImage,TOutputImage>
>>>::JoinSeriesImageFilter()
>>>{
>>> m_Spacing = 1.0;
>>> m_Origin = 0.0;
>>>}
>>>
>>>
>>>template <class TInputImage, class TOutputImage>
>>>void
>>>JoinSeriesImageFilter<TInputImage,TOutputImage>
>>>::PrintSelf(std::ostream& os, Indent indent) const
>>>{
>>> Superclass::PrintSelf(os,indent);
>>>
>>> os << indent << "Spacing: " << m_Spacing << std::endl;
>>> os << indent << "Origin: " << m_Origin << std::endl;
>>>}
>>>
>>>/**
>>>* \sa UnaryFunctorImageFilter::GenerateOutputInformation()
>>>*/
>>>template <class TInputImage, class TOutputImage>
>>>void
>>>JoinSeriesImageFilter<TInputImage,TOutputImage>
>>>::GenerateOutputInformation()
>>>{
>>> // do not call the superclass' implementation of this method since
>>> // this filter allows the input the output to be of different dimensions
>>>
>>> // get pointers to the input and output
>>> typename Superclass::OutputImagePointer      outputPtr =
> 
> this->GetOutput();
> 
>>> typename Superclass::InputImageConstPointer  inputPtr  =
> 
> this->GetInput();
> 
>>> if ( !outputPtr || !inputPtr)
>>>   {
>>>   return;
>>>   }
>>>
>>> // Set the output image largest possible region.  Use a RegionCopier
>>> // so that the input and output images can be different dimensions.
>>> OutputImageRegionType outputLargestPossibleRegion;
>>> this->CallCopyInputRegionToOutputRegion(outputLargestPossibleRegion,
>>>
> 
> inputPtr->GetLargestPossibleRegion());
> 
>>> // for the new dimension, assuming the index has been set 0.
>>> outputLargestPossibleRegion.SetSize(InputImageDimension,
>>>                                     this->GetNumberOfInputs());
>>>
>>> outputPtr->SetLargestPossibleRegion( outputLargestPossibleRegion );
>>>
>>> // Set the output spacing and origin
>>> const ImageBase<InputImageDimension> *phyData;
>>>
>>> phyData
>>>   = dynamic_cast<const
> 
> ImageBase<InputImageDimension>*>(this->GetInput());
> 
>>> if (phyData)
>>>   {
>>>   // Copy what we can from the image from spacing and origin of the
> 
> input
> 
>>>   // This logic needs to be augmented with logic that select which
>>>   // dimensions to copy
>>>   unsigned int i;
>>>   const typename InputImageType::SpacingType&
>>>     inputSpacing = inputPtr->GetSpacing();
>>>   const typename InputImageType::PointType&
>>>     inputOrigin = inputPtr->GetOrigin();
>>>
>>>   typename OutputImageType::SpacingType outputSpacing;
>>>   typename OutputImageType::PointType outputOrigin;
>>>
>>>   // copy the input to the output and fill the rest of the
>>>   // output with zeros.
>>>   for (i=0; i < InputImageDimension; ++i)
>>>     {
>>>     outputSpacing[i] = inputSpacing[i];
>>>     outputOrigin[i] = inputOrigin[i];
>>>     }
>>>   for (; i < OutputImageDimension; ++i)
>>>     {
>>>     outputSpacing[i] = 1.0;
>>>     outputOrigin[i] = 0.0;
>>>     }
>>>
>>>   // for the new dimension
>>>   outputSpacing[InputImageDimension] = this->GetSpacing();
>>>   outputOrigin[InputImageDimension] = this->GetOrigin();
>>>
>>>   // set the spacing and origin
>>>   outputPtr->SetSpacing( outputSpacing );
>>>   outputPtr->SetOrigin( outputOrigin );
>>>   }
>>> else
>>>   {
>>>   // pointer could not be cast back down
>>>   itkExceptionMacro(<<
> 
> "itk::JoinSeriesImageFilter::GenerateOutputInformation "
> 
>>>                     << "cannot cast input to "
>>>                     << typeid(ImageBase<InputImageDimension>*).name() );
>>>   }
>>>}
>>>
>>>
>>>template <class TInputImage, class TOutputImage>
>>>void
>>>JoinSeriesImageFilter<TInputImage,TOutputImage>
>>>::GenerateInputRequestedRegion()
>>>{
>>> Superclass::GenerateInputRequestedRegion();
>>>
>>> OutputImageRegionType outputRegion =
> 
> this->GetOutput()->GetRequestedRegion();
> 
>>> IndexValueType begin = outputRegion.GetIndex(InputImageDimension);
>>> IndexValueType end = begin + outputRegion.GetSize(InputImageDimension);
>>> for (IndexValueType idx = 0; idx < this->GetNumberOfInputs(); ++idx)
>>>   {
>>>   InputImagePointer inputPtr =
>>>     const_cast<InputImageType *>(this->GetInput(idx));
>>>   if ( !inputPtr )
>>>     {
>>>     itkExceptionMacro(<< "missing input " << idx);
>>>     }
>>>
>>>   InputImageRegionType inputRegion; // assuming default is null
>>>   if ( begin <= idx && idx < end )
>>>     {
>>>     this->CallCopyOutputRegionToInputRegion(inputRegion, outputRegion);
>>>     }
>>>   inputPtr->SetRequestedRegion(inputRegion);
>>>   }
>>>}
>>>
>>>
>>>template <class TInputImage, class TOutputImage>
>>>void
>>>JoinSeriesImageFilter<TInputImage,TOutputImage>
>>>::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread,
>>>                      int threadId)
>>>{
>>> itkDebugMacro(<<"Actually executing");
>>>
>>> ProgressReporter progress(this, threadId,
> 
> outputRegionForThread.GetNumberOfPixels());
> 
>>> OutputImageRegionType outputRegion = outputRegionForThread;
>>> outputRegion.SetSize(InputImageDimension, 1);
>>>
>>> InputImageRegionType inputRegion;
>>> this->CallCopyOutputRegionToInputRegion(inputRegion,
> 
> outputRegionForThread);
> 
>>> IndexValueType begin =
> 
> outputRegionForThread.GetIndex(InputImageDimension);
> 
>>> IndexValueType end =
>>>   begin + outputRegionForThread.GetSize(InputImageDimension);
>>> for (IndexValueType idx = begin; idx < end; ++idx)
>>>   {
>>>   outputRegion.SetIndex(InputImageDimension, idx);
>>>   ImageRegionIterator<OutputImageType>
>>>     outIt(this->GetOutput(), outputRegion);
>>>   ImageRegionConstIterator<InputImageType>
>>>     inIt(this->GetInput(idx), inputRegion);
>>>   outIt.GoToBegin();
>>>   inIt.GoToBegin();
>>>   while( !outIt.IsAtEnd() )
>>>     {
>>>     outIt.Set( inIt.Get() );
>>>     ++outIt;
>>>     ++inIt;
>>>     progress.CompletedPixel();
>>>     }
>>>   }
>>>}
>>>
>>>
>>>} // end namespace itk
>>>
>>>#endif
> 
> 
> 
> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
> 
>