# HG changeset patch # User Sebastien Jodogne # Date 1630318385 -7200 # Node ID ebb801d44e064c4e468c230ec0c8a17b9cfab873 # Parent 4f368230f32be9c70f38fda81cb3a2703bd45b98 optimization in ImageProcessing::ShiftScale() diff -r 4f368230f32b -r ebb801d44e06 OrthancFramework/Sources/Images/ImageProcessing.cpp --- a/OrthancFramework/Sources/Images/ImageProcessing.cpp Mon Aug 30 11:51:56 2021 +0200 +++ b/OrthancFramework/Sources/Images/ImageProcessing.cpp Mon Aug 30 12:13:05 2021 +0200 @@ -1405,6 +1405,14 @@ } + static bool IsIdentityRescaling(float offset, + float scaling) + { + return (std::abs(offset) <= 10.0f * std::numeric_limits::epsilon() && + std::abs(scaling - 1.0f) <= 10.0f * std::numeric_limits::epsilon()); + } + + void ImageProcessing::ShiftScale2(ImageAccessor& image, float offset, float scaling, @@ -1413,6 +1421,11 @@ // We compute "a * x + b" const float a = scaling; const float b = offset; + + if (IsIdentityRescaling(offset, scaling)) + { + return; + } switch (image.GetFormat()) { @@ -1477,6 +1490,13 @@ const float a = scaling; const float b = offset; + if (target.GetFormat() == source.GetFormat() && + IsIdentityRescaling(offset, scaling)) + { + Copy(target, source); + return; + } + switch (target.GetFormat()) { case PixelFormat_Grayscale8: diff -r 4f368230f32b -r ebb801d44e06 OrthancFramework/UnitTestsSources/ImageProcessingTests.cpp --- a/OrthancFramework/UnitTestsSources/ImageProcessingTests.cpp Mon Aug 30 11:51:56 2021 +0200 +++ b/OrthancFramework/UnitTestsSources/ImageProcessingTests.cpp Mon Aug 30 12:13:05 2021 +0200 @@ -975,6 +975,25 @@ } +TEST(ImageProcessing, Grayscale8_Identity) +{ + Image image(PixelFormat_Float32, 5, 1, false); + ImageTraits::SetPixel(image, 0, 0, 0); + ImageTraits::SetPixel(image, 2.5, 1, 0); + ImageTraits::SetPixel(image, 5.5, 2, 0); + ImageTraits::SetPixel(image, 10.5, 3, 0); + ImageTraits::SetPixel(image, 255.5, 4, 0); + + Image image2(PixelFormat_Grayscale8, 5, 1, false); + ImageProcessing::ShiftScale(image2, image, 0, 1, false); + ASSERT_TRUE(TestGrayscale8Pixel(image2, 0, 0, 0)); + ASSERT_TRUE(TestGrayscale8Pixel(image2, 1, 0, 2)); + ASSERT_TRUE(TestGrayscale8Pixel(image2, 2, 0, 5)); + ASSERT_TRUE(TestGrayscale8Pixel(image2, 3, 0, 10)); + ASSERT_TRUE(TestGrayscale8Pixel(image2, 4, 0, 255)); +} + + TEST(ImageProcessing, ShiftScaleGrayscale16) { Image image(PixelFormat_Grayscale16, 5, 1, false); @@ -1011,6 +1030,24 @@ } +TEST(ImageProcessing, ShiftScaleSignedGrayscale16_Identity) +{ + Image image(PixelFormat_SignedGrayscale16, 5, 1, false); + SetSignedGrayscale16Pixel(image, 0, 0, 0); + SetSignedGrayscale16Pixel(image, 1, 0, 2); + SetSignedGrayscale16Pixel(image, 2, 0, 5); + SetSignedGrayscale16Pixel(image, 3, 0, 10); + SetSignedGrayscale16Pixel(image, 4, 0, 255); + + ImageProcessing::ShiftScale(image, 0, 1, true); + ASSERT_TRUE(TestSignedGrayscale16Pixel(image, 0, 0, 0)); + ASSERT_TRUE(TestSignedGrayscale16Pixel(image, 1, 0, 2)); + ASSERT_TRUE(TestSignedGrayscale16Pixel(image, 2, 0, 5)); + ASSERT_TRUE(TestSignedGrayscale16Pixel(image, 3, 0, 10)); + ASSERT_TRUE(TestSignedGrayscale16Pixel(image, 4, 0, 255)); +} + + TEST(ImageProcessing, ShiftScale2) { std::vector va;