X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=colorspace_conversion_effect.cpp;h=0e2425593acfe18da75824b56beb2748672c5c27;hp=baced38fb9b6c03e6d1ca94d4b0a38a36d3c2d34;hb=b5a446a44ee1f0379e8427f86f5dfa0d40bc0e60;hpb=57061265db1842d85c96bc678297d13b30661ab8 diff --git a/colorspace_conversion_effect.cpp b/colorspace_conversion_effect.cpp index baced38..0e24255 100644 --- a/colorspace_conversion_effect.cpp +++ b/colorspace_conversion_effect.cpp @@ -1,10 +1,10 @@ #include - +#include #include #include "colorspace_conversion_effect.h" -#include "util.h" #include "d65.h" +#include "util.h" using namespace Eigen; @@ -57,14 +57,6 @@ Matrix3d get_xyz_matrix(Colorspace space) double z_G = 1.0 - x_G - y_G; double z_B = 1.0 - x_B - y_B; - // Find the XYZ coordinates of D65 (white point for both Rec. 601 and 709), - // normalized so that Y=1. - Vector3d d65_XYZ( - d65_x / d65_y, - 1.0, - d65_z / d65_y - ); - // We have, for each primary (example is with red): // // X_R / (X_R + Y_R + Z_R) = x_R @@ -73,8 +65,8 @@ Matrix3d get_xyz_matrix(Colorspace space) // // Some algebraic fiddling yields (unsurprisingly): // - // X_R = (x_R / y_R) Y_R - // Z_R = (z_R / y_R) Y_R + // X_R = (x_R / y_R) Y_R (so define k1 = x_R / y_R) + // Z_R = (z_R / y_R) Y_R (so define k4 = z_R / y_R) // // We also know that since RGB=(1,1,1) should give us the // D65 illuminant, we must have @@ -83,8 +75,8 @@ Matrix3d get_xyz_matrix(Colorspace space) // Y_R + Y_G + Y_B = D65_Y // Z_R + Z_G + Z_B = D65_Z // - // But since we already know how to express Y and Z by - // some constant multiple of X, this reduces to + // But since we already know how to express X and Z by + // some constant multiple of Y, this reduces to // // k1 Y_R + k2 Y_G + k3 Y_B = D65_X // Y_R + Y_G + Y_B = D65_Y @@ -105,6 +97,7 @@ Matrix3d get_xyz_matrix(Colorspace space) temp(2,1) = z_G / y_G; temp(2,2) = z_B / y_B; + Vector3d d65_XYZ(d65_X, d65_Y, d65_Z); Vector3d Y_RGB = temp.inverse() * d65_XYZ; // Now convert xyY -> XYZ.