Skip to content
Snippets Groups Projects
Commit e66a46eb authored by Otmane Lahlou's avatar Otmane Lahlou
Browse files

ENH: add ComplexOutputImage Parameter

parent 91853cbc
No related branches found
No related tags found
No related merge requests found
/*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt 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.
=========================================================================*/
#include "otbWrapperComplexOutputImageParameter.h"
#include "itkCastImageFilter.h"
#include "itkVectorCastImageFilter.h"
namespace otb
{
namespace Wrapper
{
ComplexOutputImageParameter::ComplexOutputImageParameter()
: m_ComplexPixelType(ComplexImagePixelType_float)
{
this->SetName("Complex Output Image");
this->SetKey("cout");
}
ComplexOutputImageParameter::~ComplexOutputImageParameter()
{
}
void ComplexOutputImageParameter::InitializeWriters()
{
m_ComplexFloatWriter = ComplexFloatWriterType::New();
m_ComplexDoubleWriter = ComplexDoubleWriterType::New();
m_ComplexVectorFloatWriter = ComplexVectorFloatWriterType::New();
m_ComplexVectorDoubleWriter = ComplexVectorDoubleWriterType::New();
}
#define otbCastAndWriteImageMacro(InputImageType, OutputImageType, writer) \
{ \
typedef itk::CastImageFilter<InputImageType, OutputImageType> CastFilterType; \
typename CastFilterType::Pointer caster = CastFilterType::New(); \
caster->SetInput( dynamic_cast<InputImageType*>(m_Image.GetPointer()) ); \
caster->InPlaceOn(); \
writer->SetFileName( this->GetFileName() ); \
writer->SetInput(caster->GetOutput()); \
writer->Update(); \
}
template <class TInputImageType>
void
ComplexOutputImageParameter::SwitchImageWrite()
{
switch(m_ComplexPixelType )
{
case ComplexImagePixelType_float:
{
otbCastAndWriteImageMacro(TInputImageType, ComplexFloatImageType, m_ComplexFloatWriter);
break;
}
case ComplexImagePixelType_double:
{
otbCastAndWriteImageMacro(TInputImageType, ComplexDoubleImageType, m_ComplexDoubleWriter);
break;
}
}
}
template <class TInputVectorImageType>
void
ComplexOutputImageParameter::SwitchVectorImageWrite()
{
switch(m_ComplexPixelType )
{
case ComplexImagePixelType_float:
{
otbCastAndWriteImageMacro(TInputVectorImageType, ComplexFloatVectorImageType, m_ComplexVectorFloatWriter);
break;
}
case ComplexImagePixelType_double:
{
otbCastAndWriteImageMacro(TInputVectorImageType, ComplexDoubleVectorImageType, m_ComplexVectorDoubleWriter);
break;
}
}
}
void
ComplexOutputImageParameter::Write()
{
m_Image->UpdateOutputInformation();
if (dynamic_cast<ComplexFloatImageType*>(m_Image.GetPointer()))
{
SwitchImageWrite<ComplexFloatImageType>();
}
else if (dynamic_cast<ComplexDoubleImageType*>(m_Image.GetPointer()))
{
SwitchImageWrite<DoubleImageType>();
}
else if (dynamic_cast<ComplexFloatVectorImageType*>(m_Image.GetPointer()))
{
SwitchVectorImageWrite<ComplexFloatVectorImageType>();
}
else if (dynamic_cast<ComplexDoubleVectorImageType*>(m_Image.GetPointer()))
{
SwitchVectorImageWrite<ComplexDoubleVectorImageType>();
}
else
{
itkExceptionMacro("Unknown complex image type");
}
}
itk::ProcessObject*
ComplexOutputImageParameter::GetWriter()
{
int type = 0;
// 0 : image
// 1 : VectorImage
if ( dynamic_cast<FloatVectorImageType*>( m_Image.GetPointer()) ||
dynamic_cast<DoubleVectorImageType*>(m_Image.GetPointer()))
{
type = 1;
}
itk::ProcessObject* writer = 0;
switch ( GetComplexPixelType() )
{
case ComplexImagePixelType_float:
{
if( type == 1 )
writer = m_ComplexVectorFloatWriter;
else
writer = m_ComplexFloatWriter;
break;
}
case ComplexImagePixelType_double:
{
if( type == 1 )
writer = m_ComplexVectorDoubleWriter;
else
writer = m_ComplexDoubleWriter;
break;
}
}
return writer;
}
ComplexOutputImageParameter::ImageBaseType*
ComplexOutputImageParameter::GetValue( )
{
return m_Image;
}
void
ComplexOutputImageParameter::SetValue(ImageBaseType* image)
{
m_Image = image;
SetActive(true);
}
bool
ComplexOutputImageParameter::HasValue() const
{
std::string filename(this->GetFileName());
return !filename.empty();
}
}
}
/*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt 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 __otbWrapperComplexOutputImageParameter_h
#define __otbWrapperComplexOutputImageParameter_h
#include "itkImageBase.h"
#include "otbWrapperParameter.h"
#include "otbStreamingImageFileWriter.h"
namespace otb
{
namespace Wrapper
{
/** \class ComplexOutputImageParameter
* \brief This class represents a ComplexOutputImage parameter
*/
class ITK_EXPORT ComplexOutputImageParameter : public Parameter
{
public:
/** Standard class typedef */
typedef ComplexOutputImageParameter Self;
typedef Parameter Superclass;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
typedef itk::ImageBase<2> ImageBaseType;
/** Defining ::New() static method */
itkNewMacro(Self);
/** RTTI support */
itkTypeMacro(ComplexOutputImageParameter, Parameter);
/** Set the value */
itkSetObjectMacro(Image, ImageBaseType);
/** Get the value */
itkGetObjectMacro(Image, ImageBaseType);
/** Return any value */
void SetValue(ImageBaseType* image);
/** Return any value */
ImageBaseType* GetValue( void );
/** Set/Get PixelType to be used when saving */
itkSetMacro(ComplexPixelType, ComplexImagePixelType);
itkGetMacro(ComplexPixelType, ComplexImagePixelType);
/** Return true if a filename is set */
bool HasValue() const;
void SetFileName (const char* filename)
{
m_FileName = filename;
SetActive(true);
}
void SetFileName (const std::string& filename)
{
this->SetFileName(filename.c_str());
}
itkGetStringMacro(FileName);
void Write();
itk::ProcessObject* GetWriter();
void InitializeWriters();
protected:
/** Constructor */
ComplexOutputImageParameter();
/** Destructor */
virtual ~ComplexOutputImageParameter();
template <class TInputImageType>
void SwitchImageWrite();
template <class TInputVectorImageType>
void SwitchVectorImageWrite();
//FloatVectorImageType::Pointer m_Image;
ImageBaseType::Pointer m_Image;
std::string m_FileName;
ComplexImagePixelType m_ComplexPixelType;
typedef otb::StreamingImageFileWriter<ComplexFloatImageType> ComplexFloatWriterType;
typedef otb::StreamingImageFileWriter<ComplexDoubleImageType> ComplexDoubleWriterType;
typedef otb::StreamingImageFileWriter<ComplexFloatVectorImageType> ComplexVectorFloatWriterType;
typedef otb::StreamingImageFileWriter<ComplexDoubleVectorImageType> ComplexVectorDoubleWriterType;
ComplexFloatWriterType::Pointer m_ComplexFloatWriter;
ComplexDoubleWriterType::Pointer m_ComplexDoubleWriter;
ComplexVectorFloatWriterType::Pointer m_ComplexVectorFloatWriter;
ComplexVectorDoubleWriterType::Pointer m_ComplexVectorDoubleWriter;
private:
ComplexOutputImageParameter(const Parameter &); //purposely not implemented
void operator =(const Parameter&); //purposely not implemented
}; // End class OutputImage Parameter
} // End namespace Wrapper
} // End namespace otb
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment