diff --git a/Code/IO/otbGDALImageIO.cxx b/Code/IO/otbGDALImageIO.cxx index a636e1dbed0ac5fc19829186903b933727bfd6d5..5b28202c049904cdd35ea1c99bb1449e128968f3 100644 --- a/Code/IO/otbGDALImageIO.cxx +++ b/Code/IO/otbGDALImageIO.cxx @@ -264,56 +264,6 @@ void GDALImageIO::Read(void* buffer) } } - else if (GDALDataTypeIsComplex(m_PxType) && !m_IsComplex) - { - // Mise a jour du step - std::streamoff step = static_cast<std::streamoff>(this->GetNumberOfComponents()); - - step = step * static_cast<std::streamoff>(m_BytePerPixel); - - std::streamoff lNbPixels = (static_cast<std::streamoff>(lNbColumns)) - * (static_cast<std::streamoff>(lNbLines)); - std::streamoff lBufferSize = static_cast<std::streamoff>(m_BytePerPixel) * lNbPixels; - lBufferSize *= 2; - - unsigned char* value = new unsigned char[lBufferSize]; - - for (int nbComponents = 0; nbComponents < dataset->GetRasterCount(); ++nbComponents) - { - CPLErr lCrGdal = dataset->GetRasterBand(nbComponents+1)->RasterIO(GF_Read, - lFirstColumn, - lFirstLine, - lNbColumns, - lNbLines, - value, - lNbColumns, - lNbLines, - m_PxType, - 0, - 0); - if (lCrGdal == CE_Failure) - { - itkExceptionMacro(<< "Error while reading image (GDAL format) " << m_FileName.c_str() << "."); - } - // Recopie dans le buffer - std::streamoff cpt(0); - //cpt = static_cast<std::streamoff>(nbComponents) * static_cast<std::streamoff>(m_BytePerPixel); - cpt = static_cast<std::streamoff>(nbComponents*2*m_BytePerPixel*2); - for (std::streamoff i = 0; i < lBufferSize; i = i + static_cast<std::streamoff>(m_BytePerPixel*2)) - { - memcpy((void*) (&(p[cpt])), - (const void*) (&(value[i])), - (size_t) (m_BytePerPixel)); //Real part - memcpy((void*) (&(p[cpt+m_BytePerPixel*2])), - (const void*) (&(value[i+m_BytePerPixel])), - (size_t) (m_BytePerPixel)); //Imaginary part - cpt += step*2; - } - } - delete[] value; - } - - // In the indexed case, one has to retrieve the index image and the // color table, and translate p to a 4 components color values buffer else if (m_IsIndexed) @@ -361,12 +311,37 @@ void GDALImageIO::Read(void* buffer) else { // Nominal case + + // In some cases, we need to change some parameters for RasterIO + // if the file is complex and the reader is based on a vector of scalar + if(GDALDataTypeIsComplex(m_PxType) && !m_IsComplex && m_IsVectorImage) + { + m_BytePerPixel = m_BytePerPixel * 2 ; + m_NbBands = this->GetNumberOfComponents() / 2; + } + // if the file is scalar with only one band and the reader is based on a vector of complex + if(!GDALDataTypeIsComplex(m_PxType) && (m_NbBands == 1) && m_IsComplex && m_IsVectorImage ) + { + m_BytePerPixel = m_BytePerPixel / 2 ; + } + + // keep it for the moment + /*std::cout << "*** GDALimageIO::Read: nominal case ***"<<std::endl; + std::cout << "Paremeters RasterIO :" \ + << ", indX = " << lFirstColumn \ + << ", indY = " << lFirstLine \ + << ", sizeX = " << lNbColumns \ + << ", sizeY = " << lNbLines \ + << ", GDAL Data Type = " << GDALGetDataTypeName(m_PxType) \ + << ", nb Band to read = " << m_NbBands \ + << ", nb BytePerPixel = " << m_BytePerPixel <<std::endl;*/ + CPLErr lCrGdal = m_Dataset->GetDataSet()->RasterIO(GF_Read, lFirstColumn, lFirstLine, lNbColumns, lNbLines, - p, + p, // pData lNbColumns, lNbLines, m_PxType, @@ -589,8 +564,7 @@ void GDALImageIO::InternalReadImageInformation() //Once all sorts of gdal complex image are handle, this won't be //necessary any more if (GDALDataTypeIsComplex(m_PxType) //TODO should disappear - && (m_PxType != GDT_CFloat32) - && (m_PxType != GDT_CFloat64)) + && (m_PxType != GDT_CFloat32) && (m_PxType != GDT_CFloat64)) { m_BytePerPixel = m_BytePerPixel * 2; this->SetNumberOfComponents(2); @@ -610,16 +584,35 @@ void GDALImageIO::InternalReadImageInformation() } } - if(GDALDataTypeIsComplex(m_PxType) && !m_IsComplex) + if (GDALDataTypeIsComplex(m_PxType) && !m_IsComplex && m_IsVectorImage) { // we are reading a complex data set into an image where the pixel - // type is not complex: we have to double the number of component + // type is Vector<real>: we have to double the number of component // for that to work + //std::cout << "GDALtypeIO = complex and OTB::OutputPixelType = double and OTB::PixelType = Vector" << std::endl; m_BytePerPixel = m_BytePerPixel / 2; this->SetNumberOfComponents(m_NbBands*2); this->SetPixelType(VECTOR); } + if (!GDALDataTypeIsComplex(m_PxType) && m_IsComplex && m_IsVectorImage) + { + // we are reading a non-complex data set into an image where the pixel + // type is Vector<complex>: we have to double the number of byte per pixel + // for that to work + //std::cout << "GDALtypeIO = double and OTB::OutputPixelType = complex and OTB::PixelType = Vector" << std::endl; + m_BytePerPixel = m_BytePerPixel * 2; + this->SetPixelType(VECTOR); + } + + /* keep it for the moment + * std::cout << " *** Parameters set in Internal Read function ***" << std::endl; + std::cout << " Pixel Type GDAL = " << GDALGetDataTypeName(m_PxType) << std::endl; + std::cout << " Pixel Type otb = " << GetPixelTypeAsString(this->GetPixelType()) << std::endl; + std::cout << " Number of band in file = " << m_NbBands << std::endl; + std::cout << " Number of component otb = " << this->GetNumberOfComponents() << std::endl; + std::cout << " Byte per pixel = " << m_BytePerPixel << std::endl; + std::cout << " Component Type otb = " << GetComponentTypeAsString(this->GetComponentType()) <<std::endl;*/ /*----------------------------------------------------------------------*/ /*-------------------------- METADATA ----------------------------------*/ diff --git a/Code/IO/otbGDALImageIO.h b/Code/IO/otbGDALImageIO.h index c05023ab8c0ebb082a90cdf41f7aeab92f729efa..e3e090c419530996c71fff6c9c2879ae2fc68c79 100644 --- a/Code/IO/otbGDALImageIO.h +++ b/Code/IO/otbGDALImageIO.h @@ -76,6 +76,10 @@ public: itkSetMacro(IsComplex, bool); itkGetMacro(IsComplex, bool); + /** Set/Get whether the pixel type (otb side) is Vector or Scalar */ + itkSetMacro(IsVectorImage, bool); + itkGetMacro(IsVectorImage, bool); + /** Set/Get the dataset index to extract (starting at 0)*/ itkSetMacro(DatasetNumber, unsigned int); itkGetMacro(DatasetNumber, unsigned int); @@ -175,6 +179,9 @@ private: * this information has to be provided by the reader */ bool m_IsComplex; + /** Whether the pixel type (otb side, not gdal side) is Vector + * this information has to be provided by the reader */ + bool m_IsVectorImage; }; diff --git a/Code/IO/otbImageFileReader.txx b/Code/IO/otbImageFileReader.txx index 3d63902742cbfd67f7bbfb8a920b39f5f56be6e2..318173a8e48f0886824473cdbcb385f0e64ed119 100644 --- a/Code/IO/otbImageFileReader.txx +++ b/Code/IO/otbImageFileReader.txx @@ -174,7 +174,11 @@ ImageFileReader<TOutputImage> * static_cast<std::streamoff>(region.GetNumberOfPixels()); char * loadBuffer = new char[nbBytes]; - + /*std::cout<< "*** IFReader : read with conversion ***" << std::endl; + std::cout<< "size of Buffer to GDALImageIO::read = " << nbBytes << " = " \ + << "ComponentSize ("<< this->m_ImageIO->GetComponentSize() << ") x " \ + << "Nb of Component (" << this->m_ImageIO->GetNumberOfComponents() << ") x " \ + << "Nb of Pixel to read (" << region.GetNumberOfPixels() << ")" << std::endl;*/ this->m_ImageIO->Read(loadBuffer); this->DoConvertBuffer(loadBuffer, region.GetNumberOfPixels()); @@ -289,6 +293,12 @@ ImageFileReader<TOutputImage> OutputImagePixelType dummy; imageIO->SetIsComplex(PixelIsComplex(dummy)); + // VectorImage ?? + if (strcmp(output->GetNameOfClass(), "VectorImage") == 0) + imageIO->SetIsVectorImage(true); + else + imageIO->SetIsVectorImage(false); + // Pass the dataset number (used for hdf files for example) imageIO->SetDatasetNumber(m_DatasetNumber); } diff --git a/Testing/Code/IO/CMakeLists.txt b/Testing/Code/IO/CMakeLists.txt index 9b9d1d1f4b77146a75a8e072beab33db85a11393..0fe61eda6be045630d61795d04d5de7528bcf74f 100644 --- a/Testing/Code/IO/CMakeLists.txt +++ b/Testing/Code/IO/CMakeLists.txt @@ -2788,71 +2788,138 @@ ADD_TEST(ioTvTileMapImageIOHelperTest ${IO_TESTS21} ${TEMP}/ioTvTileMapImageIOHelperTest.txt ) -ADD_TEST(ioTvImageDoubleToImageComplex ${IO_TESTS21} +# Tests about complex reading +ADD_TEST(ioTvImageDoubleToImageComplex ${IO_TESTS21} # OK otbImageDoubleToImageComplex ${INPUTDATA}/monobandDouble.tif ) -ADD_TEST(ioTvImageComplexToImageDouble ${IO_TESTS21} +ADD_TEST(ioTvImageComplexToImageDouble ${IO_TESTS21} # OK otbImageComplexToImageDouble ${INPUTDATA}/monobandComplexDouble ) -ADD_TEST(ioTvImageComplexToImageComplex ${IO_TESTS21} +ADD_TEST(ioTvImageComplexToImageComplex ${IO_TESTS21} # OK otbImageComplexToImageComplex ${INPUTDATA}/monobandComplexDouble.hdr ) -ADD_TEST(ioTvImageComplexToVectorImageDouble ${IO_TESTS21} +ADD_TEST(ioTvImageComplexToVectorImageDouble ${IO_TESTS21} # OK otbImageComplexToVectorImageDouble ${INPUTDATA}/monobandComplexDouble.hdr ) -ADD_TEST(ioTvImageComplexToVectorImageComplex ${IO_TESTS21} +ADD_TEST(ioTvImageComplexToVectorImageComplex ${IO_TESTS21} # OK otbImageComplexToVectorImageComplex ${INPUTDATA}/monobandComplexDouble.hdr ) -ADD_TEST(ioTvVectorImageDoubleToImageComplex ${IO_TESTS21} +ADD_TEST(ioTvVectorImageDoubleToImageComplex ${IO_TESTS21} # OK otbVectorImageDoubleToImageComplex ${INPUTDATA}/multibandDouble.tif ) -ADD_TEST(ioTvVectorImageDoubleToVectorImageComplex ${IO_TESTS21} +ADD_TEST(ioTvVectorImageDoubleToVectorImageComplex ${IO_TESTS21} #OK otbVectorImageDoubleToVectorImageComplex ${INPUTDATA}/multibandDouble.tif ) -ADD_TEST(ioTvVectorImageComplexToVectorImageDouble ${IO_TESTS21} +ADD_TEST(ioTvVectorImageComplexToVectorImageDouble ${IO_TESTS21} #OK otbVectorImageComplexToVectorImageDouble ${INPUTDATA}/multibandComplexDouble.hdr ) -ADD_TEST(ioTvVectorImageComplexToVectorImageComplex ${IO_TESTS21} +ADD_TEST(ioTvVectorImageComplexToVectorImageComplex ${IO_TESTS21} # OK otbVectorImageComplexToVectorImageComplex ${INPUTDATA}/multibandComplexDouble.hdr ) -ADD_TEST(ioTvImageDoubleToVectorImageComplex ${IO_TESTS21} +ADD_TEST(ioTvImageDoubleToVectorImageComplex ${IO_TESTS21} # OK otbImageDoubleToVectorImageComplex ${INPUTDATA}/monobandDouble.tif ) -ADD_TEST(ioTvVectorImageComplexToImageDouble_2bands ${IO_TESTS21} +ADD_TEST(ioTvVectorImageComplexToVectorImageDouble_3bands ${IO_TESTS21} #OK + otbVectorImageComplexToVectorImageDouble + ${INPUTDATA}/multibandComplexDouble_3bands.hdr +) + +# Weird cases +ADD_TEST(ioTvVectorImageComplexToImageDouble_2bands ${IO_TESTS21} #KO otbVectorImageComplexToImageDouble ${INPUTDATA}/multibandComplexDouble.hdr ) -ADD_TEST(ioTvVectorImageComplexToImageDouble_3bands ${IO_TESTS21} +ADD_TEST(ioTvVectorImageComplexToImageDouble_3bands ${IO_TESTS21} # KO otbVectorImageComplexToImageDouble - ${INPUTDATA}/multi3bandsDouble.hdr + ${INPUTDATA}/multibandComplexDouble_3bands.hdr ) -ADD_TEST(ioTvVectorImageComplexToImageDouble_4bands ${IO_TESTS21} +ADD_TEST(ioTvVectorImageComplexToImageDouble_4bands ${IO_TESTS21} #KO otbVectorImageComplexToImageDouble - ${INPUTDATA}/mono3bandsDouble.hdr + ${INPUTDATA}/multibandComplexDouble_4bands.hdr ) +# Tests with GDAL only (not deal for this commit) +#ADD_TEST(ioTvGDALReadPxlComplexDbMono ${IO_TESTS21} +# --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexDbMono.txt +# ${TEMP}/ioTvGDALReadPxlComplexDbMono_Out.txt +# otbGDALReadPxlComplexDb +# ${INPUTDATA}/monobandComplexDouble +# 1 1 +# ${TEMP}/ioTvGDALReadPxlComplexDbMono_Out.txt +#) +#ADD_TEST(ioTvGDALReadPxlComplexDbMulti ${IO_TESTS21} +# --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexDbMulti.txt +# ${TEMP}/ioTvGDALReadPxlComplexDbMulti_Out.txt +# otbGDALReadPxlComplexDb +# ${INPUTDATA}/multibandComplexDouble +# 1 1 +# ${TEMP}/ioTvGDALReadPxlComplexDbMulti_Out.txt +#) +#ADD_TEST(ioTvGDALReadPxlComplexDbMulti3 ${IO_TESTS21} +# --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexDbMulti3.txt +# ${TEMP}/ioTvGDALReadPxlComplexDbMulti3_Out.txt +# otbGDALReadPxlComplexDb +# ${INPUTDATA}/multibandComplexDouble_3bands +# 100 100 +# ${TEMP}/ioTvGDALReadPxlComplexDbMulti3_Out.txt +#) +#ADD_TEST(ioTvGDALReadPxlComplexDbMulti4 ${IO_TESTS21} +# --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexDbMulti4.txt +# ${TEMP}/ioTvGDALReadPxlComplexDbMulti4_Out.txt +# otbGDALReadPxlComplexDb +# ${INPUTDATA}/multibandComplexDouble_4bands +# 0 0 +# ${TEMP}/ioTvGDALReadPxlComplexDbMulti4_Out.txt +#) +# +# +#ADD_TEST(ioTvGDALReadPxlComplexFlMulti ${IO_TESTS21} +# --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexFlMulti.txt +# ${TEMP}/ioTvGDALReadPxlComplexFlMulti_Out.txt +# otbGDALReadPxlComplexFl +# ${INPUTDATA}/multibandComplexFloat +# 100 100 +# ${TEMP}/ioTvGDALReadPxlComplexFlMulti_Out.txt +#) +#ADD_TEST(ioTvGDALReadPxlComplexFlMulti3 ${IO_TESTS21} +# --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexFlMulti3.txt +# ${TEMP}/ioTvGDALReadPxlComplexFlMulti3_Out.txt +# otbGDALReadPxlComplexFl +# ${INPUTDATA}/multibandComplexFloat_3bands +# 100 100 +# ${TEMP}/ioTvGDALReadPxlComplexFlMulti3_Out.txt +#) +#ADD_TEST(ioTvGDALReadPxlComplexFlMulti4 ${IO_TESTS21} +# --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexFlMulti4.txt +# ${TEMP}/ioTvGDALReadPxlComplexFlMulti4_Out.txt +# otbGDALReadPxlComplexFl +# ${INPUTDATA}/multibandComplexFloat_4bands +# 100 100 +# ${TEMP}/ioTvGDALReadPxlComplexFlMulti4_Out.txt +#) + #---------------------------------------------------------------------------------- SET(BasicIO_SRCS1 otbIOTests1.cxx @@ -3062,6 +3129,9 @@ otbMapFileProductWriter.cxx otbKmzProductWriter.cxx otbTileMapImageIOHelperTest.cxx otbComplexImageManipulationTest.cxx +#not deal in this commit +#otbGDALReadPxlComplexDb.cxx +#otbGDALReadPxlComplexFl.cxx ) diff --git a/Testing/Code/IO/otbComplexImageManipulationTest.cxx b/Testing/Code/IO/otbComplexImageManipulationTest.cxx index 9c6c3190fbc20a30c05b6e71c4c3d2ac6a5fb95f..4762cdb4a5c31286149cb9b21424573d6a998a1c 100644 --- a/Testing/Code/IO/otbComplexImageManipulationTest.cxx +++ b/Testing/Code/IO/otbComplexImageManipulationTest.cxx @@ -45,7 +45,7 @@ int otbImageDoubleToImageComplex(int argc, char * argv[]) id.Fill(0); size[0] = 10; - size[1] = 1; + size[1] = 2; region.SetSize( size ); region.SetIndex( id ); @@ -60,15 +60,13 @@ int otbImageDoubleToImageComplex(int argc, char * argv[]) it.GoToBegin(); while( it.IsAtEnd()==false ) { - count = it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]; - - if( (it.Get().real() != static_cast<RealType>(count)) || (it.Get().imag() != static_cast<RealType>(0)) ) - { - std::cout<<"Image double read as Image complex error : "<<it.Get()<<", waited for ("<<count<<", 0)"<<std::endl; - - return EXIT_FAILURE; - } - + count = it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]; + std::cout <<"PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "<< "OUTPUT = " << it.Get() << " ||| BASELINE = "<< (PixelType) count << std::endl; + if( (it.Get().real() != static_cast<RealType>(count)) || (it.Get().imag() != static_cast<RealType>(0)) ) + { + std::cout<<"Image double read as Image complex error : "<<it.Get()<<", waited for ("<<count<<", 0)"<<std::endl; + return EXIT_FAILURE; + } ++it; } @@ -84,10 +82,8 @@ 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]); @@ -112,9 +108,8 @@ int otbImageComplexToImageDouble(int argc, char * argv[]) while( it.IsAtEnd()==false ) { count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]); - double norm = vcl_sqrt(static_cast<double>( (count*count) + (count+1)*(count+1))); - + std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "<< "OUTPUT = " << it.Get() << " ||| BASELINE = "<< static_cast<RealType>(norm) << std::endl; if(it.Get() != static_cast<RealType>(norm)) { std::cout<<"Image complex read as Image double error : value (should be norm): "<<it.Get()<<", waited for "<<norm<<"."<<std::endl; @@ -123,8 +118,7 @@ int otbImageComplexToImageDouble(int argc, char * argv[]) } ++it; } - - + return EXIT_SUCCESS; } @@ -152,7 +146,7 @@ int otbImageComplexToImageComplex(int argc, char * argv[]) id.Fill(0); size[0] = 10; - size[1] = 1; + size[1] = 2; region.SetSize( size ); region.SetIndex( id ); @@ -163,11 +157,15 @@ int otbImageComplexToImageComplex(int argc, char * argv[]) itk::ImageRegionIteratorWithIndex<CplxImageType> it( reader->GetOutput(), region ); unsigned int count = 0; + PixelType valPxl; it.GoToBegin(); while( it.IsAtEnd()==false ) { count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]); - + valPxl.real() = count;valPxl.imag() = count+1; + std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\ + << "OUTPUT = " << it.Get() \ + << " ||| BASELINE = "<< valPxl << std::endl; if( (it.Get().real() != static_cast<RealType>(count)) || ( it.Get().imag() != static_cast<RealType>(count+1) ) ) { std::cout<<"Image complex read as Image complex error: "<<it.Get()<<", waited for ("<<count<<", "<<count+1<<")"<<std::endl; @@ -205,7 +203,7 @@ int otbImageComplexToVectorImageDouble(int argc, char * argv[]) id.Fill(0); size[0] = 10; - size[1] = 1; + size[1] = 2; region.SetSize( size ); region.SetIndex( id ); @@ -216,10 +214,15 @@ int otbImageComplexToVectorImageDouble(int argc, char * argv[]) itk::ImageRegionIteratorWithIndex<ScalVectorImageType> it( reader->GetOutput(), region ); unsigned int count = 0; + double valPxl[2]; it.GoToBegin(); while( it.IsAtEnd()==false ) { count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]); + valPxl[0] = count;valPxl[1] = count+1; + std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\ + << "OUTPUT = " << it.Get() \ + << " ||| BASELINE = "<< "["<<valPxl[0] << ", " <<valPxl[1]<< "]"<< std::endl; if( (it.Get()[0] != static_cast<RealType>(count)) || (it.Get()[1] != static_cast<RealType>(count+1)) ) { @@ -258,7 +261,7 @@ int otbImageComplexToVectorImageComplex(int argc, char * argv[]) id.Fill(0); size[0] = 10; - size[1] = 1; + size[1] = 2; region.SetSize( size ); region.SetIndex( id ); @@ -269,10 +272,15 @@ int otbImageComplexToVectorImageComplex(int argc, char * argv[]) itk::ImageRegionIteratorWithIndex<CmplxVectorImageType> it( reader->GetOutput(), region ); unsigned int count = 0; + PixelType valPxl; it.GoToBegin(); while( it.IsAtEnd()==false ) { count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]); + valPxl.real() = count; valPxl.imag()=count+1; + std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\ + << "OUTPUT = " << it.Get() \ + << " ||| BASELINE = "<< "["<<valPxl << "]" << std::endl; if( (it.Get()[0].real() != static_cast<RealType>(count)) || ( it.Get()[0].imag() != static_cast<RealType>(count+1) ) ) { @@ -310,7 +318,7 @@ int otbVectorImageDoubleToImageComplex(int argc, char * argv[]) id.Fill(0); size[0] = 10; - size[1] = 1; + size[1] = 2; region.SetSize( size ); region.SetIndex( id ); @@ -321,14 +329,19 @@ int otbVectorImageDoubleToImageComplex(int argc, char * argv[]) itk::ImageRegionIteratorWithIndex<CmplxImageType> it( reader->GetOutput(), region ); unsigned int count = 0; + unsigned int l_Size = reader->GetOutput()->GetLargestPossibleRegion().GetSize()[0]* reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]; + PixelType valPxl; it.GoToBegin(); while( it.IsAtEnd()==false ) { - count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]); - - if(it.Get().real() != static_cast<RealType>(count) || (it.Get().imag() != static_cast<RealType>(count+1)) ) + count = it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]; + valPxl.real() = count; valPxl.imag()=l_Size + count; + std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\ + << "OUTPUT = " << it.Get() \ + << " ||| BASELINE = "<< valPxl << std::endl; + if(it.Get().real() != static_cast<RealType>(count) || (it.Get().imag() != static_cast<RealType>(l_Size + count )) ) { - std::cout<<"Vector Image double read as Image double error: "<<it.Get()<<", waited for ("<<count<<", "<<count+1<<")"<<std::endl; + std::cout<<"Vector Image double read as Image double error: "<<it.Get()<<", waited for ("<<count<<", "<<l_Size + count<<")"<<std::endl; return EXIT_FAILURE; } @@ -362,7 +375,7 @@ int otbVectorImageDoubleToVectorImageComplex(int argc, char * argv[]) id.Fill(0); size[0] = 10; - size[1] = 1; + size[1] = 2; region.SetSize( size ); region.SetIndex( id ); @@ -373,17 +386,27 @@ int otbVectorImageDoubleToVectorImageComplex(int argc, char * argv[]) itk::ImageRegionIteratorWithIndex<CmplxVectorImageType> it( reader->GetOutput(), region ); unsigned int count = 0; + unsigned int l_Size = reader->GetOutput()->GetLargestPossibleRegion().GetSize()[0]* reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]; + + PixelType valPxl[2]; it.GoToBegin(); while( it.IsAtEnd()==false ) { - count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);; - - if(it.Get()[0].real() != static_cast<RealType>(count) || (it.Get()[0].imag() != static_cast<RealType>(0)) ) - { - std::cout<<"Vector Image double read as Vector Image complex error: "<<it.Get()[0]<<", waited for ("<<count<<", 0)."<<std::endl; - - return EXIT_FAILURE; - } + //count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]); + count = (it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);; + valPxl[0].real() = count;valPxl[0].imag() = 0; + valPxl[1].real() = l_Size + count;valPxl[1].imag() = 0; + std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\ + << "OUTPUT = " << it.Get() \ + << " ||| BASELINE = "<< "[" << valPxl[0] << ", "<< valPxl[1] << "]" << std::endl; + + if ( (it.Get()[0].real() != static_cast<RealType> (count)) || (it.Get()[0].imag() != static_cast<RealType> (0)) \ + || (it.Get()[1].real() != static_cast<RealType> (l_Size + count)) || (it.Get()[1].imag() != static_cast<RealType> (0)) ) + { + std::cout << "Vector Image double read as Vector Image complex error: " << it.Get()[0] << ", waited for (" + << count << ", 0)." << std::endl; + return EXIT_FAILURE; + } ++it; } @@ -413,7 +436,7 @@ int otbVectorImageComplexToVectorImageDouble(int argc, char * argv[]) id.Fill(0); size[0] = 10; - size[1] = 1; + size[1] = 2; region.SetSize( size ); region.SetIndex( id ); @@ -428,15 +451,15 @@ int otbVectorImageComplexToVectorImageDouble(int argc, char * argv[]) while( it.IsAtEnd()==false ) { count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]); - double norm1 = vcl_sqrt(static_cast<double>(count*count + (count+1)*(count+1))); - double norm2 = vcl_sqrt(static_cast<double>((2*l_Size+count)*(2*l_Size+count) + (2*l_Size+count+1)*(2*l_Size+count+1))); - - if( (it.Get()[0] != norm1) || (it.Get()[1] != norm2) ) - { - std::cout<<"Vector Image complex read as Vector Image double error: "<<it.Get()<<", waited for ("<<norm1<<", "<<norm2<<")."<<std::endl; - - return EXIT_FAILURE; - } + std::cout <<"PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> " \ + << "OUTPUT = " << it.Get() \ + << " ||| BASELINE = "<< "[" << count <<", " << count +1 << ", " << 2*l_Size+count << ", " << 2*l_Size+count+1 << "]"<< std::endl; + + + if (it.Get()[0] != count || it.Get()[1] != count+1 || it.Get()[2] != 2*l_Size+count || it.Get()[3] != 2*l_Size+count+1 ) + { + return EXIT_FAILURE; + } ++it; } @@ -449,7 +472,7 @@ int otbVectorImageComplexToVectorImageDouble(int argc, char * argv[]) /*********** * 9. * Read VectorImage<complex> as VectorImage<complex> - * out : out[0]=norm(in[0]), out[0]=norm(in[1]), ... + * out : out[0]=in[0], out[1]=in[1], ... ***********/ int otbVectorImageComplexToVectorImageComplex(int argc, char * argv[]) { @@ -468,7 +491,7 @@ int otbVectorImageComplexToVectorImageComplex(int argc, char * argv[]) id.Fill(0); size[0] = 10; - size[1] = 1; + size[1] = 2; region.SetSize( size ); region.SetIndex( id ); @@ -488,9 +511,13 @@ int otbVectorImageComplexToVectorImageComplex(int argc, char * argv[]) PixelType cmplx1(count, count+1); PixelType cmplx2(2*l_Size+count, 2*l_Size+count+1); + std::cout <<"PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> " \ + << "OUTPUT = " << it.Get() \ + << " ||| BASELINE = "<< "[" << cmplx1 <<", " << cmplx2 << "]"<< std::endl; + if( (it.Get()[0] != cmplx1) || (it.Get()[1] != cmplx2) ) { - std::cout<<"Image double read as Vector Image complex error: "<<std::endl; + std::cout<<"Multi Image Complex double read as Vector Image complex error: "<<std::endl; std::cout<<it.Get()[0]<<", waited for "<<cmplx1<<"."<<std::endl; std::cout<<it.Get()[1]<<", waited for "<<cmplx2<<"."<<std::endl; @@ -527,7 +554,7 @@ int otbImageDoubleToVectorImageComplex(int argc, char * argv[]) id.Fill(0); size[0] = 10; - size[1] = 1; + size[1] = 2; region.SetSize( size ); region.SetIndex( id ); @@ -545,12 +572,17 @@ int otbImageDoubleToVectorImageComplex(int argc, char * argv[]) itk::ImageRegionIteratorWithIndex<CmplxVectorImageType> it( reader->GetOutput(), region ); unsigned int count = 0; + PixelType valPxl; it.GoToBegin(); while( it.IsAtEnd()==false ) { count = it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]; + valPxl.real() = count;valPxl.imag() = 0; + std::cout <<"PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\ + << "OUTPUT = " << it.Get() \ + << " ||| BASELINE = "<< "["<< valPxl << "]"<< std::endl; - if( (it.Get()[0].real() != static_cast<RealType>(count)) || (it.Get()[0].imag() != 0) ) + if( (it.Get()[0].real() != static_cast<RealType>(count)) || (it.Get()[0].imag() != 0) ) { std::cout<<"Image double read as Vector Image complex error: "<<it.Get()[0]<<", waited for ("<<count<<", 0)."<<std::endl; @@ -572,7 +604,13 @@ int otbImageDoubleToVectorImageComplex(int argc, char * argv[]) ***********/ int otbVectorImageComplexToImageDouble(int argc, char * argv[]) { - typedef double RealType; + // This case is not handled yet. We need more time to decide what we want to do with this case. ( perhaps return exception ???) + std::cout << "This case is not handled yet." \ + << "We need more time to decide what we want to do with this case. ( perhaps return exception ???)" \ + << std::endl; + return EXIT_FAILURE; + + /*typedef double RealType; typedef std::complex<RealType> PixelType; typedef otb::VectorImage<PixelType, 2> CmplxVectorImageType; typedef otb::ImageFileReader<CmplxVectorImageType> ReaderType; @@ -660,6 +698,6 @@ int otbVectorImageComplexToImageDouble(int argc, char * argv[]) } - return EXIT_SUCCESS; + return EXIT_SUCCESS;*/ } diff --git a/Testing/Code/IO/otbIOTests21.cxx b/Testing/Code/IO/otbIOTests21.cxx index 6b72864a86a160daf78c84a3a9f06689dc178dce..b4438b8877a248a6c2b163006e5d379be3bf0002 100644 --- a/Testing/Code/IO/otbIOTests21.cxx +++ b/Testing/Code/IO/otbIOTests21.cxx @@ -45,4 +45,7 @@ void RegisterTests() REGISTER_TEST(otbVectorImageComplexToVectorImageComplex); REGISTER_TEST(otbImageDoubleToVectorImageComplex); REGISTER_TEST(otbVectorImageComplexToImageDouble); + // not deal in this commit + //REGISTER_TEST(otbGDALReadPxlComplexDb); + //REGISTER_TEST(otbGDALReadPxlComplexFl); } diff --git a/Utilities/ITK/Code/IO/itkConvertPixelBuffer.h b/Utilities/ITK/Code/IO/itkConvertPixelBuffer.h index 30cf712f84e8b76a285a54c3ac31680db16a278d..6d1bb7ca1c8b24c6a4c8dc2e9bc62165d7e38553 100644 --- a/Utilities/ITK/Code/IO/itkConvertPixelBuffer.h +++ b/Utilities/ITK/Code/IO/itkConvertPixelBuffer.h @@ -51,9 +51,13 @@ public: static void ConvertVectorImage(InputPixelType* inputData, int inputNumberOfComponents, OutputPixelType* outputData , size_t size); - static void ConvertComplexVectorImageToVectorImage(std::complex<InputPixelType>* inputData, + static void ConvertComplexVectorImageToVectorImage(std::complex<InputPixelType>* inputData, int inputNumberOfComponents, OutputPixelType* outputData , size_t size); + static void ConvertComplexVectorImageToVectorImageComplex(std::complex<InputPixelType>* inputData, + int inputNumberOfComponents, + OutputPixelType* outputData , size_t size); + static void ConvertComplexToGray(std::complex<InputPixelType>* inputData, int inputNumberOfComponents, OutputPixelType* outputData , size_t size); diff --git a/Utilities/ITK/Code/IO/itkConvertPixelBuffer.txx b/Utilities/ITK/Code/IO/itkConvertPixelBuffer.txx index 0f768c670f44ae7ab2a5fd362a76baada864c4ca..baeaa0fa540b6aa1cf366e01af394c687ecc8716 100644 --- a/Utilities/ITK/Code/IO/itkConvertPixelBuffer.txx +++ b/Utilities/ITK/Code/IO/itkConvertPixelBuffer.txx @@ -739,15 +739,36 @@ template < typename InputPixelType, class OutputConvertTraits > void ConvertPixelBuffer<InputPixelType, OutputPixelType, OutputConvertTraits> -::ConvertComplexVectorImageToVectorImage(std::complex<InputPixelType>* inputData, +::ConvertComplexVectorImageToVectorImage(std::complex<InputPixelType>* inputData, int inputNumberOfComponents, OutputPixelType* outputData , size_t size) +{ + size_t length = size* (size_t)inputNumberOfComponents; + OutputPixelType dummy; + for( size_t i=0; i< length/2; i++ ) + { + OutputConvertTraits::SetNthComponent( 0, *outputData, (*inputData).real()); + ++outputData; + OutputConvertTraits::SetNthComponent( 0, *outputData, (*inputData).imag()); + ++outputData; + ++inputData; + } +} + +template < typename InputPixelType, + typename OutputPixelType, + class OutputConvertTraits > +void +ConvertPixelBuffer<InputPixelType, OutputPixelType, OutputConvertTraits> +::ConvertComplexVectorImageToVectorImageComplex(std::complex<InputPixelType>* inputData, + int inputNumberOfComponents, + OutputPixelType* outputData , size_t size) { size_t length = size* (size_t)inputNumberOfComponents; OutputPixelType dummy; for( size_t i=0; i< length; i++ ) { - OutputConvertTraits::SetNthComponent( 0, *outputData, + OutputConvertTraits::SetNthComponent( 0, *outputData, SpecialCast(*inputData, dummy)); ++outputData; ++inputData; diff --git a/Utilities/ITK/Code/IO/itkImageFileReader.txx b/Utilities/ITK/Code/IO/itkImageFileReader.txx index 56b92caecc66a2df9f9df0418f9f0b6d3080d434..ec6b8a94e597ec7253a7bb29207a052442b7242a 100644 --- a/Utilities/ITK/Code/IO/itkImageFileReader.txx +++ b/Utilities/ITK/Code/IO/itkImageFileReader.txx @@ -482,8 +482,7 @@ ImageFileReader<TOutputImage, ConvertPixelTraits> OutputImagePixelType *outputData = this->GetOutput()->GetPixelContainer()->GetBufferPointer(); - - // TODO: + // TODO: // Pass down the PixelType (RGB, VECTOR, etc.) so that any vector to // scalar conversion be type specific. i.e. RGB to scalar would use // a formula to convert to luminance, VECTOR to scalar would use @@ -501,7 +500,7 @@ ImageFileReader<TOutputImage, ConvertPixelTraits> #define ITK_CONVERT_BUFFER_IF_BLOCK(type) \ else if( m_ImageIO->GetComponentTypeInfo() == typeid(type) ) \ - { \ + { \ if( strcmp( this->GetOutput()->GetNameOfClass(), "VectorImage" ) == 0 ) \ { \ ConvertPixelBuffer< \ @@ -510,10 +509,10 @@ ImageFileReader<TOutputImage, ConvertPixelTraits> ConvertPixelTraits \ > \ ::ConvertVectorImage( \ - static_cast<type*>(inputData), \ - m_ImageIO->GetNumberOfComponents(), \ - outputData, \ - numberOfPixels); \ + static_cast<type*>(inputData), \ + m_ImageIO->GetNumberOfComponents(), \ + outputData, \ + numberOfPixels); \ } \ else \ { \ @@ -531,34 +530,54 @@ ImageFileReader<TOutputImage, ConvertPixelTraits> } #define ITK_CONVERT_CBUFFER_IF_BLOCK(type) \ else if( m_ImageIO->GetComponentTypeInfo() == typeid(type) ) \ - { \ + { \ if( strcmp( this->GetOutput()->GetNameOfClass(), "VectorImage" ) == 0 ) \ { \ - ConvertPixelBuffer< \ - type::value_type, \ - OutputImagePixelType, \ - ConvertPixelTraits \ - > \ - ::ConvertComplexVectorImageToVectorImage( \ - static_cast<type*>(inputData), \ - m_ImageIO->GetNumberOfComponents(), \ - outputData, \ - numberOfPixels); \ + if( (typeid(OutputImagePixelType) == typeid(std::complex<double>)) \ + || (typeid(OutputImagePixelType) == typeid(std::complex<float>)) )\ + {\ + /*std::cout << "Complex -> OTB::VectorImage Complex" << std::endl;*/ \ + ConvertPixelBuffer< \ + type::value_type, \ + OutputImagePixelType, \ + ConvertPixelTraits \ + > \ + ::ConvertComplexVectorImageToVectorImageComplex( \ + static_cast<type*>(inputData), \ + m_ImageIO->GetNumberOfComponents(), \ + outputData, \ + numberOfPixels); \ + }\ + else\ + {\ + /*std::cout << "Complex -> OTB::VectorImage Double" << std::endl;*/ \ + ConvertPixelBuffer< \ + type::value_type, \ + OutputImagePixelType, \ + ConvertPixelTraits \ + > \ + ::ConvertComplexVectorImageToVectorImage( \ + static_cast<type*>(inputData), \ + m_ImageIO->GetNumberOfComponents(), \ + outputData, \ + numberOfPixels); \ + }\ } \ else \ { \ + /*std::cout << "Complex -> OTB::Image" << std::endl;*/ \ ConvertPixelBuffer< \ type::value_type, \ OutputImagePixelType, \ ConvertPixelTraits \ > \ ::ConvertComplexToGray( \ - static_cast<type*>(inputData), \ - m_ImageIO->GetNumberOfComponents(), \ - outputData, \ - numberOfPixels); \ - } \ - } + static_cast<type*>(inputData), \ + m_ImageIO->GetNumberOfComponents(), \ + outputData, \ + numberOfPixels); \ + } \ + } if(0) {