WB to Temp and Tint
Hi.
I know, this question was asked more than once, but I still have not been able to find a solution.
I want to translate the white balance coefficients into Temperature and Tint, as for example, this is done in FastRawViewer.
For this, I used dng_temperature from the DNG SDK (about the error with the typing I know).
I receive rgb_cam from cam_xyz with cam_xyz_coeff for my camera. The rgb_cam now stores the matrix from the camera to sRGB.
To get XYZ, I multiply rgb_cam by xyz_rgb. And multiply the resulting matrix by the RGB value. I hope I understood the dcraw code correctly.
Now the question arises, what exactly to use as RGB. I suggested that I need to divide the pre_mul by a white balance factor. As a result, I get values that are approximately similar to Temp / Tint, but there is no accuracy that is found in FastRawViewer.
I need help, I seem to be mistaken somewhere.
If it's easier to look at the code, here's the my test:
double out_cam[3][4]; double pre_mul[4] = {0,0,0,0}; double cam_xyz[4][3] = { {0.6722,-0.0635,-0.0963},{-0.4287,1.2460,0.2028},{-0.0908,0.2162,0.5668} }; // 5D Mark III double black = 0; double maximum = 0x3c80; double rgb_cam[3][4] = {0}; int i, j, k; int colors = 3; cam_xyz_coeff (rgb_cam, cam_xyz, pre_mul); double dblRGGB[4] = //{1986.0, 1024.0, 1024.0, 1628.0 }; // RGGB 5200 //{1438.0, 1024.0, 1024.0, 2399.0 }; // RGGB 3200 {2275.0, 1024.0, 1024.0, 1393.0 }; // RGGB 7000 double dblWB[3] = {0, 0, 0}; double dblRGB[3] = {0, 0, 0}; double dblXYZ[3] = {0, 0, 0}; GetWBcoef(dblRGGB, dblWB); for (i=0; i < 3; i++) dblWB[i] = pre_mul[i] / dblWB[i]; double dblWBmax = MAX(dblWB[0],MAX(dblWB[1],dblWB[2])); for (i=0; i < 3; i++) dblRGB[i] = dblWB[i] / dblWBmax; for (i=0; i < 3; i++) for (j=0; j < colors; j++) for (out_cam[i][j] = double(k=0); k < 3; k++) out_cam[i][j] += xyz_rgb[i][k] * rgb_cam[k][j]; dblXYZ[0] = dblXYZ[1] = dblXYZ[2] = 0; for (i=0; i < colors; i++) { dblXYZ[0] += out_cam[0][i] * dblRGB[i]; dblXYZ[1] += out_cam[1][i] * dblRGB[i]; dblXYZ[2] += out_cam[2][i] * dblRGB[i]; } dng_temperature t; dng_vector_3 coord(dblXYZ[0],dblXYZ[1],dblXYZ[2]); dng_xy_coord xy = XYZtoXY (coord); t.Set_xy_coord(xy); double Temp = t.Temperature(); double Tint = t.Tint();
Recent comments