色温(Kelvin)到RGB的转换:算法和样例
色温(Kelvin)到RGB的转换:算法和样例
据我所知,还不太可能找到从色温到RGB转换的一个可靠的公式。虽然,有很多算法实现了类似的功能,但是,大多是都是从色温转换到XYZ颜色空间。这之后你再可以根据需要从XYZ空间在转换到RGB颜色空间。这种算法的一种实现方式你可以在这找到。
很不幸的是,这种方式并不是真正意义上的数学公式,只是一种美化的查找表实现方式。在某些情况下,这是一种可靠地实现方式。但是,当涉及到XYZ->RGB转换的时候,对简单的实时色温调整而言,这种方式太慢了。
因此,我实现了一套色温到RGB转换的算法。这个算法转换相当不错。以下是我的一些思路。
使用这种算法的一些限制:
- 我的算法是一种高精度的估算。但是,对科学研究而言精度还是不够。这种算法主要是用在照片的一些处理,所以,不要尝试在天文学和医学图像处理领域使用这种算法。
- 由于算法相对简单,这种算法在处理合适大小的图像时,实时性已经足够快速。但是,为了获取更好的实时性能,你必须对你所使用的编程语言实现这种算法再做些优化。
- 这个算法只适用于1000K到40000K的色温转换。对摄影学来说,这么大的光谱范围已经足够了。当色温超过这个范围使用时,精度将会降低。
算法实现:样例输出
下图是算法输出1000K到40000K的图像。
下图是摄影学感兴趣的色温范围:从1500K到15000K
算法实现思路
我的第一步工作是从Charity’s original blackbody values 逆向工程方式实现一个可靠的公式。
Charity’s original blackbody values 的数据用图表的形式表示为:
从图表可以看出,有一些上限值和下限值,使得我们的算法很容易实现。特别的:
- 红色分量在6600K以下的时候总保持255
- 蓝色分量在2000K的时候总保持0
- 蓝色问了在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的转换:算法和样例相关推荐
- 数据挖掘-序列模式挖掘-prefixspan算法(样例)
数据挖掘-序列模式挖掘-prefixspan算法(样例) ' 所有结果: 通俗来讲:可以以1-频繁项d为例,我们的思路讲解的很明白:这儿我们一般化我们的求解过程: 1)第一次扫描原始数据库,得到长度为 ...
- mupdf中CMYK与RGB的转换算法
之前碰到过RGB与CMYK之间转换的问题,网上也没有比较官方的转换公式,不同的软件可能会采用不同的算法,现在mupdf,正好也看到了这样的算法,还是有一定参考价值的,具体算法如下: #define M ...
- 【机器学习】集成算法使用样例
# -*- coding: utf-8 -*- """集成算法.ipynbAutomatically generated by Colaboratory.Original ...
- java rgb hsl_java的RGB转HSL算法
import org.eclipse.swt.graphics.RGB; /** * 颜色转换算法 * */ public class ColorTools { public static HSL R ...
- YUV / RGB 格式及快速转换算法
1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确 ...
- 【DSP开发】【VS开发】YUV与RGB格式转换
[视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...
- C语言运行时变成灰色,C语言实现RGB图像转换成灰(Gray)度图像
以前实现RGB图像转换成灰度图像都是直接调用OpenCV的库函数RGB2GRAY(IplImage* src);最近老板让我们除了读入输出图像实时用OpenCV的函数,其余的最好都是自己写,所以我自己 ...
- rgb 光谱 转换_使用深度学习将RGB图像转换为高光谱
rgb 光谱 转换 Finding an applicable cost-effective way to convert and use hyperspectral images. 寻找一种适用的具 ...
- RGB图像转换成HSV图像,HSV图像转换为RGB图像
HSV 即使用 色相(Hue).饱和度(Saturation).明度(Value) 来表示色彩的一种方式 色相:将颜色用0°到360°表示,就是我们日常讲的颜色名称,如红色.蓝色等. 色相与颜色对应关 ...
最新文章
- 谷歌BERT预训练源码解析(二):模型构建
- 如何选择汽车LiDAR的激光器和光电探测器
- 吴恩达机器学习作业(4):正则化逻辑回归
- Java面向对象编程篇2——面向对象三大特点
- 《Python编程从入门到实践》记录之读取文件
- An efficient and robust line segment matching approach based on LBD descriptor and pairwise geometri
- 图解 hexo + github 从零快速 搭建个人博客 windowss
- 蓝桥杯 ADV-9 算法提高 递归倒置字符数组
- Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083
- .net知识系列之五:(基本控件和数据绑定控件)
- 高精度地图发展与北斗车载动态视频采集应用
- 学计算机要具备什么能力,具备什么特质能学计算机
- MATLAB 图像嵌入水印图像程序
- Android 实现openGL录像添加静态图片水印
- 单元测试利器——手把手教你使用Mockito
- C/C++内存泄漏和野指针的区别
- mysql 创建外键语句_sql创建外键语句
- 退出mysql命令_进入mysql命令行之后,怎么退出
- STC8单片机三相SPWM程序
- AlertManager实现Email告警(使用Postman测试)
热门文章
- 关于 Python PyQt5 界面运行时提示无法初始化Qt平台的解决方案
- ​危机——疫情是“危”,5G是“机”
- OV代码签名和EV代码签名证书区别
- mysql 分钟转小时_将分钟转化为**小时**分钟,,将秒转化为**天**小时**分钟**秒...
- 一种h5前端和服务端通信的安全方案
- vue利用事件委托实现按钮互斥,并传递对应的值
- 第五次作业-需求原型改进
- linux系统中不存在 基本文件类型,Linux系统中不存在以下哪个基本文件类型( )
- 移动终端及常见的操作系统
- 项目经理如何写年终总结,范文+PPT模板