我想找出相机拍摄的照片的色温。
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]
正如您所看到的,COLOR_CORRECTION_GAINS
的值为>1
,即大于255,这并不罕见,因为它的增益和iOS返回相似的值(大于1)。
答案 0 :(得分:13)
既然你已经提到了苹果提供的方法来实现同样的目的。
我从关于方法的Apple文档开始
关于temperatureAndTintValues
的Apple文档如下
将设备特定的白平衡RGB增益值转换为 与设备无关的温度和色调值。
我们可以通过以下方法在android中实现相同的功能。
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的等级测量。
根据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)
使用java实现相同的等式。
注:参考文件
Calculating Color Temperature and Illuminance using the TAOS TCS3414CS Digital Color Sensor
从RGB转换为色温的问题在于大约有1600万种RGB颜色,但这些颜色中只有很小一部分实际上与色温相对应。
例如 绿色并不对应任何温度 - 由于人类的大脑如何感知光线,它是不可能的。记住上面的演示实际上只是一个近似值,理论上可以查找与给定颜色相关的温度,但它对大多数颜色都不起作用。
为何排除绿色?阅读:Why Are There No Purple or Green Stars?
许多解释来自其他网站,
希望一切都能满足您的需求!