不同色域转换

在可调RGB LED灯设计中,我们会遇到部分标准色域颜色无法显示的问题。如下图,标准色域sRGB为黑色三角形,红色三角形为我们实际灯珠参数,在图片可以看到右上方、左下方有一部分颜色超过了我们灯实际能调的颜色,这样会导致颜色校准出错,出现负值。

 通过观察发现,超出一部分的颜色与附近颜色近似,人眼很难分清楚。

通过这一点,我们可以把超出的部分映射到红色三角形边上。

但问题来了,应该怎么映射,是经过超色域点作红色三角形边的垂线,还是其他。

通过测试发现,图形中点为白色,并以这点向四周辐射,所以我们选取sRGB白点(0.3127,0.329),通过这点连接超色域的点,与红色三角形边的交点,即为映射点。

接下来就是两直线方程求解,但结果往往是无穷小数,要知道什么时候需要进位,什么时候舍弃。比如在右上方,算出的数如果是(0.512367,0.423785),我们取四位小数,要保证在红色三角形内,就应该采取舍弃末尾策略,处理后的数据为(0.5123,0.4237)。如在左下方,算出的结果为(0.152342,0.067543),x要采取进位,y要采取舍位,最后处理的数据为(0.1524,0.0675)。

// 超色域映射
  if (y > ((yg - yr) / (xg - xr) * x + yg - (yg - yr) / (xg - xr) * xg))
    {
        x = (yw - yg + (yg - yr) / (xg - xr) * xg - (yw - y) / (xw - x) * xw) / ((yg - yr) / (xg - xr) - (yw - y) / (xw - x));
    }
    if (y > ((yg - yb) / (xg - xb) * x_tmp + yg - (yg - yb) / (xg - xb) * xg))
    {
        x = (yw - yg + (yg - yb) / (xg - xb) * xg - (yw - y) / (xw - x) * xw) / ((yg - yb) / (xg - xb) - (yw - y) / (xw - x));
    }

    if ((y > ((yg - yr) / (xg - xr) * x_tmp + yg - (yg - yr) / (xg - xr) * xg)) || (y > ((yg - yb) / (xg - xb) * x_tmp + yg - (yg - yb) / (xg - xb) * xg)))
    {
        y = (yw - y) / (xw - x) * x + yw - (yw - y) / (xw - x) * xw;
    }

经过测试,发现这个方法非常可靠,颜色显示准确。

我整理了个表格,输入超色域坐标,会计算出对应的映射点,里面提供了两套算法,一套是垂直算法,一套是白点连线交点算法。推荐用白点连线算法。连接如下。

sRGB超色域转换Yxy-单片机文档类资源-CSDN下载在可调RGBLED灯设计中,我们会遇到部分标准色域颜色无法显示的问题。如下图,标准色域sRGB为黑更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/xiaoredred/85826429资料都为原创,编辑不易,多谢支持。

也非常欢迎大家指出错误,一起学习进步。

猜你喜欢

转载自blog.csdn.net/xiaoredred/article/details/125525354