java图片色差_java – 如何进一步优化这个色差函数?
我已经做了这个功能来计算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 – 如何进一步优化这个色差函数?相关推荐
- java split()方法_Java编程性能优化一些事儿
点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Smile and stop complaining about the t ...
- java 图片水印_JAVA实现图片水印
一.JAVA图片水印实现原理 1.1.JAVA图片水印实现思路 1.创建缓存图片对象. 2.创建Java绘图工具对象. 3.使用绘图工具对象将原图绘制到缓存图片对象. 4.使用绘图工具将水印(文字/图 ...
- java 图片 缩略图_java 图片缩略图的两种方法
最近网上看到两种不同的java图片缩略图的绘制方案 第一种,使用Graphics().drawImage按照一定的比例重新绘制图像. package com.image.suoluetu; impor ...
- java 锁升级_Java并发 锁优化和锁升级
前言 本篇文章介绍Java Synchronized锁优化. 锁是存在哪里的,怎么标识是什么锁 Monitor机制在Java中怎么表现的 锁优化 锁升级 1. 锁存在哪里 对象在内存中的布局分为三块区 ...
- java图片拷贝_java图片拷贝
请选择上传的图片或文件: 可以看到,我们将...之后,我们就来编写这个 servlet--UpLoad.java 复制代码 代码如下: package load; import java.io.Fil ...
- java图片马赛克_java实现图片缩放、旋转和马赛克化
本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化. 不多说,上代码: package deal; import java.awt.Color; import jav ...
- java 图片 滤镜_Java实现图片滤镜的高级玩法
cv4j是一个图像处理库 具体介绍,可以参考上一篇文章java实现图片的滤镜效果 目前,cv4j 已经支持了十几种滤镜的效果,并优化了之前的算法,除此之外我们还使用了 Rxjava2 来封装滤镜的操作 ...
- java图片序列化_Java中的强大武器——对象的序列化
原标题:Java中的强大武器--对象的序列化 所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象, ...
- java 图片动画_java在窗口中添加图片做动画,怎么一闪一闪的?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 视频来自:优酷 在java中添加图片做动画效果,怎么一闪一闪的运动啊?怎样才能让它不闪的连续运动呢? 下面是代码,代码项目project里有两个类,一个是 ...
最新文章
- aws fargate_我如何在AWS Fargate上部署#100DaysOfCloud Twitter Bot
- getconnectiontimeoutexception 网络问题排查_通俗解析居家宽带网络问题:光猫设备排查教程篇...
- OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换
- μCUnit,微控制器的单元测试框架
- Visual Studio 2005 中的 命令窗口
- 【Tools】Win10系统搭建匿名FTP服务器详解
- Python学习---入门导学篇
- 防爆技术在工业电子秤中的最新应用(转)
- C语言递归函数 计算学生年龄
- 《信任的速度》读后感
- [论文笔记] Sigcomm 2018 Elastic Sketch: Adaptive and Fast Network-wide Measurements
- 速率bps(kbps、Mbps)和每秒字节传输B/s(KB/s、MB/s)的关系如下
- CSS中的filter与backdrop-filter属性的异同点
- python人物抠图算法_Python实现AI自动抠图实例解析
- C/java 实现爱心
- 【建议搜藏】Spring+SpringMVC+MyBatis简易版Boss直聘系统
- ODB++数据解析三
- Arduino成长日记6 - 中断机制
- windows10如何安装hyper-v
- Jackson常用配置示例
热门文章
- Win10命令窗口的SSH和SFTP操作
- linux find查找文件并删除文件,Linux find 查找 并删除文件 杀掉进程
- JavaScript 调用 C++/Qt 工程(附有代码 + demo)
- iis服务器响应上限,IIS6 ASP 页的执行造成响应缓冲区超过其配置限制的解决方法...
- java的断言_java断言assert初步使用:断言开启、断言使用
- ue怎么打开服务器隐藏文件,隐藏/显示选区命令 - UltraEdit 中文帮助文档
- win10 关闭 “打开文件 - 安全警告”
- 几种相册图片布局方式
- 微信小程序入门教程 --(保姆级)
- 安装并运行apk时出现恼人的Error: Activity class {xxx/xxx.MainActivity} does not exist.