DelteE2000计算,C代码实现

CIEDE2000色差公式主要对CIE94公式做了如下几项修正:

重新标定近中性区域的a*轴,以改善中性色的预测性能;
将CIE94公式中的明度权重函数修改为近似V形函数;
在色相权重函数中考虑了色相角,以体现色相容限随颜色的色相而变化的事实;
包含了与BFD和Leeds色差公式中类似的椭圆选择选项,以反映在蓝色区域的色差容限椭圆不指向中心点的现象;
CIEDE2000色差公式如下:
ded5bd121086488e843dd18eed97e750.png

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define M_PI (3.14159265) 

//彩度计算
    static double CaiDu(double a, double b)
    {
        double Cab = 0;
        Cab = pow(a * a + b * b, 0.5);
        return Cab;
    }
    //色调角计算
    static double SeDiaoJiao(double a, double b)
    {
        double h = 0;
        double hab = 0;

        h = (180 / M_PI) * atan(b / a);           //有正有负

        if (a > 0 && b > 0)
        {
            hab = h;
        }
        else if (a < 0 && b>0)
        {
            hab = 180 + h;
        }
        else if (a < 0 && b < 0)
        {
            hab = 180 + h;
        }
        else     //a>0&&b<0
        {
            hab = 360 + h;
        }
        return hab;
    }

   double DeltaE2000(double Lab1[3], double Lab2[3])
    {
        double E00 = 0;               //CIEDE2000色差E00
        double LL1, LL2, aa1, aa2, bb1, bb2; //声明L' a' b' (1,2)
        double delta_LL, delta_CC, delta_hh, delta_HH;        // 第二部的四个量
        double kL, kC, kH;
        double RT = 0;                //旋转函数RT
        double G = 0;                  //G表示CIELab 颜色空间a轴的调整因子,是彩度的函数.
        double mean_Cab = 0;    //两个样品彩度的算术平均值
        double SL, SC, SH, T;
        double L1 = Lab1[0];
        double a1 = Lab1[1];
        double b1 = Lab1[2];
        double L2 = Lab2[0];
        double a2 = Lab2[1];
        double b2 = Lab2[2];
        //------------------------------------------
        kL = 1;
        kC = 1;
        kH = 1;
        //------------------------------------------
        mean_Cab = (CaiDu(a1, b1) + CaiDu(a2, b2)) / 2;
        double mean_Cab_pow7 = pow(mean_Cab, 7);       //两彩度平均值的7次方
        G = 0.5*(1 - pow(mean_Cab_pow7 / (mean_Cab_pow7 + pow(25, 7)), 0.5));

        LL1 = L1;
        aa1 = a1 * (1 + G);
        bb1 = b1;

        LL2 = L2;
        aa2 = a2 * (1 + G);
        bb2 = b2;

        double CC1, CC2;               //两样本的彩度值
        CC1 = CaiDu(aa1, bb1);
        CC2 = CaiDu(aa2, bb2);
        double hh1, hh2;                  //两样本的色调角
        hh1 = SeDiaoJiao(aa1, bb1);
        hh2 = SeDiaoJiao(aa2, bb2);

        delta_LL = LL1 - LL2;
        delta_CC = CC1 - CC2;
        delta_hh = SeDiaoJiao(aa1, bb1) - SeDiaoJiao(aa2, bb2);
        delta_HH = 2 * sin(M_PI*delta_hh / 360) * pow(CC1 * CC2, 0.5);

        //-------第三步--------------
        //计算公式中的加权函数SL,SC,SH,T
        double mean_LL = (LL1 + LL2) / 2;
        double mean_CC = (CC1 + CC2) / 2;
        double mean_hh = (hh1 + hh2) / 2;

        SL = 1 + 0.015 * pow(mean_LL - 50, 2) / pow(20 + pow(mean_LL - 50, 2), 0.5);
        SC = 1 + 0.045 * mean_CC;
        T = 1 - 0.17 * cos((mean_hh - 30) * M_PI / 180) + 0.24 * cos((2 * mean_hh) * M_PI / 180)
            + 0.32 * cos((3 * mean_hh + 6) * M_PI / 180) - 0.2 * cos((4 * mean_hh - 63) * M_PI / 180);
        SH = 1 + 0.015 * mean_CC * T;

        //------第四步--------
        //计算公式中的RT
        double mean_CC_pow7 = pow(mean_CC, 7);
        double RC = 2 * pow(mean_CC_pow7 / (mean_CC_pow7 + pow(25, 7)), 0.5);
        double delta_xita = 30 * exp(-pow((mean_hh - 275) / 25, 2));        //△θ 以°为单位
        RT = -sin((2 * delta_xita) * M_PI / 180) * RC;

        double L_item, C_item, H_item;
        L_item = delta_LL / (kL * SL);
        C_item = delta_CC / (kC * SC);
        H_item = delta_HH / (kH * SH);

        E00 = pow(L_item * L_item + C_item * C_item + H_item * H_item + RT * C_item * H_item, 0.5);        return E00;
    }
  


int main()
{
    double lab1[3] = {10, 20, 30};
    double lab2[3] = {10, 30, 20};
    double e00 = DeltaE2000(lab1, lab2);
    printf("e2000=%f", e00);
    return 0;
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!关于CIEDE2000色差计算,您可以在MATLAB中使用以下代码: ```matlab function dE = ciede2000(Lab1, Lab2) % CIEDE2000色差计算 % 输入参数:Lab1 - 参考颜色的Lab值(1x3矩阵) % Lab2 - 待比较颜色的Lab值(1x3矩阵) % 输出参数:dE - CIEDE2000色差值 % CIEDE2000的参数 kL = 1; kC = 1; kH = 1; L1 = Lab1(1); a1 = Lab1(2); b1 = Lab1(3); L2 = Lab2(1); a2 = Lab2(2); b2 = Lab2(3); mean_L = (L1 + L2) / 2; C1 = sqrt(a1^2 + b1^2); C2 = sqrt(a2^2 + b2^2); mean_C = (C1 + C2) / 2; G = 0.5 * (1 - sqrt(mean_C^7 / (mean_C^7 + 25^7))); a1p = (1 + G) * a1; a2p = (1 + G) * a2; C1p = sqrt(a1p^2 + b1^2); C2p = sqrt(a2p^2 + b2^2); h1p = atan2(b1, a1p); h1p = mod(h1p, 2*pi); h2p = atan2(b2, a2p); h2p = mod(h2p, 2*pi); Delta_Lp = L2 - L1; Delta_Cp = C2p - C1p; h_bar = abs(h1p - h2p); h_bar = min(h_bar, 2*pi - h_bar); Delta_hp = 2 * sqrt(C1p * C2p) * sin(h_bar / 2); mean_hp = (h1p + h2p) / 2; T = 1 - 0.17 * cos(mean_hp - pi/6) + 0.24 * cos(2 * mean_hp) + 0.32 * cos(3 * mean_hp + pi/30) - 0.20 * cos(4 * mean_hp - 63*pi/180); delta_theta = pi / 6 * exp(-((180/pi * mean_hp - 275)/25)^2); R_C = 2 * sqrt(mean_C^7 / (mean_C^7 + 25^7)); S_L = 1 + (0.015 * (mean_L - 50)^2) / sqrt(20 + (mean_L - 50)^2); S_C = 1 + 0.045 * mean_Cp; S_H = 1 + 0.015 * mean_Cp * T; R_T = -sin(2 * delta_theta) * R_C; dE = sqrt((Delta_Lp / (kL * S_L))^2 + (Delta_Cp / (kC * S_C))^2 + (Delta_hp / (kH * S_H))^2 + R_T * (Delta_Cp / (kC * S_C)) * (Delta_hp / (kH * S_H))); end ``` 您可以通过调用 `ciede2000` 函数,传入两个颜色的Lab值来计算它们之间的CIEDE2000色差。例如: ```matlab Lab1 = [50, 30, 20]; Lab2 = [60, 40, 30]; dE = ciede2000(Lab1, Lab2); disp(dE); ``` 希望能对您有所帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值