Mercurial > hg > orthanc
diff UnitTestsSources/ImageProcessingTests.cpp @ 2487:be1dbb1dcdd6
PixelTraits and ImageTraits
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 13 Mar 2018 16:29:20 +0100 |
parents | 878b59270859 |
children | 22524fd06225 |
line wrap: on
line diff
--- a/UnitTestsSources/ImageProcessingTests.cpp Wed Mar 07 15:46:47 2018 +0100 +++ b/UnitTestsSources/ImageProcessingTests.cpp Tue Mar 13 16:29:20 2018 +0100 @@ -35,8 +35,11 @@ #include "gtest/gtest.h" #include "../Core/DicomFormat/DicomImageInformation.h" -#include "../Core/Images/ImageBuffer.h" +#include "../Core/Images/Image.h" #include "../Core/Images/ImageProcessing.h" +#include "../Core/Images/ImageTraits.h" + +#include <memory> using namespace Orthanc; @@ -79,3 +82,119 @@ ASSERT_TRUE(info.ExtractPixelFormat(format, false)); ASSERT_EQ(PixelFormat_SignedGrayscale16, format); } + + + +namespace +{ + template <typename T> + class TestImageTraits : public ::testing::Test + { + private: + std::auto_ptr<Image> image_; + + protected: + virtual void SetUp() + { + image_.reset(new Image(ImageTraits::PixelTraits::GetPixelFormat(), 7, 9, false)); + } + + virtual void TearDown() + { + image_.reset(NULL); + } + + public: + typedef T ImageTraits; + + ImageAccessor& GetImage() + { + return *image_; + } + }; + + template <typename T> + class TestIntegerImageTraits : public TestImageTraits<T> + { + }; +} + + +typedef ::testing::Types< + ImageTraits<PixelFormat_Grayscale8>, + ImageTraits<PixelFormat_Grayscale16>, + ImageTraits<PixelFormat_SignedGrayscale16> + > IntegerFormats; +TYPED_TEST_CASE(TestIntegerImageTraits, IntegerFormats); + +typedef ::testing::Types< + ImageTraits<PixelFormat_Grayscale8>, + ImageTraits<PixelFormat_Grayscale16>, + ImageTraits<PixelFormat_SignedGrayscale16>, + ImageTraits<PixelFormat_RGB24>, + ImageTraits<PixelFormat_BGRA32> + > AllFormats; +TYPED_TEST_CASE(TestImageTraits, AllFormats); + + +TYPED_TEST(TestImageTraits, SetZero) +{ + ImageAccessor& image = this->GetImage(); + + memset(image.GetBuffer(), 128, image.GetHeight() * image.GetWidth()); + + switch (image.GetFormat()) + { + case PixelFormat_Grayscale8: + case PixelFormat_Grayscale16: + case PixelFormat_SignedGrayscale16: + ImageProcessing::Set(image, 0); + break; + + case PixelFormat_RGB24: + case PixelFormat_BGRA32: + ImageProcessing::Set(image, 0, 0, 0, 0); + break; + + default: + ASSERT_TRUE(0); + } + + typename TestFixture::ImageTraits::PixelType zero, value; + TestFixture::ImageTraits::PixelTraits::SetZero(zero); + + for (unsigned int y = 0; y < image.GetHeight(); y++) + { + for (unsigned int x = 0; x < image.GetWidth(); x++) + { + TestFixture::ImageTraits::GetPixel(value, image, x, y); + ASSERT_TRUE(TestFixture::ImageTraits::PixelTraits::IsEqual(zero, value)); + } + } +} + + +TYPED_TEST(TestIntegerImageTraits, SetZeroFloat) +{ + ImageAccessor& image = this->GetImage(); + + memset(image.GetBuffer(), 128, image.GetHeight() * image.GetWidth()); + + unsigned int c = 0; + for (unsigned int y = 0; y < image.GetHeight(); y++) + { + for (unsigned int x = 0; x < image.GetWidth(); x++, c++) + { + TestFixture::ImageTraits::SetFloatPixel(image, c, x, y); + } + } + + c = 0; + for (unsigned int y = 0; y < image.GetHeight(); y++) + { + for (unsigned int x = 0; x < image.GetWidth(); x++, c++) + { + ASSERT_FLOAT_EQ(c, TestFixture::ImageTraits::GetFloatPixel(image, x, y)); + } + } +}