DelteE2000计算,C代码实现

news2024/7/6 9:43:19

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;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1302470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot 极简案例

安装idea File -> New Project 选择依赖 创建controller文件 输入controller类名 输入代码 运行项目 访问 localhost:8080/hello/boot package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.…

让你从此不再惧怕ANR

原文链接 让你从此不再惧怕ANR 这篇文章是基于官方的Diagnose and fix ANRs翻译而来&#xff0c;但也不是严格的翻译&#xff0c;原文的内容都在&#xff0c;又加上了自己的理解以及自己的经验&#xff0c;以译注的形式对原文的作一些补充。 当一个Android应用的UI线程被阻塞时…

【Jeecg Boot 3 - 第二天】1.1、后端 docker-compose 部署 JEECGBOOT3

一、场景 二、实战 ▶ 2.1 修改配置文件 &#xff1e; 目的一&#xff1a;将 dev 变更为生产环境 prod &#xff1e; 目的二&#xff1a;方便spring项目调用docker同个network下的redis和mysql ▶ 2.2 编写dockerfile ▶ 2.3 编写docker-compose.yaml ▶ 2.4 打…

老师们居然这样把考试成绩发给家长

教育是一个复杂而多元的过程&#xff0c;其中考试成绩的发布和沟通是教育过程中的一个重要环节。然而&#xff0c;有些老师在发布考试成绩时&#xff0c;采取了一些不恰当的方式&#xff0c;给家长和学生带来了不必要的困扰和压力。本文将探讨老师们不应该采取的发布考试成绩的…

Docker | 自定义网络

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨特色专栏: MySQL学习 🥭本文内容: Docker | 自定义网络 📚个人知识库: 知识库,欢迎大家访问 1.前言 大家好,我是Leo哥…

最小体力消耗路径(广度优先搜索)

最小体力消耗路径 看见这题第一眼-动态规划&#xff0c;再看BFS。 用动态规划做的话不能一次保证当前位置能获得最小的最大值&#xff0c;因为需要周围的四个&#xff08;或者两个&#xff09;元素值。 这里我纯用的BFS&#xff0c;宽度优先搜索。类似于n皇后问题。见代码吧…

Course3-Week1-无监督学习

Course3-Week1-无监督学习 文章目录 Course3-Week1-无监督学习1. 欢迎1.1 Course3简介1.2 数学符号约定 2. K-means算法2.1 K-means算法的步骤2.2 代价函数2.3 选择聚类数量2.4 代码实例-图像压缩 3. 异常检测3.1 异常检测的直观理解3.2 高斯分布3.3 异常检测算法3.4 选取判断阈…

紧固件的标准有哪些

紧固件的行业标准 紧固件是一个涉及几乎所有结构、机械和人们日常使用的产品的稳定性、安全性和结构完整性的广泛话题。紧固件作为一种功能强大、高效的机械设备&#xff0c;其功能和特性的规格多种多样&#xff0c;根本无法低估。由于紧固件是工程和机械的支柱&#xff0c;因此…

如何使用Imagewheel本地搭建一个简单的的私人图床公网可访问?

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

新版Spring Security6.2架构 (三) - Authorization

前言 书接上文&#xff0c;在经过了authentication后就是authorization了&#xff0c;本文还是对官网文档authorization的一个架构翻译和个人理解&#xff0c;后续的博客在写具体使用例子&#xff0c;从数据中认证&#xff0c;融合authentication和authorization的概念。 Aut…

堆的相关时间复杂度计算(C语言)

目录 前言 建堆的时间复杂度 向上调整建堆的时间复杂度 向下调整建堆的时间复杂度 维护堆的时间复杂度 top K问题的时间复杂度 前言 在前面的三篇文章中我们成功的实现了堆排序的升降序以及基于堆的top K问题&#xff0c;现在我们来解决它们的时间复杂度问题 建堆的时间…

【精选】 VulnHub (超详细解题过程)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

前后端请求之nginx配置

问题&#xff1a; 前端发送的请求&#xff0c;是如何请求到后端服务器的&#xff1f; 如&#xff0c;前端请求地址&#xff1a;http://loclhost/api/employee/login&#xff1a; 后端相应请求地址&#xff1a;http://loclhost:8080/admin/employee/login 回答&#xff1a; …

Firmware Analysis Plus (Fap)固件模拟安装教程(最新)

最近在搞IoT的研究&#xff0c;但是难在设备比较难弄&#xff0c;只有固件&#xff0c;而没有设备&#xff0c;买吧&#xff0c;又太费钱&#xff0c;不划算。好在有很多项目可以在模拟环境中运行固件。但是几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同。 …

Idea spring项目中 resource图标错误解决方案

1.resources错误显示示例 2.resources正确显示示例 3.解决方案 第一步&#xff1a; 第二步&#xff1a; 点击完成即可。

Zidebactam sodium salt β-内酰胺酶抑制剂 1706777-46-9科研

Zidebactam sodium salt β-内酰胺酶抑制剂 1706777-46-9 &#xff08;源自星戈瑞&#xff09; ATH686 FLT3 抑制剂 853299-52-2 Pelitrexol 抑制剂 446022-33-9 TBT1 转运蛋白抑制剂 52535-76-9 HFY-4A HDAC 抑制剂 2094810-82-7 SDR-04 BET 抑制剂 879593-54-1 Phthala…

Java项目-瑞吉外卖Day3

填充公共字段&#xff1a; 目的&#xff1a;由于某些属性&#xff0c;例如createdTime这些需要填充的字段会在多个地方出现&#xff0c;所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略&#xff0c;是插入/更新的时候…

国内大厂机器人赛道产品

大疆 大疆无人机自然不必说&#xff0c;除此之外大疆搞机甲大师&#xff0c;教育机器人。 字节 当前字节在机器人领域只是初步探索阶段&#xff0c;目前尚未发布相关产品&#xff08;截止至23.12&#xff09;。 管理层想法&#xff1a; 跟已有业务做结合&#xff0c;服务好…

机器学习之全面了解回归学习器

我们将和大家一起探讨机器学习与数据科学的主题。 本文主要讨论大家针对回归学习器提出的问题。我将概要介绍&#xff0c;然后探讨以下五个问题&#xff1a; 1. 能否将回归学习器用于时序数据&#xff1f; 2. 该如何缩短训练时间&#xff1f; 3. 该如何解释不同模型的结果和…