当前位置:   article > 正文

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

色温转rgb

                         色温(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处理,并进行了相应的偏移。以下是每个分量的数据分布和最优的拟合曲线:

 

 

 

 

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

算法实现

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

  1. 输入:1000K到40000K的色温;色温和颜色分量的变量必须是双精度
  2. Set Temperature = Temperature \ 100
  3. Calculate Red:
  4. If Temperature <= 66 Then
  5. Red = 255
  6. Else
  7. Red = Temperature - 60
  8. Red = 329.698727446 * (Red ^ -0.1332047592)
  9. If Red < 0 Then Red = 0
  10. If Red > 255 Then Red = 255
  11. End If
  12. Calculate Green:
  13. If Temperature <= 66 Then
  14. Green = Temperature
  15. Green = 99.4708025861 * Ln(Green) - 161.1195681661
  16. If Green < 0 Then Green = 0
  17. If Green > 255 Then Green = 255
  18. Else
  19. Green = Temperature - 60
  20. Green = 288.1221695283 * (Green ^ -0.0755148492)
  21. If Green < 0 Then Green = 0
  22. If Green > 255 Then Green = 255
  23. End If
  24. Calculate Blue:
  25. If Temperature >= 66 Then
  26. Blue = 255
  27. Else
  28. If Temperature <= 19 Then
  29. Blue = 0
  30. Else
  31. Blue = Temperature - 10
  32. Blue = 138.5177312231 * Ln(Blue) - 305.0447927307
  33. If Blue < 0 Then Blue = 0
  34. If Blue > 255 Then Blue = 255
  35. End If
  36. End If

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

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

  1. Static tmpCalc As Double
  2. 'Temperature must fall between 1000 and 40000 degrees
  3. If tmpKelvin < 1000 Then tmpKelvin = 1000
  4. If tmpKelvin > 40000 Then tmpKelvin = 40000
  5. 'All calculations require tmpKelvin \ 100, so only do the conversion once
  6. tmpKelvin = tmpKelvin \ 100
  7. 'Calculate each color in turn
  8. 'First: red
  9. If tmpKelvin <= 66 Then
  10. r = 255
  11. Else
  12. 'Note: the R-squared value for this approximation is .988
  13. tmpCalc = tmpKelvin - 60
  14. tmpCalc = 329.698727446 * (tmpCalc ^ -0.1332047592)
  15. r = tmpCalc
  16. If r < 0 Then r = 0
  17. If r > 255 Then r = 255
  18. End If
  19. 'Second: green
  20. If tmpKelvin <= 66 Then
  21. 'Note: the R-squared value for this approximation is .996
  22. tmpCalc = tmpKelvin
  23. tmpCalc = 99.4708025861 * Log(tmpCalc) - 161.1195681661
  24. g = tmpCalc
  25. If g < 0 Then g = 0
  26. If g > 255 Then g = 255
  27. Else
  28. 'Note: the R-squared value for this approximation is .987
  29. tmpCalc = tmpKelvin - 60
  30. tmpCalc = 288.1221695283 * (tmpCalc ^ -0.0755148492)
  31. g = tmpCalc
  32. If g < 0 Then g = 0
  33. If g > 255 Then g = 255
  34. End If
  35. 'Third: blue
  36. If tmpKelvin >= 66 Then
  37. b = 255
  38. ElseIf tmpKelvin <= 19 Then
  39. b = 0
  40. Else
  41. 'Note: the R-squared value for this approximation is .998
  42. tmpCalc = tmpKelvin - 10
  43. tmpCalc = 138.5177312231 * Log(tmpCalc) - 305.0447927307
  44. b = tmpCalc
  45. If b < 0 Then b = 0
  46. If b > 255 Then b = 255
  47. End If
  48. End Sub

算法效果:

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/126223?site
推荐阅读
相关标签
  

闽ICP备14008679号