我想知道相机拍到的照片的色温。

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值,我也需要in[0, 255]的rgb值。
COLOR_CORRECTION_GAINS中可以看到值>1即大于255,这并不罕见,因为它的a增益和ios返回相似的值(大于1)。

最佳答案

因为你已经提到了苹果提供的实现方法。
我从苹果公司关于这个方法的文档开始
来自苹果文档
关于temperatureAndTintValues的苹果文档如下
将设备特定的白平衡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)为单位,在1000到10000范围内测量。
下图显示了CCT与某些颜色之间的关系
android - 如何从色彩校正增益中获得色温-LMLPHP
根据rgb值计算色温
根据SO柱,色温可以很容易地用下列公式计算
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)

三。计算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 Illuminanceusing the TAOS TCS3414CS Digital Color Sensor
其他平台中的类似实现
PHP - SO Post
Python - SO Post
注:
从rgb到色温转换的问题是,大约有1600万rgb颜色,但这些颜色中只有非常小的一部分实际上对应于色温。
例如
绿色与任何温度都不对应——这是不可能的,因为人类大脑是如何感知光的。记住上面的演示实际上只是一个近似值,理论上可以查找与给定颜色相关的温度,但对大多数颜色都不起作用。
为什么绿色被排除在外?阅读:Why Are There No Purple or Green Stars?
很多解释都是从其他网站获取的,
希望一切都能满足你的需要!

07-24 09:46