android - saturacion - Cómo obtener la temperatura de color a partir de la ganancia de corrección de color
la pantalla de mi celular se pone de colores (1)
Como mencionaste sobre el método proporcionado por Apple para lograrlo.
Estoy empezando con la documentación de Apple sobre el método
De la documentación de Apple
La documentación de Apple con respecto a temperatureAndTintValues
es la siguiente
Convierte valores de ganancia RGB de balance de blancos específicos del dispositivo a valores de temperatura y tinte independientes del dispositivo.
Referencia: Documentación de Apple
La misma funcionalidad que podemos implementar en Android también siguiendo los métodos a continuación.
Descubra los componentes RGB en su posición
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);
Temperatura de color correlacionada (CCT) que se mide en grados Kelvin (K) en una escala de 1,000 a 10,000.
La siguiente imagen muestra la relación entre CCT y algunos colores
Cálculo de la temperatura de color a partir del valor RGB
Según el mensaje SO La temperatura del color se puede calcular fácilmente con las siguientes fórmulas
1. Averigüe los valores de triestímulo CIE (XYZ) de la siguiente manera:
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. Calcule los valores de cromaticidad normalizados:
x=X/(X+Y+Z)
y=Y/(X+Y+Z)
3. Calcule el valor de CCT desde:
CCT=449n3+3525n2+6823.3n+5520.33
where n=(x−0.3320)/(0.1858−y)
Fórmula consolidada (CCT de 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)
Androide
Implementa la misma ecuación usando java.
Nota: papel de referencia
Cálculo de la temperatura del color y la iluminación con el sensor digital de color TAOS TCS3414CS
Implementaciones similares en otras plataformas
PHP - SO Post
Python - SO Post
Nota:
El problema con la conversión de RGB a temptation de color es que hay aproximadamente 16 millones de colores RGB, pero solo un subconjunto muy pequeño de esos colores en realidad corresponde a una temperatura de color.
Por ejemplo, un color verde no se corresponde con ninguna temperatura; es imposible debido a la forma en que el cerebro humano percibe la luz. Recordando que la demostración anterior es solo una aproximación, teóricamente sería posible buscar la temperatura asociada con un color dado, pero no funcionaría para la mayoría de los colores.
¿Por qué Green está excluido? Leer: ¿Por qué no hay estrellas moradas o verdes?
Muchas de las explicaciones provienen de otros sitios,
Espero que todo se ajuste a tu necesidad!
Estoy tratando de averiguar la temperatura de color de una foto capturada por la cámara.
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 parece tener un método disponible para hacer esa temperaturaAndTintValues
Mientras busco algo similar (en Java o en cualquier otro idioma que pueda adoptar), casi todos estos métodos esperan un valor RGB con un rango de [0, 255]
.
Hay pocos métodos para convertir XYZ a CCT (temperatura de color correlacionada) pero incluso para obtener el valor XYZ correcto, necesito valores RGB con en [0, 255]
Como puede ver, los valores de COLOR_CORRECTION_GAINS
son >1
es decir, mayores que 255, lo cual no es inusual porque es una ganancia y iOS devuelve valores similares (mayores que 1).