我已经做了这个功能来计算CIE Lab颜色空间的颜色差异,但它缺乏速度.既然我不是一个

Java专家,我想知道有没有一些技巧可以在这里提高速度呢?

代码基于注释块中提到的matlab函数.

/**

* Compute the CIEDE2000 color-difference between the sample color with

* CIELab coordinates 'sample' and a standard color with CIELab coordinates

* 'std'

*

* Based on the article:

* "The CIEDE2000 Color-Difference Formula: Implementation Notes,

* Supplementary Test Data, and Mathematical Observations,", G. Sharma,

* W. Wu, E. N. Dalal, submitted to Color Research and Application,

* January 2004.

* available at http://www.ece.rochester.edu/~gsharma/ciede2000/

*/

public static double deltaE2000(double[] lab1, double[] lab2)

{

double L1 = lab1[0];

double a1 = lab1[1];

double b1 = lab1[2];

double L2 = lab2[0];

double a2 = lab2[1];

double b2 = lab2[2];

// Cab = sqrt(a^2 + b^2)

double Cab1 = Math.sqrt(a1 * a1 + b1 * b1);

double Cab2 = Math.sqrt(a2 * a2 + b2 * b2);

// CabAvg = (Cab1 + Cab2) / 2

double CabAvg = (Cab1 + Cab2) / 2;

// G = 1 + (1 - sqrt((CabAvg^7) / (CabAvg^7 + 25^7))) / 2

double CabAvg7 = Math.pow(CabAvg, 7);

double G = 1 + (1 - Math.sqrt(CabAvg7 / (CabAvg7 + 6103515625.0))) / 2;

// ap = G * a

double ap1 = G * a1;

double ap2 = G * a2;

// Cp = sqrt(ap^2 + b^2)

double Cp1 = Math.sqrt(ap1 * ap1 + b1 * b1);

double Cp2 = Math.sqrt(ap2 * ap2 + b2 * b2);

// CpProd = (Cp1 * Cp2)

double CpProd = Cp1 * Cp2;

// hp1 = atan2(b1, ap1)

double hp1 = Math.atan2(b1, ap1);

// ensure hue is between 0 and 2pi

if (hp1 < 0) {

// hp1 = hp1 + 2pi

hp1 += 6.283185307179586476925286766559;

}

// hp2 = atan2(b2, ap2)

double hp2 = Math.atan2(b2, ap2);

// ensure hue is between 0 and 2pi

if (hp2 < 0) {

// hp2 = hp2 + 2pi

hp2 += 6.283185307179586476925286766559;

}

// dL = L2 - L1

double dL = L2 - L1;

// dC = Cp2 - Cp1

double dC = Cp2 - Cp1;

// computation of hue difference

double dhp = 0.0;

// set hue difference to zero if the product of chromas is zero

if (CpProd != 0) {

// dhp = hp2 - hp1

dhp = hp2 - hp1;

if (dhp > Math.PI) {

// dhp = dhp - 2pi

dhp -= 6.283185307179586476925286766559;

} else if (dhp < -Math.PI) {

// dhp = dhp + 2pi

dhp += 6.283185307179586476925286766559;

}

}

// dH = 2 * sqrt(CpProd) * sin(dhp / 2)

double dH = 2 * Math.sqrt(CpProd) * Math.sin(dhp / 2);

// weighting functions

// Lp = (L1 + L2) / 2 - 50

double Lp = (L1 + L2) / 2 - 50;

// Cp = (Cp1 + Cp2) / 2

double Cp = (Cp1 + Cp2) / 2;

// average hue computation

// hp = (hp1 + hp2) / 2

double hp = (hp1 + hp2) / 2;

// identify positions for which abs hue diff exceeds 180 degrees

if (Math.abs(hp1 - hp2) > Math.PI) {

// hp = hp - pi

hp -= Math.PI;

}

// ensure hue is between 0 and 2pi

if (hp < 0) {

// hp = hp + 2pi

hp += 6.283185307179586476925286766559;

}

// LpSqr = Lp^2

double LpSqr = Lp * Lp;

// Sl = 1 + 0.015 * LpSqr / sqrt(20 + LpSqr)

double Sl = 1 + 0.015 * LpSqr / Math.sqrt(20 + LpSqr);

// Sc = 1 + 0.045 * Cp

double Sc = 1 + 0.045 * Cp;

// T = 1 - 0.17 * cos(hp - pi / 6) +

// + 0.24 * cos(2 * hp) +

// + 0.32 * cos(3 * hp + pi / 30) -

// - 0.20 * cos(4 * hp - 63 * pi / 180)

double hphp = hp + hp;

double T = 1 - 0.17 * Math.cos(hp - 0.52359877559829887307710723054658)

+ 0.24 * Math.cos(hphp)

+ 0.32 * Math.cos(hphp + hp + 0.10471975511965977461542144610932)

- 0.20 * Math.cos(hphp + hphp - 1.0995574287564276334619251841478);

// Sh = 1 + 0.015 * Cp * T

double Sh = 1 + 0.015 * Cp * T;

// deltaThetaRad = (pi / 3) * e^-(36 / (5 * pi) * hp - 11)^2

double powerBase = hp - 4.799655442984406;

double deltaThetaRad = 1.0471975511965977461542144610932 * Math.exp(-5.25249016001879 * powerBase * powerBase);

// Rc = 2 * sqrt((Cp^7) / (Cp^7 + 25^7))

double Cp7 = Math.pow(Cp, 7);

double Rc = 2 * Math.sqrt(Cp7 / (Cp7 + 6103515625.0));

// RT = -sin(delthetarad) * Rc

double RT = -Math.sin(deltaThetaRad) * Rc;

// de00 = sqrt((dL / Sl)^2 + (dC / Sc)^2 + (dH / Sh)^2 + RT * (dC / Sc) * (dH / Sh))

double dLSl = dL / Sl;

double dCSc = dC / Sc;

double dHSh = dH / Sh;

return Math.sqrt(dLSl * dLSl + dCSc * dCSc + dHSh * dHSh + RT * dCSc * dHSh);

}

java图片色差_java – 如何进一步优化这个色差函数?相关推荐

  1. java split()方法_Java编程性能优化一些事儿

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Smile and stop complaining about the t ...

  2. java 图片水印_JAVA实现图片水印

    一.JAVA图片水印实现原理 1.1.JAVA图片水印实现思路 1.创建缓存图片对象. 2.创建Java绘图工具对象. 3.使用绘图工具对象将原图绘制到缓存图片对象. 4.使用绘图工具将水印(文字/图 ...

  3. java 图片 缩略图_java 图片缩略图的两种方法

    最近网上看到两种不同的java图片缩略图的绘制方案 第一种,使用Graphics().drawImage按照一定的比例重新绘制图像. package com.image.suoluetu; impor ...

  4. java 锁升级_Java并发 锁优化和锁升级

    前言 本篇文章介绍Java Synchronized锁优化. 锁是存在哪里的,怎么标识是什么锁 Monitor机制在Java中怎么表现的 锁优化 锁升级 1. 锁存在哪里 对象在内存中的布局分为三块区 ...

  5. java图片拷贝_java图片拷贝

    请选择上传的图片或文件: 可以看到,我们将...之后,我们就来编写这个 servlet--UpLoad.java 复制代码 代码如下: package load; import java.io.Fil ...

  6. java图片马赛克_java实现图片缩放、旋转和马赛克化

    本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化. 不多说,上代码: package deal; import java.awt.Color; import jav ...

  7. java 图片 滤镜_Java实现图片滤镜的高级玩法

    cv4j是一个图像处理库 具体介绍,可以参考上一篇文章java实现图片的滤镜效果 目前,cv4j 已经支持了十几种滤镜的效果,并优化了之前的算法,除此之外我们还使用了 Rxjava2 来封装滤镜的操作 ...

  8. java图片序列化_Java中的强大武器——对象的序列化

    原标题:Java中的强大武器--对象的序列化 所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象, ...

  9. java 图片动画_java在窗口中添加图片做动画,怎么一闪一闪的?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 视频来自:优酷 在java中添加图片做动画效果,怎么一闪一闪的运动啊?怎样才能让它不闪的连续运动呢? 下面是代码,代码项目project里有两个类,一个是 ...

最新文章

  1. aws fargate_我如何在AWS Fargate上部署#100DaysOfCloud Twitter Bot
  2. getconnectiontimeoutexception 网络问题排查_通俗解析居家宽带网络问题:光猫设备排查教程篇...
  3. OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换
  4. μCUnit,微控制器的单元测试框架
  5. Visual Studio 2005 中的 命令窗口
  6. 【Tools】Win10系统搭建匿名FTP服务器详解
  7. Python学习---入门导学篇
  8. 防爆技术在工业电子秤中的最新应用(转)
  9. C语言递归函数 计算学生年龄
  10. 《信任的速度》读后感
  11. [论文笔记] Sigcomm 2018 Elastic Sketch: Adaptive and Fast Network-wide Measurements
  12. 速率bps(kbps、Mbps)和每秒字节传输B/s(KB/s、MB/s)的关系如下
  13. CSS中的filter与backdrop-filter属性的异同点
  14. python人物抠图算法_Python实现AI自动抠图实例解析
  15. C/java 实现爱心
  16. 【建议搜藏】Spring+SpringMVC+MyBatis简易版Boss直聘系统
  17. ODB++数据解析三
  18. Arduino成长日记6 - 中断机制
  19. windows10如何安装hyper-v
  20. Jackson常用配置示例

热门文章

  1. Win10命令窗口的SSH和SFTP操作
  2. linux find查找文件并删除文件,Linux find 查找 并删除文件 杀掉进程
  3. JavaScript 调用 C++/Qt 工程(附有代码 + demo)
  4. iis服务器响应上限,IIS6 ASP 页的执行造成响应缓冲区超过其配置限制的解决方法...
  5. java的断言_java断言assert初步使用:断言开启、断言使用
  6. ue怎么打开服务器隐藏文件,隐藏/显示选区命令 - UltraEdit 中文帮助文档
  7. win10 关闭 “打开文件 - 安全警告”
  8. 几种相册图片布局方式
  9. 微信小程序入门教程 --(保姆级)
  10. 安装并运行apk时出现恼人的Error: Activity class {xxx/xxx.MainActivity} does not exist.