/* * Copyright (C) 1999-2011 Insight Software Consortium * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) * * This file is part of Orfeo Toolbox * * https://www.orfeo-toolbox.org/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef otbConvertPixelBuffer_hxx #define otbConvertPixelBuffer_hxx #include "otbConvertPixelBuffer.h" #include "itkConvertPixelBuffer.h" namespace otb { template void ConvertPixelBuffer::Convert(InputPixelType* inputData, int inputNumberOfComponents, OutputPixelType* outputData, size_t size) { if ((OutputConvertTraits::GetNumberOfComponents() == 2) && inputNumberOfComponents == 1) { // OTB patch : monoband to complex ConvertGrayToComplex(inputData, outputData, size); } else { // use ITK pixel buffer converter itk::ConvertPixelBuffer::Convert(inputData, inputNumberOfComponents, outputData, size); } } // Convert Grayscale to Complex template void ConvertPixelBuffer::ConvertGrayToComplex(InputPixelType* inputData, OutputPixelType* outputData, size_t size) { InputPixelType* endInput = inputData + size; while (inputData != endInput) { OutputConvertTraits::SetNthComponent(0, *outputData, static_cast(*inputData)); OutputConvertTraits::SetNthComponent(1, *outputData, static_cast(0.)); inputData++; outputData++; } } /* To be able to convert transparently*/ template OutputType ComplexCast(const std::complex& in, const OutputType& itkNotUsed(dummy)) { typedef typename itk::NumericTraits>::RealType RealType; typedef typename itk::NumericTraits>::ScalarRealType ScalarRealType; RealType inReal(static_cast(in.real()), static_cast(in.imag())); return static_cast(std::abs(inReal)); } template std::complex ComplexCast(const std::complex& in, const std::complex& itkNotUsed(dummy)) { typedef typename itk::NumericTraits>::RealType RealType; typedef typename itk::NumericTraits>::ScalarRealType ScalarRealType; RealType inReal(static_cast(in.real()), static_cast(in.imag())); return static_cast>(inReal); } template void ConvertPixelBuffer::ConvertComplexToGray(std::complex* inputData, int itkNotUsed(inputNumberOfComponents), OutputPixelType* outputData, size_t size) { OutputPixelType dummy; std::complex* endInput = inputData + size; while (inputData != endInput) { OutputConvertTraits::SetNthComponent(0, *outputData, static_cast(ComplexCast(*inputData, dummy))); inputData++; outputData++; } } template void ConvertPixelBuffer::ConvertVectorImage(InputPixelType* inputData, int inputNumberOfComponents, OutputPixelType* outputData, size_t size) { itk::ConvertPixelBuffer::ConvertVectorImage(inputData, inputNumberOfComponents, outputData, size); } template void ConvertPixelBuffer::ConvertComplexVectorImageToVectorImage(std::complex* inputData, int inputNumberOfComponents, OutputPixelType* outputData, size_t size) { size_t length = size * (size_t)inputNumberOfComponents; 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 void ConvertPixelBuffer::ConvertComplexVectorImageToVectorImageComplex( std::complex* 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, ComplexCast(*inputData, dummy)); ++outputData; ++inputData; } } } // end namespace otb #endif