Improve comment code algorithm Itcwb

This commit is contained in:
Desmis 2020-03-18 09:37:34 +01:00
parent a45823995a
commit fe17a7add2
2 changed files with 15 additions and 21 deletions

View File

@ -3391,6 +3391,7 @@ this values are often called xBar yBar zBar and are characteristics of a color /
values cie_colour_match[][3] = 2° Standard Observer x2, y2, z2
E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above
I have increase precision used by J.Walker and pass to 350nm to 830nm
And also add 10° standard observer
*/
void ColorTemp::spectrum_to_xyz_daylight(double _m1, double _m2, double &x, double &y, double &z)
@ -3449,6 +3450,7 @@ void ColorTemp::spectrum_to_xyz_preset(const double* spec_intens, double &x, dou
values cie_colour_match[][3] = 2° Standard Observer x2, y2, z2
E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above
I have increased the precision used by J.Walker and pass from 350nm to 830nm
And also add standard observer 10°
*/
for (i = 0, lambda = 350.; lambda < 830.1; i++, lambda += 5.) {
double Me = get_spectral_color(lambda, spec_intens);
@ -3623,7 +3625,7 @@ void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float
double ZZ;
} WbTxyz;
//probbaly can be "passed" with rawimagesource.cc but I don't know how to do.
constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after
constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values - same table as in Rawimagesource.cc x wb and y wb are calculated after
{2001., 1.273842, 0.145295},
{2101., 1.244008, 0.167533},
{2201., 1.217338, 0.190697},

View File

@ -4412,12 +4412,13 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double
Copyright (c) Jacques Desmis 6 - 2018 jdesmis@gmail.com
Copyright (c) Ingo Weyrich 3 - 2020 (heckflosse67@gmx.de)
This algorithm try to find temperature correlation between 20 to 201 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web.
This algorithm try to find temperature correlation between 20 to 201 color between 201 spectral color and about 20 to 55 color found in the image between 192, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web.
I have test many many algorithms to find the first one that work :)
Probably (sure) there are improvement to do...
I have create a table temperature with temp and white point with 100 values between 2000K and 12000K we can obviously change these values, more...with different steps
I have create a table temperature with temp and white point with 118 values between 2000K and 12000K we can obviously change these values, more...with different steps
I have create a table for tint (green)with 134 values between 0.4 to 4.
I have create or recuparate and transformed 201 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is large enough.
I think this value of 201 is now complete: I tested correlation with 60, 90, 100, 120, 155...better student increase with number of color, but now it seems stabilized
Of course we can increase this number :)
@ -4425,8 +4426,8 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double
1) for the current raw file we create a table for each temp of RGB multipliers
2) then, I choose the "camera temp" to initialize calculation (why not)
3) for this temp, I calculated XYZ values for the 201 spectral datas
4) then I create for the image an "histogram", but for xyY (Cie 1931 color space)
5) for each pixel (in fact to accelerate only 1/10 for and 1/10 for y), I determine for each couple xy, the number of occurences
4) then I create for the image an "histogram", but for xyY (CIE 1931 color space or CIE 1964 (default))
5) for each pixel (in fact to accelerate only 1/5 for and 1/5 for y), I determine for each couple xy, the number of occurences, can be change by Itcwb_precis to 3 or 9
6) I sort this result in ascending order
7) in option we can sort in another manner to take into account chroma : chromax = x - white point x, chromay = y - white point y
8) then I compare this result, with spectral datas found above in 3) with deltaE (limited to chroma)
@ -4445,10 +4446,9 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double
20) between these green limits, we make slightly vary temp (settings in options) and recalculated RGB multipliers
21) with this multipliers for the RGB color find in histogram we recalculate xyY
22) we re-adjust references color for these xyY from 20)
23) we add if chroma image is very low, k colors to degrad correlation
24) then find all Student correlation for each couple green / temp
25) sort these Student values, and choose the minimum
26) then for the 3 better couple "temp / green" choose the one where green is nearest from 1.
23) then find all Student correlation for each couple green / temp
24) sort these Student values, and choose the minimum
25) then for the 3 better couple "temp / green" choose the one where green is nearest from 1.
Some variables or function are not used, keep in case of
I have test with cat02 but result are not stable enough ! why ??, therefore cat02 neutralized
@ -4468,6 +4468,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double
Itcwb_sizereference : 3 by default, can be set to 5 ==> size of reference color compare to size of histogram real color
itcwb_delta : 1 by default can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good
itcwb_stdobserver10 : true by default - use standard observer 10°, false = standard observer 2°
itcwb_precis : 5 by default - can be set to 3 or 9 - 3 best sampling but more time...9 "old" settings - but low differences in times with 3 instead of 9 about twice time 160ms instead of 80ms for a big raw file
*/
// BENCHFUN
@ -4660,7 +4661,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double
//I don't know how to pass this structure to Colortemp !
// X and Z values calculate for each temp between 2000K to 12000K, so no result after 12000K !
//of course we can change the step between each temp if need
constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after
constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after, Xwb and Ywb calculated with a spreadsheet
{2001., 1.273842, 0.145295},
{2101., 1.244008, 0.167533},
{2201., 1.217338, 0.190697},
@ -4781,7 +4782,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double
{12001., 0.960440, 1.601019}
};
const int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point
constexpr int Nc = 201 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values
constexpr int Nc = 201 + 1;//201 number of reference spectral colors, I think it is enough to retrieve good values
array2D<float> Tx(N_t, Nc);
array2D<float> Ty(N_t, Nc);
array2D<float> Tz(N_t, Nc);
@ -5196,15 +5197,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double
reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY
}
//degrade correllation with color high chroma, but not too much...seems not good, but keep in case of??
//I suppress this old behavior replace by tint += 0.02
/* if (estimchrom < 0.025f) {//very smal value of chroma for image
//enable strong values
good_spectral[0] = true;//blue
good_spectral[11] = true;//green
good_spectral[62] = true;//red
}
*/
int kkg = -1;
for (int i = 0; i < Nc ; ++i) {
if (good_spectral[i]) {
@ -5301,7 +5293,7 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D<float>
if (wbpar.method == "autitcgreen") {
bool extra = false;
if (greenref > 0.5 && greenref < 1.3) {// 0/77 and 1.3 arbitraties values
if (greenref > 0.5 && greenref < 1.3) {// 0.5 and 1.3 arbitraties values
greenitc = greenref;
if (settings->itcwb_forceextra) {