Improve comment code algorithm Itcwb
This commit is contained in:
parent
a45823995a
commit
fe17a7add2
@ -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
|
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
|
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
|
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)
|
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
|
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
|
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
|
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.) {
|
for (i = 0, lambda = 350.; lambda < 830.1; i++, lambda += 5.) {
|
||||||
double Me = get_spectral_color(lambda, spec_intens);
|
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;
|
double ZZ;
|
||||||
} WbTxyz;
|
} WbTxyz;
|
||||||
//probbaly can be "passed" with rawimagesource.cc but I don't know how to do.
|
//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},
|
{2001., 1.273842, 0.145295},
|
||||||
{2101., 1.244008, 0.167533},
|
{2101., 1.244008, 0.167533},
|
||||||
{2201., 1.217338, 0.190697},
|
{2201., 1.217338, 0.190697},
|
||||||
|
@ -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) Jacques Desmis 6 - 2018 jdesmis@gmail.com
|
||||||
Copyright (c) Ingo Weyrich 3 - 2020 (heckflosse67@gmx.de)
|
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 :)
|
I have test many many algorithms to find the first one that work :)
|
||||||
Probably (sure) there are improvement to do...
|
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 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
|
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 :)
|
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
|
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)
|
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
|
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)
|
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/10 for and 1/10 for y), I determine for each couple xy, the number of occurences
|
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
|
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
|
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)
|
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
|
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
|
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)
|
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
|
23) then find all Student correlation for each couple green / temp
|
||||||
24) then find all Student correlation for each couple green / temp
|
24) sort these Student values, and choose the minimum
|
||||||
25) 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.
|
||||||
26) 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
|
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
|
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_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_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_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
|
// 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 !
|
//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 !
|
// 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
|
//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},
|
{2001., 1.273842, 0.145295},
|
||||||
{2101., 1.244008, 0.167533},
|
{2101., 1.244008, 0.167533},
|
||||||
{2201., 1.217338, 0.190697},
|
{2201., 1.217338, 0.190697},
|
||||||
@ -4781,7 +4782,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double
|
|||||||
{12001., 0.960440, 1.601019}
|
{12001., 0.960440, 1.601019}
|
||||||
};
|
};
|
||||||
const int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point
|
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> Tx(N_t, Nc);
|
||||||
array2D<float> Ty(N_t, Nc);
|
array2D<float> Ty(N_t, Nc);
|
||||||
array2D<float> Tz(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
|
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;
|
int kkg = -1;
|
||||||
for (int i = 0; i < Nc ; ++i) {
|
for (int i = 0; i < Nc ; ++i) {
|
||||||
if (good_spectral[i]) {
|
if (good_spectral[i]) {
|
||||||
@ -5301,7 +5293,7 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D<float>
|
|||||||
if (wbpar.method == "autitcgreen") {
|
if (wbpar.method == "autitcgreen") {
|
||||||
bool extra = false;
|
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;
|
greenitc = greenref;
|
||||||
|
|
||||||
if (settings->itcwb_forceextra) {
|
if (settings->itcwb_forceextra) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user