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

Arc*_*pgc 11 android colors android-camera android-camera2

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

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

正如你可以看到从数值COLOR_CORRECTION_GAINS>1即大于255,是不寻常的,因为它的增益和iOS返回类似值(大于1).

Sar*_*ith 13

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

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

来自Apple文档

关于Apple的文档temperatureAndTintValues如下

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

参考: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); 
Run Code Online (Sandbox Code Playgroud)

相关色温(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)
Run Code Online (Sandbox Code Playgroud)

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

x=X/(X+Y+Z)
y=Y/(X+Y+Z)
Run Code Online (Sandbox Code Playgroud)

3.计算来自的CCT值:

CCT=449n3+3525n2+6823.3n+5520.33

where n=(x?0.3320)/(0.1858?y)
Run Code Online (Sandbox Code Playgroud)

合并公式(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)
Run Code Online (Sandbox Code Playgroud)

Android的

使用java实现相同的等式.

注意:参考文件

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


其他平台的类似实现

PHP - SO Post

Python - SO Post

注意:

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

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

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


许多解释来自其他网站,

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

  • iOS方法使用RGB增益.此方法仅使用RGB值,不考虑增益(`rggbChannelVector` OP询问) (2认同)
  • 这是一个很好的答案,但它根本没有解决问题。 (2认同)