/usr/include/dcmtk/dcmiod/cielabutil.h is in libdcmtk-dev 3.6.1~20160216-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | /*
*
* Copyright (C) 2016, Pascal Getreuer, Open Connections GmbH
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation are maintained by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: dcmiod
*
* Author: Pascal Getreuer, Michael Onken
*
* Purpose: Static helper functionality for CIE<->RGB color conversions
*
*/
#ifndef CIELABUTIL_H
#define CIELABUTIL_H
#include "dcmtk/config/osconfig.h"
#define INCLUDE_CMATH // for pow() function
#include "dcmtk/ofstd/ofstdinc.h"
#include "dcmtk/dcmiod/ioddef.h"
/** Class supporting color space conversions from and to CIELab. In some IODs
* DICOM stores CIELab color values which must often be converted to RGB for
* display or other purposes. This is supported by the functions dicomLab2RGB()
* and rgb2DicomLab(). The CIELab value range in DICOM is [0,65535] for all
* three values. The RGB value range in this class is [0;1]. Further functions
* are available in order to convert between RGB, "normal" CIELab value range
* as well as CIEXYZ. The class uses double floating point precision for
* calculations.
*/
class DCMTK_DCMIOD_EXPORT IODCIELabUtil
{
public:
/// D65 standard lightpoint X component for conversion from CIEXYZ to CIELab
static const double D65_WHITEPOINT_X;
/// D65 standard lightpoint Y component for conversion from CIEXYZ to CIELab
static const double D65_WHITEPOINT_Y;
/// D65 standard lightpoint Z component for conversion from CIEXYZ to CIELab
static const double D65_WHITEPOINT_Z;
/** Convert CIELab color representation as found in DICOM to sRGB value
* representation. See DICOM part 3 for details.
* @param R Output sRGB "R" component (red) with 0 <= R <= 1
* @param G Output sRGB "G" component (green) with 0 <= G <= 1
* @param B Output sRGB "R" component (blue) with 0 <= B <= 1
* @param LDicom Input DICOM CIELab luminance component with 0 <= L <= 65535
* @param aDicom Input DICOM CIELab "a" component (red<->green) with 0 <= a <= 65535
* @param bDicom Input DIOCM CIELab "b" component (blue<->yellow) with 0 <= a <= 65535
*/
static void dicomLab2RGB(double& R, double& G, double& B, double LDicom, double aDicom, double bDicom);
/** Convert sRGB color representation to CIELab color representation as found
* in DICOM. See DICOM part 3 for details.
* @param LDicom Output CIELab luminance component with 0 <= L <= 65535 as found
* in DICOM
* @param aDicom Output CIELab "a" component (red<->green) with 0 <= a <= 65535
* as found in DICOM
* @param bDicom Output CIELab "b" component (blue<->yellow) with 0 <= b <= 65535
* as found in DICOM
* @param R Input sRGB "R" component (red) with 0 <= R <= 1
* @param G Input sRGB "G" component (green) with 0 <= G <= 1
* @param B Input sRGB "R" component (blue) with 0 <= B <= 1
*
*/
static void rgb2DicomLab(double& LDicom, double& aDicom, double& bDicom, double R, double G, double B);
/** Convert CIELab color representation as found in DICOM to CIELab
* representation. See DICOM part 3 for details.
* @param L Output CIELab luminance component with 0 <= L <= 100
* @param a Output CIELab "a" component (red<->green) with -127 <= a <= 128
* @param b Output CIELab "b" component (blue<->yellow) with -127 <= b <= 128
* @param LDicom Input CIELab luminance component with 0 <= L <= 65535 as found
* in DICOM
* @param aDicom Input CIELab "a" component (red<->green) with 0 <= a <= 65535
* as found in DICOM
* @param bDicom Input CIELab "b" component (blue<->yellow) with 0 <= b <= 65535
* as found in DICOM
*/
static void dicomlab2Lab(double& L, double& a, double& b, double LDicom, double aDicom, double bDicom);
/** Convert CIELab color representation to CIELab color representation found
* in DICOM. See DICOM part 3 for details.
* @param LDicom Output CIELab luminance component with 0 <= L <= 65535 as found
* in DICOM
* @param aDicom Output CIELab "a" component (red<->green) with 0 <= a <= 65535
* as found in DICOM
* @param bDicom Output CIELab "b" component (blue<->yellow) with 0 <= b <= 65535
* as found in DICOM
* @param L Input CIELab luminance component with 0 <= L <= 100
* @param a Input CIELab "a" component (red<->green) with -127 <= a <= 128
* @param b Input CIELab "b" component (blue<->yellow) with -127 <= b <= 128
*
*/
static void lab2DicomLab(double& LDicom, double& aDicom, double& bDicom, double L, double a, double b);
/** Convert sRGB color representation to CIELab representation
* @param L Output CIELab luminance component with 0 <= L <= 100
* @param a Output CIELab "a" component (red<->green) with -127 <= a <= 128
* @param b Output CIELab "b" component (blue<->yellow) with -127 <= b <= 128
* @param R Input sRGB "R" component (red) with 0 <= R <= 1
* @param G Input sRGB "G" component (green) with 0 <= G <= 1
* @param B Input sRGB "R" component (blue) with 0 <= B <= 1
*/
static void rgb2Lab(double& L, double& a, double& b, double R, double G, double B);
/** Convert sRGB color representation to CIE XYZ representation
* @param X Output CIELab XYZ "X" component with 0 <= X <= 1
* @param Y Output CIELab XYZ "Y" component with 0 <= Y <= 1
* @param Z Output CIELab XYZ "Z" component with 0 <= Z <= 1
* @param R Input sRGB "R" component (red) with 0 <= R <= 1
* @param G Input sRGB "G" component (green) with 0 <= G <= 1
* @param B Input sRGB "R" component (blue) with 0 <= B <= 1
*/
static void rgb2Xyz(double& X, double& Y, double& Z, double R, double G, double B);
/** Convert CIELAB XYZ color representation to CIELab representation
* @param L Output CIELab luminance component with 0 <= L <= 100
* @param a Output CIELab "a" component (red<->green) with -127 <= a <= 128
* @param b Output CIELab "b" component (blue<->yellow) with -127 <= b <= 128
* @param X Input CIELab XYZ "X" component with 0 <= X <= 1
* @param Y Input CIELab XYZ "Y" component with 0 <= Y <= 1
* @param Z Input CIELab XYZ "Z" component with 0 <= Z <= 1
*/
static void xyz2Lab(double& L, double& a, double& b, double X, double Y, double Z);
/** Convert CIELab color representation to sRGB representation
* @param R Output sRGB "R" component (red) with 0 <= R <= 1
* @param G Output sRGB "G" component (green) with 0 <= G <= 1
* @param B Output sRGB "R" component (blue) with 0 <= B <= 1
* @param L Input CIELab luminance component with 0 <= L <= 100
* @param a Input CIELab "a" component (red<->green) with -127 <= a <= 128
* @param b Input CIELab "b" component (blue<->yellow) with -127 <= b <= 128
*/
static void lab2Rgb(double& R, double& G, double& B, double L, double a, double b);
/** Convert CIELab color representation to CIE XYZ representation
* @param X Output CIELab XYZ "X" component with 0 <= X <= 1
* @param Y Output CIELab XYZ "Y" component with 0 <= Y <= 1
* @param Z Output CIELab XYZ "Z" component with 0 <= Z <= 1
* @param L Input CIELab luminance component with 0 <= L <= 100
* @param a Input CIELab "a" component (red<->green) with -127 <= a <= 128
* @param b Input CIELab "b" component (blue<->yellow) with -127 <= b <= 128
*/
static void lab2Xyz(double& X, double& Y, double& Z, double L, double a, double b);
/** Convert CIE XYZ color representation to sRGB representation
* @param R Output sRGB "R" component (red) with 0 <= R <= 1
* @param G Output sRGB "G" component (green) with 0 <= G <= 1
* @param B Output sRGB "R" component (blue) with 0 <= B <= 1
* @param X Output CIELab XYZ "X" component with 0 <= X <= 1
* @param Y Output CIELab XYZ "Y" component with 0 <= Y <= 1
* @param Z Output CIELab XYZ "Z" component with 0 <= Z <= 1
*/
static void xyz2Rgb(double& R, double& G, double& B, double X, double Y, double Z);
protected:
/** Perform sRGB gamma correction, transforms R to R'
* @param n The value to correct
* @return The gamma-corrected value
*/
static double gammaCorrection(double n);
/** Peform inverse sRGB gamma correction, transforms R' to R
* @param n The value to invert
* @return The gamma-inverted value
*/
static double invGammaCorrection(double n);
/** CIE L*a*b* f function (used to convert XYZ to L*a*b*)
* @param n value to convert
* @return The converted value
*/
static double labf(double n);
/** CIE L*a*b* inverse f function
* @param n The value to compute the inverse for
* @return The resulting inverse
*/
static double labfInv(double n);
/** Get the minimun of two numbers
* @param a First number
* @param b Second number
* @return The minimum of a, b. a if a and b are equal.
*/
static double min(double a, double b);
/** Get the minimun of three numbers
* @param a First number
* @param b Second number
* @param c Third number
* @return The minimum of a, b and c. If a value occurs more than once,
* then preference order then a is preferred if possible, b
* otherwise
*/
static double min3(double a, double b, double c);
};
#endif // CIELABUTIL_H
|