diff --git a/.gitignore b/.gitignore index fa4369e..6ba725a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ *.dylib *.o *.dSYM -testCIEDE2000 - +build/ +.vscode/ \ No newline at end of file diff --git a/CIEDE2000.cpp b/CIEDE2000.cpp deleted file mode 100644 index ac6d2c0..0000000 --- a/CIEDE2000.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/* - * CIEDE2000.cpp - * Part of http://github.com/gfiumara/CIEDE2000 by Gregory Fiumara. - * See LICENSE for details. - */ - -#include - -#include - -/******************************************************************************* - * Conversions. - ******************************************************************************/ - -constexpr double -CIEDE2000::deg2Rad( - const double deg) -{ - return (deg * (M_PI / 180.0)); -} - -constexpr double -CIEDE2000::rad2Deg( - const double rad) -{ - return ((180.0 / M_PI) * rad); -} - -double -CIEDE2000::CIEDE2000( - const LAB &lab1, - const LAB &lab2) -{ - /* - * "For these and all other numerical/graphical 􏰀delta E00 values - * reported in this article, we set the parametric weighting factors - * to unity(i.e., k_L = k_C = k_H = 1.0)." (Page 27). - */ - const double k_L = 1.0, k_C = 1.0, k_H = 1.0; - const double deg360InRad = CIEDE2000::deg2Rad(360.0); - const double deg180InRad = CIEDE2000::deg2Rad(180.0); - const double pow25To7 = 6103515625.0; /* pow(25, 7) */ - - /* - * Step 1 - */ - /* Equation 2 */ - double C1 = sqrt((lab1.a * lab1.a) + (lab1.b * lab1.b)); - double C2 = sqrt((lab2.a * lab2.a) + (lab2.b * lab2.b)); - /* Equation 3 */ - double barC = (C1 + C2) / 2.0; - /* Equation 4 */ - double G = 0.5 * (1 - sqrt(pow(barC, 7) / (pow(barC, 7) + pow25To7))); - /* Equation 5 */ - double a1Prime = (1.0 + G) * lab1.a; - double a2Prime = (1.0 + G) * lab2.a; - /* Equation 6 */ - double CPrime1 = sqrt((a1Prime * a1Prime) + (lab1.b * lab1.b)); - double CPrime2 = sqrt((a2Prime * a2Prime) + (lab2.b * lab2.b)); - /* Equation 7 */ - double hPrime1; - if (lab1.b == 0 && a1Prime == 0) - hPrime1 = 0.0; - else { - hPrime1 = atan2(lab1.b, a1Prime); - /* - * This must be converted to a hue angle in degrees between 0 - * and 360 by addition of 2􏰏 to negative hue angles. - */ - if (hPrime1 < 0) - hPrime1 += deg360InRad; - } - double hPrime2; - if (lab2.b == 0 && a2Prime == 0) - hPrime2 = 0.0; - else { - hPrime2 = atan2(lab2.b, a2Prime); - /* - * This must be converted to a hue angle in degrees between 0 - * and 360 by addition of 2􏰏 to negative hue angles. - */ - if (hPrime2 < 0) - hPrime2 += deg360InRad; - } - - /* - * Step 2 - */ - /* Equation 8 */ - double deltaLPrime = lab2.l - lab1.l; - /* Equation 9 */ - double deltaCPrime = CPrime2 - CPrime1; - /* Equation 10 */ - double deltahPrime; - double CPrimeProduct = CPrime1 * CPrime2; - if (CPrimeProduct == 0) - deltahPrime = 0; - else { - /* Avoid the fabs() call */ - deltahPrime = hPrime2 - hPrime1; - if (deltahPrime < -deg180InRad) - deltahPrime += deg360InRad; - else if (deltahPrime > deg180InRad) - deltahPrime -= deg360InRad; - } - /* Equation 11 */ - double deltaHPrime = 2.0 * sqrt(CPrimeProduct) * - sin(deltahPrime / 2.0); - - /* - * Step 3 - */ - /* Equation 12 */ - double barLPrime = (lab1.l + lab2.l) / 2.0; - /* Equation 13 */ - double barCPrime = (CPrime1 + CPrime2) / 2.0; - /* Equation 14 */ - double barhPrime, hPrimeSum = hPrime1 + hPrime2; - if (CPrime1 * CPrime2 == 0) { - barhPrime = hPrimeSum; - } else { - if (fabs(hPrime1 - hPrime2) <= deg180InRad) - barhPrime = hPrimeSum / 2.0; - else { - if (hPrimeSum < deg360InRad) - barhPrime = (hPrimeSum + deg360InRad) / 2.0; - else - barhPrime = (hPrimeSum - deg360InRad) / 2.0; - } - } - /* Equation 15 */ - double T = 1.0 - (0.17 * cos(barhPrime - CIEDE2000::deg2Rad(30.0))) + - (0.24 * cos(2.0 * barhPrime)) + - (0.32 * cos((3.0 * barhPrime) + CIEDE2000::deg2Rad(6.0))) - - (0.20 * cos((4.0 * barhPrime) - CIEDE2000::deg2Rad(63.0))); - /* Equation 16 */ - double deltaTheta = CIEDE2000::deg2Rad(30.0) * - exp(-pow((barhPrime - deg2Rad(275.0)) / deg2Rad(25.0), 2.0)); - /* Equation 17 */ - double R_C = 2.0 * sqrt(pow(barCPrime, 7.0) / - (pow(barCPrime, 7.0) + pow25To7)); - /* Equation 18 */ - double S_L = 1 + ((0.015 * pow(barLPrime - 50.0, 2.0)) / - sqrt(20 + pow(barLPrime - 50.0, 2.0))); - /* Equation 19 */ - double S_C = 1 + (0.045 * barCPrime); - /* Equation 20 */ - double S_H = 1 + (0.015 * barCPrime * T); - /* Equation 21 */ - double R_T = (-sin(2.0 * deltaTheta)) * R_C; - - /* Equation 22 */ - double deltaE = sqrt( - pow(deltaLPrime / (k_L * S_L), 2.0) + - pow(deltaCPrime / (k_C * S_C), 2.0) + - pow(deltaHPrime / (k_H * S_H), 2.0) + - (R_T * (deltaCPrime / (k_C * S_C)) * (deltaHPrime / (k_H * S_H)))); - - return (deltaE); -} - -/******************************************************************************* - * Operators. - ******************************************************************************/ - -std::ostream& -operator<<( - std::ostream &s, - const CIEDE2000::LAB &labColor) -{ - return (s << "CIELAB(" << labColor.l << "," << labColor.a << "," << - labColor.b << ")"); -} - diff --git a/CIEDE2000.h b/CIEDE2000.h deleted file mode 100644 index 2a43bde..0000000 --- a/CIEDE2000.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * CIEDE2000.h - * Part of http://github.com/gfiumara/CIEDE2000 by Gregory Fiumara. - * See LICENSE for details. - */ - -#ifndef GPF_CIEDE2000_H_ -#define GPF_CIEDE2000_H_ - -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338327950288 /* pi */ -#endif - -/** Namespace containing all necessary objects and methods for CIEDE2000 */ -namespace CIEDE2000 -{ - /*********************************************************************** - * Types. - **********************************************************************/ - - /** A color in CIELAB colorspace */ - struct LAB - { - /** Lightness */ - double l; - /** Color-opponent a dimension */ - double a; - /** Color-opponent b dimension */ - double b; - }; - /** Convenience definition for struct LAB */ - using LAB = struct LAB; - - /*********************************************************************** - * Operations. - **********************************************************************/ - - /** - * @brief - * Obtain Delta-E 2000 value. - * @details - * Based on the paper "The CIEDE2000 Color-Difference Formula: - * Implementation Notes, Supplementary Test Data, and Mathematical - * Observations" by Gaurav Sharma, Wencheng Wu, and Edul N. Dalal, - * from http://www.ece.rochester.edu/~gsharma/ciede2000/. - * - * @param lab1 - * First color in LAB colorspace. - * @param lab2 - * Second color in LAB colorspace. - * - * @return - * Delta-E difference between lab1 and lab2. - */ - double - CIEDE2000( - const LAB &lab1, - const LAB &lab2); - - /*********************************************************************** - * Conversions. - **********************************************************************/ - - /** - * @brief - * Convert degrees to radians. - * - * @param deg - * Angle in degrees. - * - * @return - * deg in radians. - */ - constexpr double - deg2Rad( - const double deg); - - /** - * @brief - * Convert radians to degrees. - * - * @param rad - * Angle in radians. - * - * @return - * rad in degrees. - */ - constexpr double - rad2Deg( - const double rad); -} - -/******************************************************************************* - * Conversions. - ******************************************************************************/ - -/** - * @brief - * LAB output stream operator. - * - * @param s - * Output stream. - * @param labColor - * Color to output. - * - * @return - * s with labColor appended. - */ -std::ostream& -operator<<( - std::ostream &s, - const CIEDE2000::LAB &labColor); - -#endif /* GPF_CIEDE2000_H_ */ - diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d16dfc9 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required (VERSION 3.1) + +project(color) + +# Compiler-specific C++11 activation. +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +add_library(CIEDE2000 SHARED src/CIEDE2000.cpp) +target_include_directories(CIEDE2000 PUBLIC include) + +add_executable(testCIEDE2000 test/testCIEDE2000.cpp) +target_link_libraries(testCIEDE2000 CIEDE2000) diff --git a/include/color.h b/include/color.h new file mode 100644 index 0000000..24b3e3d --- /dev/null +++ b/include/color.h @@ -0,0 +1,122 @@ +/* + * color.h + * Part of http://github.com/gfiumara/color by Gregory Fiumara. + * See LICENSE for details. + */ + +#ifndef GPF_COLOR_H_ +#define GPF_COLOR_H_ + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338327950288 /* pi */ +#endif + +/** Namespace containing all necessary objects and methods for color */ +namespace color { +/*********************************************************************** + * Types. + **********************************************************************/ + +/** A color in CIELAB colorspace */ +struct LAB { + /** Lightness */ + double l; + /** Color-opponent a dimension */ + double a; + /** Color-opponent b dimension */ + double b; +}; +/** Convenience definition for struct LAB */ +using LAB = struct LAB; + +/** A color in CIEXYZ colorspace */ +struct XYZ { + double x; + double y; + double z; +}; +/** Convenience definition for struct XYZ */ +using XYZ = struct XYZ; + +/** A color in CIERGB colorspace */ +struct RGB { + double r; + double g; + double b; +}; +/** Convenience definition for struct RGB */ +using RGB = struct RGB; + +/*********************************************************************** + * Operations. + **********************************************************************/ + +/** + * @brief + * Obtain Delta-E 2000 value. + * @details + * Based on the paper "The color Color-Difference Formula: + * Implementation Notes, Supplementary Test Data, and Mathematical + * Observations" by Gaurav Sharma, Wencheng Wu, and Edul N. Dalal, + * from http://www.ece.rochester.edu/~gsharma/ciede2000/. + * + * @param lab1 + * First color in LAB colorspace. + * @param lab2 + * Second color in LAB colorspace. + * + * @return + * Delta-E difference between lab1 and lab2. + */ +double CIEDE2000(const LAB &lab1, const LAB &lab2); + +/*********************************************************************** + * Conversions. + **********************************************************************/ + +/** + * @brief + * Convert degrees to radians. + * + * @param deg + * Angle in degrees. + * + * @return + * deg in radians. + */ +constexpr double deg2Rad(const double deg); + +/** + * @brief + * Convert radians to degrees. + * + * @param rad + * Angle in radians. + * + * @return + * rad in degrees. + */ +constexpr double rad2Deg(const double rad); + +/******************************************************************************* + * Conversions. + ******************************************************************************/ + +} // namespace color +/** + * @brief + * LAB output stream operator. + * + * @param s + * Output stream. + * @param labColor + * Color to output. + * + * @return + * s with labColor appended. + */ +std::ostream &operator<<(std::ostream &s, const color::LAB &labColor); + +#endif /* GPF_COLOR_H_ */ diff --git a/src/CIEDE2000.cpp b/src/CIEDE2000.cpp new file mode 100644 index 0000000..b5123f1 --- /dev/null +++ b/src/CIEDE2000.cpp @@ -0,0 +1,159 @@ +/* + * color.cpp + * Part of http://github.com/gfiumara/color by Gregory Fiumara. + * See LICENSE for details. + */ + +#include + +#include + +/******************************************************************************* + * Conversions. + ******************************************************************************/ + +constexpr double color::deg2Rad(const double deg) { + return (deg * (M_PI / 180.0)); +} + +constexpr double color::rad2Deg(const double rad) { + return ((180.0 / M_PI) * rad); +} + +double color::CIEDE2000(const LAB &lab1, const LAB &lab2) { + /* + * "For these and all other numerical/graphical 􏰀delta E00 values + * reported in this article, we set the parametric weighting factors + * to unity(i.e., k_L = k_C = k_H = 1.0)." (Page 27). + */ + const double k_L = 1.0, k_C = 1.0, k_H = 1.0; + const double deg360InRad = color::deg2Rad(360.0); + const double deg180InRad = color::deg2Rad(180.0); + const double pow25To7 = 6103515625.0; /* pow(25, 7) */ + + /* + * Step 1 + */ + /* Equation 2 */ + double C1 = sqrt((lab1.a * lab1.a) + (lab1.b * lab1.b)); + double C2 = sqrt((lab2.a * lab2.a) + (lab2.b * lab2.b)); + /* Equation 3 */ + double barC = (C1 + C2) / 2.0; + /* Equation 4 */ + double G = 0.5 * (1 - sqrt(pow(barC, 7) / (pow(barC, 7) + pow25To7))); + /* Equation 5 */ + double a1Prime = (1.0 + G) * lab1.a; + double a2Prime = (1.0 + G) * lab2.a; + /* Equation 6 */ + double CPrime1 = sqrt((a1Prime * a1Prime) + (lab1.b * lab1.b)); + double CPrime2 = sqrt((a2Prime * a2Prime) + (lab2.b * lab2.b)); + /* Equation 7 */ + double hPrime1; + if (lab1.b == 0 && a1Prime == 0) + hPrime1 = 0.0; + else { + hPrime1 = atan2(lab1.b, a1Prime); + /* + * This must be converted to a hue angle in degrees between 0 + * and 360 by addition of 2􏰏 to negative hue angles. + */ + if (hPrime1 < 0) + hPrime1 += deg360InRad; + } + double hPrime2; + if (lab2.b == 0 && a2Prime == 0) + hPrime2 = 0.0; + else { + hPrime2 = atan2(lab2.b, a2Prime); + /* + * This must be converted to a hue angle in degrees between 0 + * and 360 by addition of 2􏰏 to negative hue angles. + */ + if (hPrime2 < 0) + hPrime2 += deg360InRad; + } + + /* + * Step 2 + */ + /* Equation 8 */ + double deltaLPrime = lab2.l - lab1.l; + /* Equation 9 */ + double deltaCPrime = CPrime2 - CPrime1; + /* Equation 10 */ + double deltahPrime; + double CPrimeProduct = CPrime1 * CPrime2; + if (CPrimeProduct == 0) + deltahPrime = 0; + else { + /* Avoid the fabs() call */ + deltahPrime = hPrime2 - hPrime1; + if (deltahPrime < -deg180InRad) + deltahPrime += deg360InRad; + else if (deltahPrime > deg180InRad) + deltahPrime -= deg360InRad; + } + /* Equation 11 */ + double deltaHPrime = 2.0 * sqrt(CPrimeProduct) * sin(deltahPrime / 2.0); + + /* + * Step 3 + */ + /* Equation 12 */ + double barLPrime = (lab1.l + lab2.l) / 2.0; + /* Equation 13 */ + double barCPrime = (CPrime1 + CPrime2) / 2.0; + /* Equation 14 */ + double barhPrime, hPrimeSum = hPrime1 + hPrime2; + if (CPrime1 * CPrime2 == 0) { + barhPrime = hPrimeSum; + } else { + if (fabs(hPrime1 - hPrime2) <= deg180InRad) + barhPrime = hPrimeSum / 2.0; + else { + if (hPrimeSum < deg360InRad) + barhPrime = (hPrimeSum + deg360InRad) / 2.0; + else + barhPrime = (hPrimeSum - deg360InRad) / 2.0; + } + } + /* Equation 15 */ + double T = 1.0 - (0.17 * cos(barhPrime - color::deg2Rad(30.0))) + + (0.24 * cos(2.0 * barhPrime)) + + (0.32 * cos((3.0 * barhPrime) + color::deg2Rad(6.0))) - + (0.20 * cos((4.0 * barhPrime) - color::deg2Rad(63.0))); + /* Equation 16 */ + double deltaTheta = + color::deg2Rad(30.0) * + exp(-pow((barhPrime - deg2Rad(275.0)) / deg2Rad(25.0), 2.0)); + /* Equation 17 */ + double R_C = + 2.0 * sqrt(pow(barCPrime, 7.0) / (pow(barCPrime, 7.0) + pow25To7)); + /* Equation 18 */ + double S_L = 1 + ((0.015 * pow(barLPrime - 50.0, 2.0)) / + sqrt(20 + pow(barLPrime - 50.0, 2.0))); + /* Equation 19 */ + double S_C = 1 + (0.045 * barCPrime); + /* Equation 20 */ + double S_H = 1 + (0.015 * barCPrime * T); + /* Equation 21 */ + double R_T = (-sin(2.0 * deltaTheta)) * R_C; + + /* Equation 22 */ + double deltaE = + sqrt(pow(deltaLPrime / (k_L * S_L), 2.0) + + pow(deltaCPrime / (k_C * S_C), 2.0) + + pow(deltaHPrime / (k_H * S_H), 2.0) + + (R_T * (deltaCPrime / (k_C * S_C)) * (deltaHPrime / (k_H * S_H)))); + + return (deltaE); +} + +/******************************************************************************* + * Operators. + ******************************************************************************/ + +std::ostream &operator<<(std::ostream &s, const color::LAB &labColor) { + return (s << "CIELAB(" << labColor.l << "," << labColor.a << "," << labColor.b + << ")"); +} diff --git a/test/testCIEDE2000.cpp b/test/testCIEDE2000.cpp new file mode 100644 index 0000000..a0fe306 --- /dev/null +++ b/test/testCIEDE2000.cpp @@ -0,0 +1,552 @@ +/* + * testcolor.cpp + * Part of http://github.com/gfiumara/color by Gregory Fiumara. + * See LICENSE for details. + */ + +#include +#include +#include + +#include + +/** + * @brief + * Run the test dataset run from the color paper. + * + * @return + * EXIT_SUCCESS if all tests pass, EXIT_FAILURE otherwise. + */ +int testcolor(); + +int main(int argc, char *argv[]) { return (testcolor()); } + +int testcolor() { + color::LAB lab1, lab2; + double expectedResult, myResult; + unsigned int line = 1; + char myBuffer[64], expectedBuffer[64]; + std::string myStr, expectedStr; + std::vector passFail; + + lab1 = {50.0000, 2.6772, -79.7751}; + lab2 = {50.0000, 0.0000, -82.7485}; + expectedResult = 2.0425; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 3.1571, -77.2803}; + lab2 = {50.0000, 0.0000, -82.7485}; + expectedResult = 2.8615; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.8361, -74.0200}; + lab2 = {50.0000, 0.0000, -82.7485}; + expectedResult = 3.4412; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, -1.3802, -84.2814}; + lab2 = {50.0000, 0.0000, -82.7485}; + expectedResult = 1.0000; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, -1.1848, -84.8006}; + lab2 = {50.0000, 0.0000, -82.7485}; + expectedResult = 1.0000; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, -0.9009, -85.5211}; + lab2 = {50.0000, 0.0000, -82.7485}; + expectedResult = 1.0000; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 0.0000, 0.0000}; + lab2 = {50.0000, -1.0000, 2.0000}; + expectedResult = 2.3669; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, -1.0000, 2.0000}; + lab2 = {50.0000, 0.0000, 0.0000}; + expectedResult = 2.3669; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.4900, -0.0010}; + lab2 = {50.0000, -2.4900, 0.0009}; + expectedResult = 7.1792; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.4900, -0.0010}; + lab2 = {50.0000, -2.4900, 0.0010}; + expectedResult = 7.1792; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.4900, -0.0010}; + lab2 = {50.0000, -2.4900, 0.0011}; + expectedResult = 7.2195; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.4900, -0.0010}; + lab2 = {50.0000, -2.4900, 0.0012}; + expectedResult = 7.2195; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, -0.0010, 2.4900}; + lab2 = {50.0000, 0.0009, -2.4900}; + expectedResult = 4.8045; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, -0.0010, 2.4900}; + lab2 = {50.0000, 0.0010, -2.4900}; + expectedResult = 4.8045; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, -0.0010, 2.4900}; + lab2 = {50.0000, 0.0011, -2.4900}; + expectedResult = 4.7461; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.5000, 0.0000}; + lab2 = {50.0000, 0.0000, -2.5000}; + expectedResult = 4.3065; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.5000, 0.0000}; + lab2 = {73.0000, 25.0000, -18.0000}; + expectedResult = 27.1492; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.5000, 0.0000}; + lab2 = {61.0000, -5.0000, 29.0000}; + expectedResult = 22.8977; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.5000, 0.0000}; + lab2 = {56.0000, -27.0000, -3.0000}; + expectedResult = 31.9030; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.5000, 0.0000}; + lab2 = {58.0000, 24.0000, 15.0000}; + expectedResult = 19.4535; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.5000, 0.0000}; + lab2 = {50.0000, 3.1736, 0.5854}; + expectedResult = 1.0000; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.5000, 0.0000}; + lab2 = {50.0000, 3.2972, 0.0000}; + expectedResult = 1.0000; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.5000, 0.0000}; + lab2 = {50.0000, 1.8634, 0.5757}; + expectedResult = 1.0000; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {50.0000, 2.5000, 0.0000}; + lab2 = {50.0000, 3.2592, 0.3350}; + expectedResult = 1.0000; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {60.2574, -34.0099, 36.2677}; + lab2 = {60.4626, -34.1751, 39.4387}; + expectedResult = 1.2644; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {63.0109, -31.0961, -5.8663}; + lab2 = {62.8187, -29.7946, -4.0864}; + expectedResult = 1.2630; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {61.2901, 3.7196, -5.3901}; + lab2 = {61.4292, 2.2480, -4.9620}; + expectedResult = 1.8731; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {35.0831, -44.1164, 3.7933}; + lab2 = {35.0232, -40.0716, 1.5901}; + expectedResult = 1.8645; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {22.7233, 20.0904, -46.6940}; + lab2 = {23.0331, 14.9730, -42.5619}; + expectedResult = 2.0373; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {36.4612, 47.8580, 18.3852}; + lab2 = {36.2715, 50.5065, 21.2231}; + expectedResult = 1.4146; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {90.8027, -2.0831, 1.4410}; + lab2 = {91.1528, -1.6435, 0.0447}; + expectedResult = 1.4441; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {90.9257, -0.5406, -0.9208}; + lab2 = {88.6381, -0.8985, -0.7239}; + expectedResult = 1.5381; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {6.7747, -0.2908, -2.4247}; + lab2 = {5.8714, -0.0985, -2.2286}; + expectedResult = 0.6377; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + lab1 = {2.0776, 0.0795, -1.1350}; + lab2 = {0.9033, -0.0636, -0.5514}; + expectedResult = 0.9082; + sprintf(expectedBuffer, "%.4f", expectedResult); + expectedStr = expectedBuffer; + myResult = color::CIEDE2000(lab1, lab2); + sprintf(myBuffer, "%.4f", myResult); + myStr = myBuffer; + std::cout << line << ": "; + std::cout << myStr << " vs " << expectedStr << '\t'; + passFail.push_back(myStr == expectedStr); + std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; + std::cout << std::endl; + line++; + + std::cout << std::endl; + int ret = EXIT_SUCCESS; + for (unsigned int i = 0; i < passFail.size(); i++) { + if (!passFail[i]) { + std::cout << "Test failed on line " << std::to_string(i + 1) << std::endl; + ret = EXIT_FAILURE; + } + } + + return (ret); +} diff --git a/testCIEDE2000.cpp b/testCIEDE2000.cpp deleted file mode 100644 index 6c6e673..0000000 --- a/testCIEDE2000.cpp +++ /dev/null @@ -1,563 +0,0 @@ -/* - * testCIEDE2000.cpp - * Part of http://github.com/gfiumara/CIEDE2000 by Gregory Fiumara. - * See LICENSE for details. - */ - -#include -#include -#include - -#include - -/** - * @brief - * Run the test dataset run from the CIEDE2000 paper. - * - * @return - * EXIT_SUCCESS if all tests pass, EXIT_FAILURE otherwise. - */ -int -testCIEDE2000(); - -int -main( - int argc, - char *argv[]) -{ - return (testCIEDE2000()); -} - -int -testCIEDE2000() -{ - CIEDE2000::LAB lab1, lab2; - double expectedResult, myResult; - unsigned int line = 1; - char myBuffer[64], expectedBuffer[64]; - std::string myStr, expectedStr; - std::vector passFail; - - lab1 = {50.0000, 2.6772, -79.7751}; - lab2 = {50.0000, 0.0000, -82.7485}; - expectedResult = 2.0425; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 3.1571, -77.2803}; - lab2 = {50.0000, 0.0000, -82.7485}; - expectedResult = 2.8615; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.8361, -74.0200}; - lab2 = {50.0000, 0.0000, -82.7485}; - expectedResult = 3.4412; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, -1.3802, -84.2814}; - lab2 = {50.0000, 0.0000, -82.7485}; - expectedResult = 1.0000; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, -1.1848, -84.8006}; - lab2 = {50.0000, 0.0000, -82.7485}; - expectedResult = 1.0000; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, -0.9009, -85.5211}; - lab2 = {50.0000, 0.0000, -82.7485}; - expectedResult = 1.0000; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 0.0000, 0.0000}; - lab2 = {50.0000, -1.0000, 2.0000}; - expectedResult = 2.3669; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, -1.0000, 2.0000}; - lab2 = {50.0000, 0.0000, 0.0000}; - expectedResult = 2.3669; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.4900, -0.0010}; - lab2 = {50.0000, -2.4900, 0.0009}; - expectedResult = 7.1792; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.4900, -0.0010}; - lab2 = {50.0000, -2.4900, 0.0010}; - expectedResult = 7.1792; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.4900, -0.0010}; - lab2 = {50.0000, -2.4900, 0.0011}; - expectedResult = 7.2195; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.4900, -0.0010}; - lab2 = {50.0000, -2.4900, 0.0012}; - expectedResult = 7.2195; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, -0.0010, 2.4900}; - lab2 = {50.0000, 0.0009, -2.4900}; - expectedResult = 4.8045; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, -0.0010, 2.4900}; - lab2 = {50.0000, 0.0010, -2.4900}; - expectedResult = 4.8045; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, -0.0010, 2.4900}; - lab2 = {50.0000, 0.0011, -2.4900}; - expectedResult = 4.7461; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.5000, 0.0000}; - lab2 = {50.0000, 0.0000, -2.5000}; - expectedResult = 4.3065; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.5000, 0.0000}; - lab2 = {73.0000, 25.0000, -18.0000}; - expectedResult = 27.1492; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.5000, 0.0000}; - lab2 = {61.0000, -5.0000, 29.0000}; - expectedResult = 22.8977; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.5000, 0.0000}; - lab2 = {56.0000, -27.0000, -3.0000}; - expectedResult = 31.9030; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.5000, 0.0000}; - lab2 = {58.0000, 24.0000, 15.0000}; - expectedResult = 19.4535; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.5000, 0.0000}; - lab2 = {50.0000, 3.1736, 0.5854}; - expectedResult = 1.0000; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.5000, 0.0000}; - lab2 = {50.0000, 3.2972, 0.0000}; - expectedResult = 1.0000; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.5000, 0.0000}; - lab2 = {50.0000, 1.8634, 0.5757}; - expectedResult = 1.0000; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {50.0000, 2.5000, 0.0000}; - lab2 = {50.0000, 3.2592, 0.3350}; - expectedResult = 1.0000; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {60.2574, -34.0099, 36.2677}; - lab2 = {60.4626, -34.1751, 39.4387}; - expectedResult = 1.2644; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {63.0109, -31.0961, -5.8663}; - lab2 = {62.8187, -29.7946, -4.0864}; - expectedResult = 1.2630; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {61.2901, 3.7196, -5.3901}; - lab2 = {61.4292, 2.2480, -4.9620}; - expectedResult = 1.8731; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {35.0831, -44.1164, 3.7933}; - lab2 = {35.0232, -40.0716, 1.5901}; - expectedResult = 1.8645; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {22.7233, 20.0904, -46.6940}; - lab2 = {23.0331, 14.9730, -42.5619}; - expectedResult = 2.0373; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {36.4612, 47.8580, 18.3852}; - lab2 = {36.2715, 50.5065, 21.2231}; - expectedResult = 1.4146; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {90.8027, -2.0831, 1.4410}; - lab2 = {91.1528, -1.6435, 0.0447}; - expectedResult = 1.4441; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {90.9257, -0.5406, -0.9208}; - lab2 = {88.6381, -0.8985, -0.7239}; - expectedResult = 1.5381; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {6.7747, -0.2908, -2.4247}; - lab2 = {5.8714, -0.0985, -2.2286}; - expectedResult = 0.6377; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - lab1 = {2.0776, 0.0795, -1.1350}; - lab2 = {0.9033, -0.0636, -0.5514}; - expectedResult = 0.9082; - sprintf(expectedBuffer, "%.4f", expectedResult); - expectedStr = expectedBuffer; - myResult = CIEDE2000::CIEDE2000(lab1, lab2); - sprintf(myBuffer, "%.4f", myResult); - myStr = myBuffer; - std::cout << line << ": "; - std::cout << myStr << " vs " << expectedStr << '\t'; - passFail.push_back(myStr == expectedStr); - std::cout << (passFail[line - 1] ? "PASS" : "FAIL") << ' '; - std::cout << std::endl; - line++; - - std::cout << std::endl; - int ret = EXIT_SUCCESS; - for (unsigned int i = 0; i < passFail.size(); i++) { - if (!passFail[i]) { - std::cout << "Test failed on line " << - std::to_string(i + 1) << std::endl; - ret = EXIT_FAILURE; - } - } - - return (ret); -} -