【问题标题】:How to get Color Temperature from Color Correction Gain如何从色彩校正增益中获取色温
【发布时间】:2018-01-08 01:46:48
【问题描述】:

我正在尝试找出相机拍摄的照片的色温。

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 或我可以采用的任何其他语言中),几乎所有此类方法都期望具有 [0, 255] 范围的 RGB 值。

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

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

【问题讨论】:

标签: android colors android-camera android-camera2


【解决方案1】:

既然你提到了苹果提供的实现相同的方法。

我从有关该方法的 Apple 文档开始

来自 Apple 文档

关于temperatureAndTintValues的Apple文档如下

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

参考:Documentation by Apple

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

找出位置的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)

综合公式(来自 RGB 的 CCT)

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)

安卓

使用 java 实现相同的等式。

注意:参考论文

Calculating Color Temperature and Illuminance using the TAOS TCS3414CS Digital Color Sensor


其他平台的类似实现

PHP - SO Post

Python - SO Post

注意:

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

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

为什么排除格林?阅读:Why Are There No Purple or Green Stars?


很多解释取自其他网站,

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

【讨论】:

  • 这是IOS还是Andriod?
  • 当然适用于安卓系统。我们必须在java中实现这个方程。
  • iOS 方法使用 RGB 增益。此方法仅使用 RGB 值,不考虑增益(rggbChannelVector OP 询问)
  • 这是一个很好的答案,但它根本没有解决问题。
  • @PedroJoséCardoso 是的。我想是这样。你能告诉我他还有什么期待吗?
猜你喜欢
  • 2013-06-01
  • 2022-10-15
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多