The MASM Forum
Miscellaneous => The Orphanage => Topic started by: guga on January 26, 2019, 03:59:11 AM

Hi Guys
I´m a bit confused with the Linear to NonLinear adaptations of Bradford Transformations. Accordlying to http://www.marcelpatek.com/color.html the equation to create a linear or non linear Bradford transformation can be given by this pseudocode In matlab :( ) :
% bradford.m
% calculates Bradford matrix from source to destination illuminant
Mcat = [0.8951 0.2664 0.1614;
0.7502 1.7135 0.0367;
0.0389 0.0685 1.0296];
% destination white (here D50)
D50 = [96.4220 100.0000 82.5210];
% enter tristimulus of the source white (e.g., monitor)
DXX = [95.105 100.000 108.548];
sxx = Mcat * DXX'; % source cone responses
d = Mcat * D50'; % destination cone responses
tau = (sxx(3)/d(3))^0.0834; % Scone nonlinear correction
diag = [d(1)/sxx(1) 0 0; % diagonal linear matrix
0 d(2)/sxx(2) 0;
0 0 d(3)/sxx(3)];
diag_nl = [d(1)/sxx(1) 0 0;
0 d(2)/sxx(2) 0;
0 0 (d(3)/sxx(3)^tau)*sxx(3)^(tau1)]; % non linear coeff in S
Mbfd = inv(Mcat) * diag * Mcat; % "linear" Bradford CAT matrix
Mbfd_nl = inv(Mcat) * diag_nl * Mcat; % "nonlinear" Bradford CAT matrix
disp ('Bradford Matrix:' )
disp (Mbfd)
disp ('Bradford Matrix nonlinear:' )
disp (Mbfd_nl)
I already suceeded to create a function to do the linear transformation, but i´m a bit confused about the nonlinear. From what i understdood, The only different part on both equations are in the 9th position of a matrix.
From linear we do a simple:
ratio = d(3)/sxx(3)];
replacing d(3) with x and sxx(3) with y, this fraction is simple:
ratio = x/y
But for non linear it is something like this for the same 9th position:
tau = (sxx(3)/d(3))^0.0834
ratio = (d(3)/sxx(3)^tau)*sxx(3)^(tau1)
Replacing the same to x and y we have
tau = (y/x)^0.0834
ratio = (x/(y^tau)) * y^(tau1)
Solving the equation on "ratio" we have a simple result as: x/y ????
So...if for nonlinear we use, at the end x/y and for linear we also use the same equation x/y what is the difference between both ??????

I see formula uses ^ in the second one(compare x^2 its not linear,its exponential curve)=its curved,the first one is a line(ar),only uses * and /,+,
it says something about horseshoe shape
very long time I used MATLAB,but doesnt it have some graph drawing capabilities to help you understand it better?
I guess all this research is the reason my windows display settings also offers a nighttime mode,warmer colors make you sleep better it says

Hi DayyDreamer. Oh..now i understood if you post here or in rosAsm subforum.
You can post it here. :bgrin: :bgrin:
Yes, the non linear uses exponential. But the problem is that, both (non linear and linear) seems to produce the very same result. (Also, the nonlinear example used, will later do a non linear transformation)...But....i did not found the difference on the matlab code. I´m not used to matlab. I had to install it to test some of those monsters :icon_mrgreen: :icon_mrgreen: :icon_mrgreen: But still hard to understand.
From what i saw on the code, the only difference between "diag" and "diag_nl" are in the 3rd line.
diag = (....)
0 0 d(3)/sxx(3)];
diag_nl = (...)
0 0 (d(3)/sxx(3)^tau)*sxx(3)^(tau1)]; % non linear coeff in S
With tau = (sxx(3)/d(3))^0.0834
But if you do the maths for diag_nl you will see that :
(d(3)/sxx(3)^tau)*sxx(3)^(tau1)]
is, in fact
d(3)/sxx(3)  Which is teh same as in "diag"
This is why i´m confused.
If they produces the same result why make it different ?
I tried to run this code, but matlab is kinda greek for me. I didn´t suceeded to make this function runs to test. :redface: :redface:

Hi,
Since tau and (tau  1) cannot be equal, the only way to factor
that out is when sxx(3) is zero or one. If zero, the formula won't
work. Is sxx(3) equal to one?
d(3)
____________ * sxx(3)^(tau1)
sxx(3)^tau
As daydreamer says try to plot the function in MatLab or a
spreadsheet.
Regards,
Steve N.

Hi fortrans, yes, but, tau = (sxx(3)/d(3))^0.0834
Tau = (sxx(3)/d(3))^0.0834
d(3)
____________ * sxx(3)^(tau1)
sxx(3)^tau
To make easier to understand, I calculated it in wolfram alpha like this
Renamed:
d(3) = x
sxx(3) = y
Which lead us to:
x
____________ * y^(tau1)
y^tau
Since, tau = (y/x)^ 0.0834, the equation becomes:
x
____________________ * y^(((y/x)^ 0.0834)1)
y^((y/x)^ 0.0834)
Putting that on wolfram alpha results in:
x
__
y
https://www.wolframalpha.com/input/?i=x+%2F+(y%5E((y%2Fx)%5E+0.0834))+*+(y%5E(((y%2Fx)%5E+0.0834)1))
And..after renaming back from x and y result in:
d(3)/sxx(3)
(https://i.imgur.com/M6ddKin.jpg)
I suceeded to make it work in matlab, but they produces the very same result. So, why make it different ffrom diag and diag_nl if they are the same ?
(https://i.imgur.com/uBVbmoN.jpg)
Either in Wolfram Alpha and MatLab the result is the same, proofing that both diag and diag_nl are the same thing. That´s why i´m confused...Why displaying diag and diag_nl as different equations if they produces the same result (And, in fact, are the same mathematical equation) ?
Since the exponential is used in the diag_nl matrix, it results in:
diag_nl = [d(1)/sxx(1) 0 0;
0 d(2)/sxx(2) 0;
0 0 d(3)/sxx(3)]; % non linear coeff in S
That is the same as the linear formula used on diag
diag = [d(1)/sxx(1) 0 0; % diagonal linear matrix
0 d(2)/sxx(2) 0;
0 0 d(3)/sxx(3)];

Hi,
Yes, I can see it now, sort of. The taus cancel each other.
X^n divided by X^n is one. X^(n1) divided by X^n is just
1 / X . So you are right, it is the same and it is silly. Sorry
for the confusion. Apparently obfuscation is fun for someone.
Regards,
Steve

Tks Steve :)
Don´t worry, the confusion was caused by the article at Marcel Patek site. :icon_mrgreen: Indeed, some people really like to obfuscate simple things :greensml: :greensml: :greensml:
I was deeply confused about that, specially because i started another function to work with those "nonlinear" equations and stopped after finding that the result was the same. the good thing is that now i can use only one ssingle equation to hold all that stuff related to Color Conversion and Color Adaptation techniques.
I´m currently finishing one function to use on a new RGBtoCieLCH function that uses gamma, white references and also those sort of adaptations. If i suceed we could be able to use one single function to create something around 18000 different types of variations of colorspaces to use :bgrin: :bgrin: :bgrin:
The main problem i´m facing is with the mathematical equations used to port those kind of things. The papers i´m reading are utterly complex and i have to push from memory those mathematical symbols used on them to understand what it is doing. I still have some issues regarding matrix equations (which are a bit confusing for me) but, i guess, i´m succeeding to create the necessary functions to use.
Eventually i plan to release a library for us at the forum. It may be usefull for someone who wants to create plugins for photoshop, adobe, sony vegas etc etc :)