CIE LAB转CIE LCH颜色转换色相值偏差,求技术排查
CIE LAB转CIE LCH色相值偏差问题排查与修复
问题根源
你的代码存在两个关键错误,直接导致色相(H)值计算偏差:
- 误用
Math.atan():Math.atan()仅接受单个参数(y/x),无法区分角度所在的象限,必须使用Math.atan2(y, x)才能根据a和b的正负正确计算对应象限的角度。 - 角度转换函数逻辑错误:自定义的
to_degrees()没有正确处理atan2()返回的[-π, π]范围弧度到[0, 360]度的转换,导致象限判断失效。
修正后的代码
function LAB_to_LCH(LAB) { const [labL, labA, labB] = LAB; // 使用Math.atan2获取正确象限的弧度值,参数顺序为(y, x)即(labB, labA) let lchH = Math.atan2(labB, labA); // 将弧度转换为0-360范围的角度 lchH = (lchH * 180 / Math.PI + 360) % 360; const lchC = Math.sqrt(Math.pow(labA, 2) + Math.pow(labB, 2)); return [labL, lchC, lchH]; } // 测试案例 const myLab1 = [20, 7, -25]; const myLCH1 = LAB_to_LCH(myLab1); console.log(myLCH1); // 输出: [20, 25.95, 285.64] 与预期一致 const myLab2 = [91, -42, 57]; const myLCH2 = LAB_to_LCH(myLab2); console.log(myLCH2); // 输出: [91, 70.80, 126.38] 与预期一致
关键修正说明
- 替换
Math.atan()为Math.atan2(labB, labA):atan2会根据labA(x轴)和labB(y轴)的正负,返回对应象限的准确弧度值,范围覆盖[-π, π]。 - 简化角度转换逻辑:
(弧度 * 180/π + 360) % 360可以一次性将负弧度转换为正角度,并确保最终结果严格落在[0, 360]区间内,无需复杂的条件判断。
内容的提问来源于stack exchange,提问作者Ghoul Fool
相关产品推荐
相关产品推荐

