Mercurial > hg > orthanc
changeset 2488:345725b9350c
back to rounding to fix integration tests
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 13 Mar 2018 17:02:30 +0100 |
parents | be1dbb1dcdd6 |
children | e91bab2d8c75 |
files | Core/DicomParsing/Internals/DicomImageDecoder.cpp Core/Images/ImageProcessing.cpp Core/Images/ImageProcessing.h |
diffstat | 3 files changed, 79 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/Core/DicomParsing/Internals/DicomImageDecoder.cpp Tue Mar 13 16:29:20 2018 +0100 +++ b/Core/DicomParsing/Internals/DicomImageDecoder.cpp Tue Mar 13 17:02:30 2018 +0100 @@ -881,7 +881,8 @@ else { ImageProcessing::ShiftScale(*image, static_cast<float>(-a), - 255.0f / static_cast<float>(b - a)); + 255.0f / static_cast<float>(b - a), + true /* TODO - Consider using "false" to speed up */); } // If the source image is not grayscale 8bpp, convert it
--- a/Core/Images/ImageProcessing.cpp Tue Mar 13 16:29:20 2018 +0100 +++ b/Core/Images/ImageProcessing.cpp Tue Mar 13 17:02:30 2018 +0100 @@ -227,7 +227,8 @@ - template <typename PixelType> + template <typename PixelType, + bool UseRound> void MultiplyConstantInternal(ImageAccessor& image, float factor) { @@ -246,11 +247,16 @@ for (unsigned int x = 0; x < width; x++, p++) { - // The "round" operation is extremely costly. We use - // truncation instead since Orthanc 1.3.2. - - //int64_t v = boost::math::llround(static_cast<float>(*p) * factor); - int64_t v = static_cast<int64_t>(static_cast<float>(*p) * factor); + int64_t v; + if (UseRound) + { + // The "round" operation is very costly + v = boost::math::llround(static_cast<float>(*p) * factor); + } + else + { + v = static_cast<int64_t>(static_cast<float>(*p) * factor); + } if (v > maxValue) { @@ -269,7 +275,8 @@ } - template <typename PixelType> + template <typename PixelType, + bool UseRound> void ShiftScaleInternal(ImageAccessor& image, float offset, float scaling) @@ -298,12 +305,13 @@ { *p = minPixelValue; } + else if (UseRound) + { + // The "round" operation is very costly + *p = static_cast<PixelType>(boost::math::iround(v)); + } else { - // The "round" operation is extremely costly. We use - // truncation instead since Orthanc 1.3.2. - - //*p = static_cast<PixelType>(boost::math::iround(v)); *p = static_cast<PixelType>(v); } } @@ -806,20 +814,42 @@ void ImageProcessing::MultiplyConstant(ImageAccessor& image, - float factor) + float factor, + bool useRound) { switch (image.GetFormat()) { case PixelFormat_Grayscale8: - MultiplyConstantInternal<uint8_t>(image, factor); + if (useRound) + { + MultiplyConstantInternal<uint8_t, true>(image, factor); + } + else + { + MultiplyConstantInternal<uint8_t, false>(image, factor); + } return; case PixelFormat_Grayscale16: - MultiplyConstantInternal<uint16_t>(image, factor); + if (useRound) + { + MultiplyConstantInternal<uint16_t, true>(image, factor); + } + else + { + MultiplyConstantInternal<uint16_t, false>(image, factor); + } return; case PixelFormat_SignedGrayscale16: - MultiplyConstantInternal<int16_t>(image, factor); + if (useRound) + { + MultiplyConstantInternal<int16_t, true>(image, factor); + } + else + { + MultiplyConstantInternal<int16_t, false>(image, factor); + } return; default: @@ -830,20 +860,42 @@ void ImageProcessing::ShiftScale(ImageAccessor& image, float offset, - float scaling) + float scaling, + bool useRound) { switch (image.GetFormat()) { case PixelFormat_Grayscale8: - ShiftScaleInternal<uint8_t>(image, offset, scaling); + if (useRound) + { + ShiftScaleInternal<uint8_t, true>(image, offset, scaling); + } + else + { + ShiftScaleInternal<uint8_t, false>(image, offset, scaling); + } return; case PixelFormat_Grayscale16: - ShiftScaleInternal<uint16_t>(image, offset, scaling); + if (useRound) + { + ShiftScaleInternal<uint16_t, true>(image, offset, scaling); + } + else + { + ShiftScaleInternal<uint16_t, false>(image, offset, scaling); + } return; case PixelFormat_SignedGrayscale16: - ShiftScaleInternal<int16_t>(image, offset, scaling); + if (useRound) + { + ShiftScaleInternal<int16_t, true>(image, offset, scaling); + } + else + { + ShiftScaleInternal<int16_t, false>(image, offset, scaling); + } return; default:
--- a/Core/Images/ImageProcessing.h Tue Mar 13 16:29:20 2018 +0100 +++ b/Core/Images/ImageProcessing.h Tue Mar 13 17:02:30 2018 +0100 @@ -71,12 +71,16 @@ static void AddConstant(ImageAccessor& image, int64_t value); + // "useRound" is expensive static void MultiplyConstant(ImageAccessor& image, - float factor); + float factor, + bool useRound); + // "useRound" is expensive static void ShiftScale(ImageAccessor& image, float offset, - float scaling); + float scaling, + bool useRound); static void Invert(ImageAccessor& image); };