色温(Kelvin)RGB的转换:算法和样例

据我所知,还不太可能找到从色温到RGB转换的一个可靠的公式。虽然,有很多算法实现了类似的功能,但是,大多是都是从色温转换到XYZ颜色空间。这之后你再可以根据需要从XYZ空间在转换到RGB颜色空间。这种算法的一种实现方式你可以在这找到。

很不幸的是,这种方式并不是真正意义上的数学公式,只是一种美化的查找表实现方式。在某些情况下,这是一种可靠地实现方式。但是,当涉及到XYZ->RGB转换的时候,对简单的实时色温调整而言,这种方式太慢了。

因此,我实现了一套色温到RGB转换的算法。这个算法转换相当不错。以下是我的一些思路。

使用这种算法的一些限制:

  1. 我的算法是一种高精度的估算。但是,对科学研究而言精度还是不够。这种算法主要是用在照片的一些处理,所以,不要尝试在天文学和医学图像处理领域使用这种算法。
  2. 由于算法相对简单,这种算法在处理合适大小的图像时,实时性已经足够快速。但是,为了获取更好的实时性能,你必须对你所使用的编程语言实现这种算法再做些优化。
  3. 这个算法只适用于1000K到40000K的色温转换。对摄影学来说,这么大的光谱范围已经足够了。当色温超过这个范围使用时,精度将会降低。

算法实现:样例输出

下图是算法输出1000K到40000K的图像。

下图是摄影学感兴趣的色温范围:从1500K到15000K

算法实现思路

我的第一步工作是从Charity’s original blackbody values 逆向工程方式实现一个可靠的公式。

Charity’s original blackbody values 的数据用图表的形式表示为:

从图表可以看出,有一些上限值和下限值,使得我们的算法很容易实现。特别的:

  1. 红色分量在6600K以下的时候总保持255
  2. 蓝色分量在2000K的时候总保持0
  3. 蓝色问了在6500K以上总保持255

为了更好地拟合这些数据,绿色分量被划分为两部分进行拟合。一部分是低于6600K;另一部分是高于6600K。

之后,我把数据分成独立的颜色分量进行拟合。(不包括那些总是为0和255的数据)。理想状态下,有一条曲线将经过每一个数据点。但现实情况,往往没这么理想。因为对于上图中X轴和Y轴的数据而言,它们的数值相差太大。X轴的数值都大于1000,对于Y轴而言,其数值范围在0到255之间。我们必须对X轴的数据做相应的转换才能更好的进行曲线拟合。为了达到最优拟合的目的,我对X轴的数据做了除100处理,并进行了相应的偏移。以下是每个分量的数据分布和最优的拟合曲线:

如上图所述,其曲线拟合的很好。

算法实现

以下是算法实现的伪代码:

输入:1000K到40000K的色温;色温和颜色分量的变量必须是双精度Set Temperature = Temperature \ 100Calculate Red:If Temperature <= 66 ThenRed = 255ElseRed = Temperature - 60Red = 329.698727446 * (Red ^ -0.1332047592)If Red < 0 Then Red = 0If Red > 255 Then Red = 255End IfCalculate Green:If Temperature <= 66 ThenGreen = TemperatureGreen = 99.4708025861 * Ln(Green) - 161.1195681661If Green < 0 Then Green = 0If Green > 255 Then Green = 255ElseGreen = Temperature - 60Green = 288.1221695283 * (Green ^ -0.0755148492)If Green < 0 Then Green = 0If Green > 255 Then Green = 255End IfCalculate Blue:If Temperature >= 66 ThenBlue = 255ElseIf Temperature <= 19 ThenBlue = 0ElseBlue = Temperature - 10Blue = 138.5177312231 * Ln(Blue) - 305.0447927307If Blue < 0 Then Blue = 0If Blue > 255 Then Blue = 255End IfEnd If

上述伪代码中,Ln()表示的是自然对数。

以下是VB的代码实现。以下代码未做优化,但是代码简短可读性好。

Static tmpCalc As Double'Temperature must fall between 1000 and 40000 degreesIf tmpKelvin < 1000 Then tmpKelvin = 1000If tmpKelvin > 40000 Then tmpKelvin = 40000'All calculations require tmpKelvin \ 100, so only do the conversion oncetmpKelvin = tmpKelvin \ 100'Calculate each color in turn'First: redIf tmpKelvin <= 66 Thenr = 255Else'Note: the R-squared value for this approximation is .988tmpCalc = tmpKelvin - 60tmpCalc = 329.698727446 * (tmpCalc ^ -0.1332047592)r = tmpCalcIf r < 0 Then r = 0If r > 255 Then r = 255End If'Second: greenIf tmpKelvin <= 66 Then'Note: the R-squared value for this approximation is .996tmpCalc = tmpKelvintmpCalc = 99.4708025861 * Log(tmpCalc) - 161.1195681661g = tmpCalcIf g < 0 Then g = 0If g > 255 Then g = 255Else'Note: the R-squared value for this approximation is .987tmpCalc = tmpKelvin - 60tmpCalc = 288.1221695283 * (tmpCalc ^ -0.0755148492)g = tmpCalcIf g < 0 Then g = 0If g > 255 Then g = 255End If'Third: blueIf tmpKelvin >= 66 Thenb = 255ElseIf tmpKelvin <= 19 Thenb = 0Else'Note: the R-squared value for this approximation is .998tmpCalc = tmpKelvin - 10tmpCalc = 138.5177312231 * Log(tmpCalc) - 305.0447927307b = tmpCalcIf b < 0 Then b = 0If b > 255 Then b = 255End IfEnd Sub

算法效果:

下图是色温调整算法实现的效果图。左侧是原始图像,有测试经过上述色温调整算法后的图像。

实际在工具中实现的效果如下图所示:

有选择的翻译至:http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/

色温(Kelvin)到RGB的转换:算法和样例相关推荐

  1. 数据挖掘-序列模式挖掘-prefixspan算法(样例)

    数据挖掘-序列模式挖掘-prefixspan算法(样例) ' 所有结果: 通俗来讲:可以以1-频繁项d为例,我们的思路讲解的很明白:这儿我们一般化我们的求解过程: 1)第一次扫描原始数据库,得到长度为 ...

  2. mupdf中CMYK与RGB的转换算法

    之前碰到过RGB与CMYK之间转换的问题,网上也没有比较官方的转换公式,不同的软件可能会采用不同的算法,现在mupdf,正好也看到了这样的算法,还是有一定参考价值的,具体算法如下: #define M ...

  3. 【机器学习】集成算法使用样例

    # -*- coding: utf-8 -*- """集成算法.ipynbAutomatically generated by Colaboratory.Original ...

  4. java rgb hsl_java的RGB转HSL算法

    import org.eclipse.swt.graphics.RGB; /** * 颜色转换算法 * */ public class ColorTools { public static HSL R ...

  5. YUV / RGB 格式及快速转换算法

    1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确 ...

  6. 【DSP开发】【VS开发】YUV与RGB格式转换

    [视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...

  7. C语言运行时变成灰色,C语言实现RGB图像转换成灰(Gray)度图像

    以前实现RGB图像转换成灰度图像都是直接调用OpenCV的库函数RGB2GRAY(IplImage* src);最近老板让我们除了读入输出图像实时用OpenCV的函数,其余的最好都是自己写,所以我自己 ...

  8. rgb 光谱 转换_使用深度学习将RGB图像转换为高光谱

    rgb 光谱 转换 Finding an applicable cost-effective way to convert and use hyperspectral images. 寻找一种适用的具 ...

  9. RGB图像转换成HSV图像,HSV图像转换为RGB图像

    HSV 即使用 色相(Hue).饱和度(Saturation).明度(Value) 来表示色彩的一种方式 色相:将颜色用0°到360°表示,就是我们日常讲的颜色名称,如红色.蓝色等. 色相与颜色对应关 ...

最新文章

  1. 谷歌BERT预训练源码解析(二):模型构建
  2. 如何选择汽车LiDAR的激光器和光电探测器
  3. 吴恩达机器学习作业(4):正则化逻辑回归
  4. Java面向对象编程篇2——面向对象三大特点
  5. 《Python编程从入门到实践》记录之读取文件
  6. An efficient and robust line segment matching approach based on LBD descriptor and pairwise geometri
  7. 图解 hexo + github 从零快速 搭建个人博客 windowss
  8. 蓝桥杯 ADV-9 算法提高 递归倒置字符数组
  9. Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083
  10. .net知识系列之五:(基本控件和数据绑定控件)
  11. 高精度地图发展与北斗车载动态视频采集应用
  12. 学计算机要具备什么能力,具备什么特质能学计算机
  13. MATLAB 图像嵌入水印图像程序
  14. Android 实现openGL录像添加静态图片水印
  15. 单元测试利器——手把手教你使用Mockito
  16. C/C++内存泄漏和野指针的区别
  17. mysql 创建外键语句_sql创建外键语句
  18. 退出mysql命令_进入mysql命令行之后,怎么退出
  19. STC8单片机三相SPWM程序
  20. AlertManager实现Email告警(使用Postman测试)

热门文章

  1. 关于 Python PyQt5 界面运行时提示无法初始化Qt平台的解决方案
  2. ​危机——疫情是“危”,5G是“机”
  3. OV代码签名和EV代码签名证书区别
  4. mysql 分钟转小时_将分钟转化为**小时**分钟,,将秒转化为**天**小时**分钟**秒...
  5. 一种h5前端和服务端通信的安全方案
  6. vue利用事件委托实现按钮互斥,并传递对应的值
  7. 第五次作业-需求原型改进
  8. linux系统中不存在 基本文件类型,Linux系统中不存在以下哪个基本文件类型( )
  9. 移动终端及常见的操作系统
  10. 项目经理如何写年终总结,范文+PPT模板