import numpy as np from scipy.optimize import minimize from colour import * from colour.recovery.jakob2019 import error_function from matplotlib import pyplot as plt from gsoc_common import plot_comparison # This test checks if derivatives are calculated correctly by comparing them # to finite differences. if __name__ == "__main__": shape = SpectralShape(360, 830, 1) cmfs = STANDARD_OBSERVER_CMFS["CIE 1931 2 Degree Standard Observer"].align(shape) illuminant = SpectralDistribution(ILLUMINANT_SDS["D65"]).align(shape) illuminant_XYZ = sd_to_XYZ(illuminant) / 100 target = np.array([72., -20., 61.]) # Some arbitrary Lab colour xs = np.linspace(-10, 10, 500) h = xs[1] - xs[0] # Vary one coefficient at a time for c_index in range(3): errors = np.empty(len(xs)) derrors = np.empty(len(xs)) for i, x in enumerate(xs): c = np.array([0.0, 0, 0]) c[c_index] = x error, derror_dc = error_function( c, target, shape, cmfs, illuminant, illuminant_XYZ ) errors[i] = error derrors[i] = derror_dc[c_index] plt.subplot(2, 3, 1 + c_index) plt.xlabel("c%d" % c_index) plt.ylabel("ΔE") plt.plot(xs, errors) plt.subplot(2, 3, 4 + c_index) plt.xlabel("c%d" % c_index) plt.ylabel("dΔE/dc%d" % c_index) plt.plot(xs, derrors, "k-") plt.plot(xs[:-1] + h / 2, np.diff(errors) / h, "r:") plt.show()