From a011765e90e9b09d2402fac3a8cd72e2fcc51cfe Mon Sep 17 00:00:00 2001 From: Tyler Date: Wed, 4 Mar 2020 07:06:17 -0800 Subject: [PATCH] experimental ssim commit --- dandere2x_cpp/src/Image/SSIM/SSIM.h | 43 ++++++++++++++++++++++------- dandere2x_cpp/src/main.cpp | 2 +- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/dandere2x_cpp/src/Image/SSIM/SSIM.h b/dandere2x_cpp/src/Image/SSIM/SSIM.h index a6216fb..6254a6b 100644 --- a/dandere2x_cpp/src/Image/SSIM/SSIM.h +++ b/dandere2x_cpp/src/Image/SSIM/SSIM.h @@ -10,17 +10,29 @@ class SSIM { public: - static double getLumaColor(Image::Color &col) { - return col.r * (double) 0.212655 + col.g * (double) 0.715158 + (double) 0.072187 * col.b; + static int getLumaColor(Image::Color &col, char color) { + + switch(color){ + case 'r': + return col.r; + break; + case 'g': + return col.g; + break; + case 'b': + return col.b; + break; + } + //return col.r * (double) 0.212655 + col.g * (double) 0.715158 + (double) 0.072187 * col.b; } - static double averageLuma(Image &image, int initial_x, int initial_y, int block_size) { + static double averageLuma(Image &image, int initial_x, int initial_y, int block_size, char color) { double sum = 0; for (int x = 0; x < block_size; x++) { for (int y = 0; y < block_size; y++) { - sum += getLumaColor(image.get_color(initial_x + x, initial_y + y)); + sum += getLumaColor(image.get_color(initial_x + x, initial_y + y), color); } } @@ -29,12 +41,23 @@ public: } static double ssim(Image &image_A, Image &image_B, + int initial_x, int initial_y, + int variable_x, int variable_y, + int block_size){ + double r = ssim_color(image_A, image_B, initial_x, initial_y, variable_x, variable_y, block_size, 'r'); + double g = ssim_color(image_A, image_B, initial_x, initial_y, variable_x, variable_y, block_size, 'g'); + double b = ssim_color(image_A, image_B, initial_x, initial_y, variable_x, variable_y, block_size, 'b'); + + return (r + g + b) / 3; + } + + static double ssim_color(Image &image_A, Image &image_B, int initial_x, int initial_y, int variable_x, int variable_y, - int block_size) { + int block_size, char color) { - double mx = averageLuma(image_A, initial_x, initial_y, block_size); - double my = averageLuma(image_B, variable_x, variable_y, block_size); + double mx = averageLuma(image_A, initial_x, initial_y, block_size, color); + double my = averageLuma(image_B, variable_x, variable_y, block_size, color); double sigxy = 0; double sigsqx = 0; @@ -42,10 +65,10 @@ public: for (int x = 0; x < block_size; x++) { for (int y = 0; y < block_size; y++) { - sigsqx += pow((getLumaColor(image_A.get_color(initial_x + x, initial_y + y)) - mx), 2); - sigsqy += pow((getLumaColor(image_B.get_color(variable_x + x, variable_y + y)) - my), 2); + sigsqx += pow((getLumaColor(image_A.get_color(initial_x + x, initial_y + y), color) - mx), 2); + sigsqy += pow((getLumaColor(image_B.get_color(variable_x + x, variable_y + y), color) - my), 2); - sigxy += (getLumaColor(image_A.get_color(initial_x + x, initial_y + y)) - mx) * (getLumaColor(image_B.get_color(variable_x + x, variable_y + y)) - my); + sigxy += (getLumaColor(image_A.get_color(initial_x + x, initial_y + y), color) - mx) * (getLumaColor(image_B.get_color(variable_x + x, variable_y + y), color) - my); } } diff --git a/dandere2x_cpp/src/main.cpp b/dandere2x_cpp/src/main.cpp index 6a66767..7beedf8 100644 --- a/dandere2x_cpp/src/main.cpp +++ b/dandere2x_cpp/src/main.cpp @@ -51,7 +51,7 @@ int main(int argc, char **argv) { int resume_frame = 200; string extension_type = ".jpg"; - cout << "Hello Dandere!!" << endl; + cout << "Hello Dandere2!!" << endl; //load arguments if (!debug) {