annotate Framework/ColorSpaces.cpp @ 334:f011fc199b6a default tip

back to mainline
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 18 Oct 2024 15:44:18 +0200
parents c42083d50ddf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
330
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 *
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * This program is free software: you can redistribute it and/or
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * modify it under the terms of the GNU Affero General Public License
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * as published by the Free Software Foundation, either version 3 of
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * the License, or (at your option) any later version.
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 *
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful, but
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * Affero General Public License for more details.
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 *
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * You should have received a copy of the GNU Affero General Public License
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 **/
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 #include "ColorSpaces.h"
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 #include <SerializationToolbox.h>
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 #include <Toolbox.h>
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 #include <boost/math/special_functions/round.hpp>
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 namespace OrthancWSI
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 RGBColor::RGBColor(const sRGBColor& srgb)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 if (srgb.GetR() < 0)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 r_ = 0;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 else if (srgb.GetR() >= 1)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 r_ = 255;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 else
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 r_ = boost::math::iround(srgb.GetR() * 255.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 if (srgb.GetG() < 0)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 g_ = 0;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 else if (srgb.GetG() >= 1)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 g_ = 255;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 else
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 g_ = boost::math::iround(srgb.GetG() * 255.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 if (srgb.GetB() < 0)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 b_ = 0;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 else if (srgb.GetB() >= 1)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 b_ = 255;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 else
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 b_ = boost::math::iround(srgb.GetB() * 255.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 sRGBColor::sRGBColor(const RGBColor& rgb)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 r_ = static_cast<float>(rgb.GetR()) / 255.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 g_ = static_cast<float>(rgb.GetG()) / 255.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 b_ = static_cast<float>(rgb.GetB()) / 255.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 static float ApplyGammaXYZ(float value)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 // https://www.image-engineering.de/library/technotes/958-how-to-convert-between-srgb-and-ciexyz
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 if (value <= 0.0031308f)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 return value * 12.92f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 else
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 return 1.055f * powf(value, 1.0f / 2.4f) - 0.055f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 sRGBColor::sRGBColor(const XYZColor& xyz)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 // https://en.wikipedia.org/wiki/SRGB#From_CIE_XYZ_to_sRGB
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 // https://www.image-engineering.de/library/technotes/958-how-to-convert-between-srgb-and-ciexyz
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 const float sr = 3.2404542f * xyz.GetX() - 1.5371385f * xyz.GetY() - 0.4985314f * xyz.GetZ();
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 const float sg = -0.9692660f * xyz.GetX() + 1.8760108f * xyz.GetY() + 0.0415560f * xyz.GetZ();
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 const float sb = 0.0556434f * xyz.GetX() - 0.2040259f * xyz.GetY() + 1.0572252f * xyz.GetZ();
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 r_ = ApplyGammaXYZ(sr);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 g_ = ApplyGammaXYZ(sg);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 b_ = ApplyGammaXYZ(sb);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 static float LinearizeXYZ(float value)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 // https://www.image-engineering.de/library/technotes/958-how-to-convert-between-srgb-and-ciexyz
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 if (value <= 0.04045f)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 return value / 12.92f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 else
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 return powf((value + 0.055f) / 1.055f, 2.4f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 XYZColor::XYZColor(const sRGBColor& srgb)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 // https://en.wikipedia.org/wiki/SRGB#From_sRGB_to_CIE_XYZ
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 // https://www.image-engineering.de/library/technotes/958-how-to-convert-between-srgb-and-ciexyz
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 const float linearizedR = LinearizeXYZ(srgb.GetR());
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 const float linearizedG = LinearizeXYZ(srgb.GetG());
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 const float linearizedB = LinearizeXYZ(srgb.GetB());
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 x_ = 0.4124564f * linearizedR + 0.3575761f * linearizedG + 0.1804375f * linearizedB;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 y_ = 0.2126729f * linearizedR + 0.7151522f * linearizedG + 0.0721750f * linearizedB;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 z_ = 0.0193339f * linearizedR + 0.1191920f * linearizedG + 0.9503041f * linearizedB;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 static const float LAB_DELTA = 6.0f / 29.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 static float LABf_inv(float t)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 if (t > LAB_DELTA)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 return powf(t, 3.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 else
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 return 3.0f * LAB_DELTA * LAB_DELTA * (t - 4.0f / 29.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 // Those correspond to Standard Illuminant D65
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 // https://en.wikipedia.org/wiki/CIELAB_color_space#From_CIEXYZ_to_CIELAB
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 static const float X_N = 95.0489f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 static const float Y_N = 100.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 static const float Z_N = 108.8840f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 XYZColor::XYZColor(const LABColor& lab)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 // https://en.wikipedia.org/wiki/CIELAB_color_space#From_CIELAB_to_CIEXYZ
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 const float shared = (lab.GetL() + 16.0f) / 116.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 x_ = X_N * LABf_inv(shared + lab.GetA() / 500.0f) / 100.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 y_ = Y_N * LABf_inv(shared) / 100.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 z_ = Z_N * LABf_inv(shared - lab.GetB() / 200.0f) / 100.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 static float LABf(float t)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175 if (t > powf(LAB_DELTA, 3.0f))
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 return powf(t, 1.0f / 3.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 else
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181 return t / 3.0f * powf(LAB_DELTA, -2.0f) + 4.0f / 29.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 LABColor::LABColor(const XYZColor& xyz)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 // https://en.wikipedia.org/wiki/CIELAB_color_space#From_CIEXYZ_to_CIELAB
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 const float fx = LABf(xyz.GetX() * 100.0f / X_N);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 const float fy = LABf(xyz.GetY() * 100.0f / Y_N);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 const float fz = LABf(xyz.GetZ() * 100.0f / Z_N);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 l_ = 116.0f * fy - 16.0f;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 a_ = 500.0f * (fx - fy);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 b_ = 200.0f * (fy - fz);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 static uint16_t EncodeUint16(float value,
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 float minValue,
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 float maxValue)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 if (value <= minValue)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206 return 0;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 else if (value >= maxValue)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 return 0xffff;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 else
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 float lambda = (value - minValue) / (maxValue - minValue);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 assert(lambda >= 0 && lambda <= 1);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 return static_cast<uint16_t>(boost::math::iround(lambda * static_cast<float>(0xffff)));
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 void LABColor::EncodeDicomRecommendedAbsentPixelCIELab(uint16_t target[3]) const
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 /**
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 * "An L value linearly scaled to 16 bits, such that 0x0000
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 * corresponds to an L of 0.0, and 0xFFFF corresponds to an L of
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 * 100.0."
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 **/
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 target[0] = EncodeUint16(GetL(), 0.0f, 100.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 /**
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 * "An a* then a b* value, each linearly scaled to 16 bits and
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 * offset to an unsigned range, such that 0x0000 corresponds to an
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 * a* or b* of -128.0, 0x8080 corresponds to an a* or b* of 0.0
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234 * and 0xFFFF corresponds to an a* or b* of 127.0"
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 **/
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236 target[1] = EncodeUint16(GetA(), -128.0f, 127.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 target[2] = EncodeUint16(GetB(), -128.0f, 127.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241 LABColor LABColor::DecodeDicomRecommendedAbsentPixelCIELab(uint16_t l,
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242 uint16_t a,
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 uint16_t b)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 return LABColor(static_cast<float>(l) / static_cast<float>(0xffff) * 100.0f,
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 -128.0f + static_cast<float>(a) / static_cast<float>(0xffff) * 255.0f,
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247 -128.0f + static_cast<float>(b) / static_cast<float>(0xffff) * 255.0f);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251 bool LABColor::DecodeDicomRecommendedAbsentPixelCIELab(LABColor& target,
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 const std::string& tag)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
254 std::vector<std::string> channels;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 Orthanc::Toolbox::TokenizeString(channels, tag, '\\');
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
257 unsigned int l, a, b;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
258 if (channels.size() == 3 &&
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259 Orthanc::SerializationToolbox::ParseUnsignedInteger32(l, channels[0]) &&
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
260 Orthanc::SerializationToolbox::ParseUnsignedInteger32(a, channels[1]) &&
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261 Orthanc::SerializationToolbox::ParseUnsignedInteger32(b, channels[2]) &&
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 l <= 0xffffu &&
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 a <= 0xffffu &&
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264 b <= 0xffffu)
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266 target = LABColor::DecodeDicomRecommendedAbsentPixelCIELab(l, a, b);
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 return true;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 else
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270 {
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271 return false;
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
272 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
273 }
c42083d50ddf Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
274 }