Delta E 2000 прецизионная точность

Я реализовал алгоритм Delta CIE 2000 на Python. Причина, по которой я не использую фреймворк или внешнюю библиотеку, заключается в том, что мне нужно использовать свой код позже для других целей. Я реализовал алгоритм по математическим формулам, описанным в Википедии. Он работает нормально, но я обнаружил, что выходное значение не соответствует выходному значениюdelta_e_cie_2000() реализация в библиотеке colormath.

Во-первых, вот мой код:

# Input colors should be in lab
def DE2000(color1, color2):
    dLp = float(color2[0] - color1[0])
    L_ = float((color1[0] + color2[0]) * 0.5)

    C1 =float( math.sqrt(color1[1] ** 2 + color1[2] ** 2))
    C2 =float( math.sqrt(color2[1] ** 2 + color2[2] ** 2))

    C_ = (C1 + C2) * 0.5

    a1p = color1[1] + (color1[1] * 0.5) * (1 - math.sqrt((C_ ** 7) / (C_ ** 7 + 25 ** 7)))
    a2p = color2[1] + (color2[1] * 0.5) * (1 - math.sqrt((C_ ** 7) / (C_ ** 7 + 25 ** 7)))

    C1p = math.sqrt(a1p ** 2 + color1[2] ** 2)
    C2p = math.sqrt(a2p ** 2 + color2[2] ** 2)

    Cbarp = (C1p + C2p) * 0.5
    dCp = C2p - C1p

    h1p = math.atan2(color1[2], a1p) % 360
    h2p = math.atan2(color2[2], a2p) % 360

    print("h1p:", h1p)
    print("h2p:", h2p)
    print("abs(h1p - h2p):", abs(h1p - h2p))

    if abs(h1p - h2p) <= 180:
        dhp = h2p - h1p
    elif abs(h1p - h2p) > 180 and h2p <= h1p:
        dhp = h2p - h1p + 360
    elif abs(h1p - h2p) > 180 and h2p > h1p:
        dhp = h2p - h1p - 360
    else:
        dhp = 0

    dHp = 2 * math.sqrt(C1p * C2p) * math.sin(dhp * 0.5)
    if abs(h1p - h2p) <= 180:
        Hbarp = (h1p + h2p) * 0.5
    elif abs(h1p - h2p) > 180 and h1p + h2p < 360:
        Hbarp = (h1p + h2p + 360) * 0.5
    elif abs(h1p - h2p) > 180 and h1p + h2p >= 360:
        Hbarp = (h1p + h2p - 360) * 0.5
    elif C1p == 0 or C2p == 0:
        Hbarp = (h1p + h2p)

    T = 1 - (0.17 * math.cos(Hbarp - 30) +
             0.24 * math.cos(2 * Hbarp) +
             0.32 * math.cos(3 * Hbarp + 6) -
             0.20 * math.cos(4 * Hbarp - 63))

    SL = 1 + (
            (0.015 * (L_ - 50) ** 2)
            / (math.sqrt(20 + ((L_ - 50) ** 2)))
    )
    SC = 1 + 0.045 * Cbarp
    SH = 1 + 0.015 * Cbarp * T

    Rt = -2 * math.sqrt((Cbarp ** 7) / (Cbarp ** 7 + 25 ** 7)) * math.sin(60 * math.exp(-((Hbarp - 275) / 25) ** 2))
    kl = 1
    kc = 1
    kh = 1

    dE2000 = math.sqrt(
        (dLp / (kl * SL)) ** 2
        + (dCp / (kc * SC)) ** 2
        + (dHp / (kh * SH)) ** 2
        + Rt * (dCp / (kc * SC)) * (dHp / (kh * SH))
    )

    return dE2000

А вот сравнение значений:

#LabColor (lab_l:60.2728 lab_a:29.1236 lab_b:12.3039) 
#LabColor (lab_l:62.6060 lab_a:40.7402 lab_b:-27.0242)
My code: 20.742092752610183
Colormath code: 21.159017320676828

То же самое происходит и с другими лабораторными значениями. В качестве проверки работоспособности я также использовал веб-сайт, который вычисляет значение delta e cie 2000 ( это веб-сайт), и оно ближе к значению colormath (21,159127), чем мое. Что я делаю неправильно? Дело в десятичной точности? Если да, то как мне сделать его более точным?

0 ответов

Другие вопросы по тегам