From d8deafbdc7533a9e7100961b7932f539800c28b7 Mon Sep 17 00:00:00 2001 From: nedko Date: Wed, 7 Dec 2022 15:56:44 +0200 Subject: [PATCH] Fixed HSL algorithm. It prefers colours to white/black --- complimentary_colour_extractor.cpp | 54 ++---------------------------- main.cpp | 5 ++- main_colour_extractor.cpp | 2 +- 3 files changed, 6 insertions(+), 55 deletions(-) diff --git a/complimentary_colour_extractor.cpp b/complimentary_colour_extractor.cpp index 0035124..ce38b7c 100644 --- a/complimentary_colour_extractor.cpp +++ b/complimentary_colour_extractor.cpp @@ -1,9 +1,6 @@ #include "complimentary_colour_extractor.h" - #include -#include - // CONSTRUCTORS ComplimentaryColourExtractor::ComplimentaryColourExtractor(struct ColourHSL hsl, size_t h_levels, size_t s_levels, size_t v_levels) @@ -17,7 +14,6 @@ size_t ComplimentaryColourExtractor::evaluate_colour(struct ColourHSL hsl, { size_t result = 0; double angle_delta; - // double additional_colour_weight; if ((0 == (1.0 - fabs(2 * m_main_colour.l - 1.0))) || (0 == (1.0 - fabs(2 * hsl.l - 1.0))) || @@ -25,11 +21,9 @@ size_t ComplimentaryColourExtractor::evaluate_colour(struct ColourHSL hsl, (0 == hsl.s)) { angle_delta = 90.0; - // additional_colour_weight = 0.5; } else { - // additional_colour_weight = 1.0; /* SECTION BEGIN */ angle_delta = fabs(hsl.h - m_main_colour.h); if (angle_delta > 180.0F) @@ -39,51 +33,9 @@ size_t ComplimentaryColourExtractor::evaluate_colour(struct ColourHSL hsl, /* SECTION END */ } - // double main_x = cos(m_main_colour.h * M_PI / 180.0) * m_main_colour.s; - // double main_y = sin(m_main_colour.h * M_PI / 180.0) * m_main_colour.s; - // double main_z = 1.0 - 2 * m_main_colour.l; - // double eval_x = cos(hsl.h * M_PI / 180.0) * hsl.s; - // double eval_y = sin(hsl.h * M_PI / 180.0) * hsl.s; - // double eval_z = 1.0 - 2 * hsl.l; - // // double total_x = main_x - eval_x; - // // double total_y = main_y - eval_y; - // // double total_z = main_z - eval_z; - // //double vec_magn = sqrt(pow(total_x, 2) + pow(total_y, 2) + pow(total_z, 2)); - // double angle_diff = -(((main_x * eval_x + main_y * eval_y + main_z * eval_z) / - // (sqrt(pow(main_x, 2) + pow(main_y, 2) + pow(main_z, 2)) * - // sqrt(pow(eval_x, 2) + pow(eval_y, 2) + pow(eval_z, 2)))) - 1.0) / 2; - - - // static double max_angle_diff = 0.0; - // printf("Main - %f %f %f\n", m_main_colour.h, m_main_colour.s, m_main_colour.l); - // printf("Eval - %f %f %f\n", hsl.h, hsl.s, hsl.l); - // printf("Main Vec - %f %f %f\n", main_x, main_y, main_z); - // printf("Eval Vec - %f %f %f\n", eval_x, eval_y, eval_z); - // // printf("Res Vec - %f %f %f\n", total_x, total_y, total_z); - // printf("Ang diff - %f\n", angle_diff); - // if (angle_diff > max_angle_diff) - // { - // max_angle_diff = angle_diff; - // printf("Max Angle Diff\n"); - // } - - // angle_delta = fabs(hsl.h - m_main_colour.h); - // if (angle_delta > 180.0F) - // { - // angle_delta = 360.0F - angle_delta; - // } - - // result = static_cast(round(1000.0 * pow(weight, 0.3) * hsv.v * - // fmin(1.0, hsv.v + hsv.s) * additional_colour_weight * angle_delta)); - - // result = static_cast(round(1000.0 * pow(weight, 0.3) * hsl.l * - // additional_colour_weight * angle_delta)); - - result = static_cast(round(1000.0 * pow(weight, 0.3) * - pow(((1.0 - fabs(2 * hsl.l - 1.0)) * (1 - 1.0 / m_l_levels) + 1.0 / m_l_levels), 0.3) * - hsl.s * - // additional_colour_weight * - angle_delta)); + result = static_cast(round(1000.0 * pow(weight, 0.3) * angle_delta * + (hsl.s + 1.0 / m_s_levels) * + pow(((1.0 - fabs(2 * hsl.l - 1.0)) * (1 - 1.0 / m_l_levels) + 1.0 / m_l_levels), 0.3))); return result; } diff --git a/main.cpp b/main.cpp index b0c5d07..cc8bd29 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,6 @@ #include -#include #include +#include #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" @@ -18,8 +18,7 @@ void print_pixel(ColourRGB rgb) uint8_t g = static_cast(round(rgb.g * 255)); uint8_t b = static_cast(round(rgb.b * 255)); - cout << "#" << std::hex << (int)r << (int)g << (int)b; - cout << std::dec << " - " << (int)r << " " << (int)g << " " << (int)b; + printf("#%02x%02x%02x - %3d %3d %3d", r, g ,b, r, g, b); } void usage(char *name) diff --git a/main_colour_extractor.cpp b/main_colour_extractor.cpp index df7cb80..bb1ef98 100644 --- a/main_colour_extractor.cpp +++ b/main_colour_extractor.cpp @@ -16,7 +16,7 @@ size_t MainColourExtractor::evaluate_colour(struct ColourHSL hsl, double weight) size_t result = 0; result = static_cast(round(1000.0 * pow(weight, 0.3) * - (hsl.s + 1.0 / m_h_levels) * + (hsl.s + 1.0 / m_s_levels) * ((1.0 - fabs(2 * hsl.l - 1.0)) * (1 - 1.0 / m_l_levels) + 1.0 / m_l_levels))); return result;