math - CIELab 到 CIELCh(ab) 的转换没有产生正确的结果
问题描述
我很难用我的计算器手动将 CIELab 转换为 CIELCh。
根据http://www.easyrgb.com/en/math.php,以下是通过从弧度到度数从 CIELab 到 CIELCh 的中性语言编程代码:
var_H = arc_tangent( CIE-b*, CIE-a* ) //Quadrant by signs
if ( var_H > 0 ) var_H = ( var_H / PI ) * 180
else var_H = 360 - ( abs( var_H ) / PI ) * 180
CIE-L* = CIE-L*
CIE-C* = sqrt( CIE-a* ^ 2 + CIE-b* ^ 2 )
CIE-H° = var_H
在这个网站上,它给出了相同的代码,但假设一切都已经在度数:http ://www.brucelindbloom.com/index.html?Equations.html
尝试通过我的物理手持计算器将 CIELAB 代码(37.80、-21.59、38.17)转换为 CIELch 时,我得到了值(38、43.851、299.49)。
但是,正确的值是 (38, 43.851, 119.499)。
这意味着前两部分一切都很好,但最后一部分是不正确的。
我不明白他们是如何得到 119 而不是 299。我相信数学上可能有错误。以下是我如何通过计算器检索 299:
我取了 (38.17/-21.59) 的反正切。我检索到 -1.056 弧度的值。根据代码,如果var_H < 0,那么你需要这样做:
var_H = 360 - ( abs( var_H ) / PI ) * 180
所以我做了 360 - (1.056/3.14)*180。
这给出了 299。
那么我在这里做错了什么?我如何获得119的价值???
解决方案
我联系了 EasyRGB 网站的支持,他们非常棒地解释了该怎么做!这是代表所说的:
您需要在反正切计算中考虑“象限”。这是一个从 CIE-Lab 计算 H° 值的示例,请牢记象限信息:
FUNCTION GS_CIE2Hue( a, b )
LOCAL xBias
if a >= 0 .AND. b == 0 ; return 0 ; endif
if a < 0 .AND. b == 0 ; return 180 ; endif
if a == 0 .AND. b > 0 ; return 90 ; endif
if a == 0 .AND. b < 0 ; return 270 ; endif
if a > 0 .AND. b > 0 ; xBias := 0 ; endif
if a < 0 ; xBias := 180 ; endif
if a > 0 .AND. b < 0 ; xBias := 360 ; endif
return rtod( atan( b / a ) ) + xBias
此解决方案的所有功劳归于http://www.easyrgb.com。如果有人试图转换任何颜色,他们绝对应该查看他们的计算器和数学页面:
推荐阅读
- c - 如何为 ARM-Linux (IMX6UL) 编译 BlueZ 应用程序?
- html - 如何限制div内的文本
- angular - Angular 8 HTTP INTERCEPTOR 中断订阅
- python - 使用 GPU PyOpenCL 优化 python 代码的不同方法:内核 GPU/PyOpenCL 中的外部函数
- python - 禁止警告:matplotlib.legend:没有发现带有标签的句柄放在图例中
- javascript - 用于锚文本或标题属性的 JQuery 过滤器
- c++ - Ncurses 和 C++ 字符串连接无法正常工作
- swift - 有没有办法将 UIHostingController 中包含的 SwiftUI 视图移动到导航栏空间中
- java - 如何在 Java 中生成小数大于 0 的随机小数?
- java - 带有 ZK 的 CRUD Spring-Boot?