如何从色彩校正增益中获得色温

我试图找出相机拍摄的照片的色温。

final CameraCaptureSession.CaptureCallback previewSSession = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureStarted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frameNumber) { super.onCaptureStarted(session, request, timestamp, frameNumber); } @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); RggbChannelVector rggbChannelVector = result.get(CaptureResult.COLOR_CORRECTION_GAINS); getColorTemperature(rggbChannelVector); startCamera(); } }; private void getColorTemperature(RggbChannelVector rggbChannelVector) { //rggbChannelVector.getRed() = 2.192929 //rggbChannelVector.getGreenEven() = 1.0 //rggbChannelVector.getGreenOdd() = 1.0 //rggbChannelVector.getBlue() = 1.832323 } 

iOS似乎有一个随时可用的方法来执行那个temperatureAndTintValues

在搜索类似的东西时(用Java或我可以采用的任何其他语言),几乎所有这些方法都期望RGB值为[0, 255]

将XYZ转换为CCT(相关色温)的方法很少,但即使要使XYZ值正确,我需要在[0, 255]使用RGB值

正如您所看到的, COLOR_CORRECTION_GAINS中的值>1即大于255,这并不罕见,因为它的增益和iOS返回相似的值(大于1)。

既然你已经提到了苹果提供的方法来实现同样的目的。

我从这个方法的Apple文档开始

来自Apple文档

关于temperatureAndTintValues Apple文档如下

将特定于设备的白平衡RGB增益值转换为与设备无关的温度和色调值。

参考: Apple的文档

我们可以通过以下方法在android中实现相同的function。

找出位置的RGB组件

 int x = (int)event.getX(); int y = (int)event.getY(); int pixel = bitmap.getPixel(x,y); int redValue = Color.red(pixel); int blueValue = Color.blue(pixel); int greenValue = Color.green(pixel); 

相关色温(CCT),以开尔文(K)为单位,以1,000至10,000的标度测量。

下图显示了CCT与某些颜色之间的关系 在此处输入图像描述


从RGB值计算色温

根据SO Post,可以使用以下公式轻松计算色温

1.找出CIE三刺激值(XYZ)如下:

 X=(−0.14282)(R)+(1.54924)(G)+(−0.95641)(B) Y=(−0.32466)(R)+(1.57837)(G)+(−0.73191)(B)=Illuminance Z=(−0.68202)(R)+(0.77073)(G)+(0.56332)(B) 

2.计算归一化的色度值:

 x=X/(X+Y+Z) y=Y/(X+Y+Z) 

3.计算CCT值:

 CCT=449n3+3525n2+6823.3n+5520.33 where n=(x−0.3320)/(0.1858−y) 

合并公式(CCT来自RGB)

 CCT=449n3+3525n2+6823.3n+5520.33 where n=((0.23881)R+(0.25499)G+(−0.58291)B)/((0.11109)R+(−0.85406)G+(0.52289)B) 

Android的

使用java实现相同的等式。

注意:参考文件

使用TAOS TCS3414CS数字彩色传感器计算色温和照度


其他平台的类似实现

PHP – SO Post

Python – SO Post

注意:

从RGB转换到色温的问题在于大约有1600万RGB颜色,但这些颜色中只有非常小的子集实际上对应于色温。

例如 ,绿色与任何温度都不对应 – 由于人类大脑如何感知光线,这是不可能的。 记住上面的演示实际上只是一个近似,理论上可以查找与给定颜色相关的温度,但它对大多数颜色都不起作用。

为何排除绿色? 阅读: 为什么没有紫色或绿色星星?


许多解释来自其他网站,

希望一切都能满足您的需求!