diff --git a/Testing/Code/IO/CMakeLists.txt b/Testing/Code/IO/CMakeLists.txt index 8ccf9ab209c27f21d2436cb8ffb61334ecb651ee..71c2900977f4ca7bf585b078249ec545ee790236 100644 --- a/Testing/Code/IO/CMakeLists.txt +++ b/Testing/Code/IO/CMakeLists.txt @@ -2707,6 +2707,33 @@ ADD_TEST(ioTvTileMapImageIOHelperTest ${IO_TESTS21} ${TEMP}/ioTvTileMapImageIOHelperTest.txt ) +ADD_TEST(ioTvImageDoubleToImageComplex ${IO_TESTS21} + otbImageDoubleToImageComplex + ${INPUTDATA}/monobandunsignedchar.png +) + +ADD_TEST(ioTvImageComplexToImageDouble ${IO_TESTS21} + otbImageComplexToImageDouble + ${INPUTDATA}/monobandComplexDouble.hdr +) + +ADD_TEST(ioTvImageComplexToImageComplex ${IO_TESTS21} + otbImageComplexToImageComplex + ${INPUTDATA}/monobandComplexDouble.hdr +) + +ADD_TEST(ioTvImageComplexToVectorImageDouble ${IO_TESTS21} + otbImageComplexToVectorImageDouble + ${INPUTDATA}/monobandComplexDouble.hdr +) + +ADD_TEST(ioTvImageComplexToVectorImageComplex ${IO_TESTS21} + otbImageComplexToVectorImageComplex + ${INPUTDATA}/monobandComplexDouble.hdr +) + + + #---------------------------------------------------------------------------------- SET(BasicIO_SRCS1 otbIOTests1.cxx @@ -2918,6 +2945,7 @@ otbIOTests21.cxx otbMapFileProductWriterNew.cxx otbMapFileProductWriter.cxx otbTileMapImageIOHelperTest.cxx +otbComplexImageManipulationTest.cxx ) diff --git a/Testing/Code/IO/otbComplexImageManipulationTest.cxx b/Testing/Code/IO/otbComplexImageManipulationTest.cxx new file mode 100644 index 0000000000000000000000000000000000000000..8f00552f996a352525e673337974d4f370a29521 --- /dev/null +++ b/Testing/Code/IO/otbComplexImageManipulationTest.cxx @@ -0,0 +1,289 @@ +/*========================================================================= + + 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 <complex> + +#include "otbImageFileReader.h" +//#include "otbImageFileWriter.h" +#include "otbImage.h" +#include "otbVectorImage.h" +#include "otbMacro.h" +#include "itkImageRegionIteratorWithIndex.h" +#include "itkImageRegionIterator.h" + + +int otbImageDoubleToImageComplex(int argc, char * argv[]) +{ + typedef double RealType; + typedef std::complex<RealType> PixelType; + typedef otb::Image<PixelType, 2> CplxImageType; + //typedef otb::Image<RealType, 2> ScalImageType; + + typedef otb::ImageFileReader<CplxImageType> ReaderType; + + + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + + CplxImageType::IndexType id; + CplxImageType::SizeType size; + CplxImageType::RegionType region; + + id.Fill(0); + size[0] = 10; + size[1] = 1; + + region.SetSize( size ); + region.SetIndex( id ); + + reader->GetOutput()->SetRequestedRegion(region); + reader->Update(); + + itk::ImageRegionIteratorWithIndex<CplxImageType> it( reader->GetOutput(), region ); + + it.GoToBegin(); + while( it.IsAtEnd()==false ) + { + if(it.Get().real() != static_cast<RealType>(it.GetIndex()[0])) + { + std::cout<<"Image double read as Image complex error : read real part "<<it.Get().real()<<", waited for "<<it.GetIndex()[0]<<"."<<std::endl; + + return EXIT_FAILURE; + } + else if(it.Get().imag() != static_cast<RealType>(0)) + { + std::cout<<"Image double read as Image complex error : read imaginary part "<<it.Get().imag()<<", waited for "<<0<<"."<<std::endl; + + return EXIT_FAILURE; + } + + ++it; + } + + + return EXIT_SUCCESS; +} + + +int otbImageComplexToImageDouble(int argc, char * argv[]) +{ + typedef double RealType; + typedef otb::Image<RealType, 2> ScalImageType; + + typedef otb::ImageFileReader<ScalImageType> ReaderType; + + + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + + ScalImageType::IndexType id; + ScalImageType::SizeType size; + ScalImageType::RegionType region; + + id.Fill(0); + size[0] = 10; + size[1] = 1; + + region.SetSize( size ); + region.SetIndex( id ); + + reader->GetOutput()->SetRequestedRegion(region); + reader->Update(); + + itk::ImageRegionIterator<ScalImageType> it( reader->GetOutput(), region ); + + unsigned int count = 0; + it.GoToBegin(); + while( it.IsAtEnd()==false ) + { + double norm = vcl_sqrt(static_cast<double>(count*count + (count+1)*(count+1))); + if(it.Get() != static_cast<RealType>(norm)) + { + std::cout<<"Image complex read as Image double error : waited for norm "<<it.Get()<<", waited for "<<norm<<"."<<std::endl; + + return EXIT_FAILURE; + } + count += 2; + ++it; + } + + + return EXIT_SUCCESS; +} + + + +int otbImageComplexToImageComplex(int argc, char * argv[]) +{ + typedef double RealType; + typedef std::complex<RealType> PixelType; + typedef otb::Image<PixelType, 2> CplxImageType; + + typedef otb::ImageFileReader<CplxImageType> ReaderType; + + + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + + CplxImageType::IndexType id; + CplxImageType::SizeType size; + CplxImageType::RegionType region; + + id.Fill(0); + size[0] = 10; + size[1] = 1; + + region.SetSize( size ); + region.SetIndex( id ); + + reader->GetOutput()->SetRequestedRegion(region); + reader->Update(); + + itk::ImageRegionIterator<CplxImageType> it( reader->GetOutput(), region ); + + unsigned int count = 0; + it.GoToBegin(); + while( it.IsAtEnd()==false ) + { + if(it.Get().real() != static_cast<RealType>(count)) + { + std::cout<<"Image double read as Image complex error in real part: "<<it.Get()<<", waited for ("<<count<<", "<<count+1<<")"<<std::endl; + + return EXIT_FAILURE; + } + else if(it.Get().imag() != static_cast<RealType>(count+1) ) + { + std::cout<<"Image double read as Image complex error in imaginary part: "<<it.Get()<<", waited for ("<<count<<", "<<count+1<<")"<<std::endl; + + return EXIT_FAILURE; + } + + count += 2; + + ++it; + } + + + return EXIT_SUCCESS; + +} + + +int otbImageComplexToVectorImageDouble(int argc, char * argv[]) +{ + typedef double RealType; + typedef otb::VectorImage<RealType, 2> ScalVectorImageType; + + typedef otb::ImageFileReader<ScalVectorImageType> ReaderType; + + + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + + ScalVectorImageType::IndexType id; + ScalVectorImageType::SizeType size; + ScalVectorImageType::RegionType region; + + id.Fill(0); + size[0] = 10; + size[1] = 1; + + region.SetSize( size ); + region.SetIndex( id ); + + reader->GetOutput()->SetRequestedRegion(region); + reader->Update(); + + itk::ImageRegionIterator<ScalVectorImageType> it( reader->GetOutput(), region ); + + unsigned int count = 0; + it.GoToBegin(); + while( it.IsAtEnd()==false ) + { + if(it.Get()[0] != static_cast<RealType>(count)) + { + std::cout<<"Image double read as Image complex error read real part: "<<it.Get()[0]<<", waited for "<<count<<"."<<std::endl; + + return EXIT_FAILURE; + } + else if(it.Get()[1] != static_cast<RealType>(count+1)) + { + std::cout<<"Image double read as Image complex error : read imaginary part: "<<it.Get()[1]<<", waited for "<<count<<"."<<std::endl; + + return EXIT_FAILURE; + } + + count += 2; + ++it; + } + + + return EXIT_SUCCESS; +} + + +int otbImageComplexToVectorImageComplex(int argc, char * argv[]) +{ + typedef double RealType; + typedef std::complex<RealType> PixelType; + typedef otb::VectorImage<PixelType, 2> CmplxVectorImageType; + typedef otb::ImageFileReader<CmplxVectorImageType> ReaderType; + + + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + + CmplxVectorImageType::IndexType id; + CmplxVectorImageType::SizeType size; + CmplxVectorImageType::RegionType region; + + id.Fill(0); + size[0] = 10; + size[1] = 1; + + region.SetSize( size ); + region.SetIndex( id ); + + reader->GetOutput()->SetRequestedRegion(region); + reader->Update(); + + itk::ImageRegionIterator<CmplxVectorImageType> it( reader->GetOutput(), region ); + + unsigned int count = 0; + it.GoToBegin(); + while( it.IsAtEnd()==false ) + { + if(it.Get()[0].real() != static_cast<RealType>(count)) + { + std::cout<<"Image double read as Image complex error : read real part "<<it.Get()[0].real()<<", waited for "<<count<<"."<<std::endl; + + return EXIT_FAILURE; + } + else if(it.Get()[0].imag() != static_cast<RealType>(count+1)) + { + std::cout<<"Image double read as Image complex error : read imaginary part "<<it.Get()[0].imag()<<", waited for "<<count<<"."<<std::endl; + + return EXIT_FAILURE; + } + + count += 2; + ++it; + } + + + return EXIT_SUCCESS; +} diff --git a/Testing/Code/IO/otbIOTests21.cxx b/Testing/Code/IO/otbIOTests21.cxx index e1e7d5c7b6f7daabab2d0b4a404cd2eb55ac5b2f..acfc3100779dc758ec92e2b5ed2451b4cb760643 100644 --- a/Testing/Code/IO/otbIOTests21.cxx +++ b/Testing/Code/IO/otbIOTests21.cxx @@ -30,4 +30,10 @@ void RegisterTests() REGISTER_TEST(otbMapFileProductWriter); REGISTER_TEST(otbTileMapImageIOHelperNew); REGISTER_TEST(otbTileMapImageIOHelperTest); + // Complex tests + REGISTER_TEST(otbImageDoubleToImageComplex); + REGISTER_TEST(otbImageComplexToImageDouble); + REGISTER_TEST(otbImageComplexToImageComplex); + REGISTER_TEST(otbImageComplexToVectorImageDouble); + REGISTER_TEST(otbImageComplexToVectorImageComplex); }