The MASM Forum
Miscellaneous => The Orphanage => Topic started by: guga on January 28, 2019, 09:46:20 AM

Hi Guys, i suceeded to make the necessary functions to compute from RGB to CieLCH and the backwards operation, but, the code is still kind slow due to the mathematical operations involved. So, can someone help me try to simplify the mathematical equations before i try to optimize even further with SSE code etc ?
The steps to transform from RGB to CieLCH are basically these. Convert RGB to XYZ, convert XYZ to LAB and convert Lab to CieLCH. So, the pseudocode is doing this:
The worst part is the XYZ convertion :dazzled: :dazzled:
1st step  Convert RGB to XYZ
TmpRed = Red/255
TmpGreen = Green/255
TmpBlue = Blue/255
Where: Threshold, Offset, Gamma, Slope, WhiteRefX, WhiteRefY and WhiteRefZ are already precalculated.
; Gamma must be adjusted to obbey the limits of the threshold. Here those values were already calculated. So, they are "fixed" on this part of the pseudocode
If TmpRed > Threshold
TmpRed2 = [ (TmpRed+Offset)/(Offset+1) ]^Gamma
Else
TmpRed2 = TmpRed/Slope
End_If
TmpRed3 = TmpRed2*100
If TmpGreen > Threshold
TmpGreen2 = [ (TmpGreen+Offset)/(Offset+1) ]^Gamma
Else
TmpGreen2 = TmpGreen/Slope
End_If
TmpGreen3 = TmpGreen2*100
If TmpBlue > Threshold
TmpBlue2 = [ (TmpBlue+Offset)/(Offset+1) ]^Gamma
Else
TmpBlue2 = TmpBlue/Slope
End_If
TmpBlue3 = TmpBlue2*100
Then multiply the 3 values with the Transpose matrix of ColorSpace
[TmpX, TmpY, TmpZ] = [TmpRed3, TmpGreen3, TmpBlue3] * [ColorSpaceMatrix]T
ColorSpace Matrix is in the form of:
Matrix1, Matrix2, Matrix3
Matrix4, Matrix5, Matrix6
Matrix7, Matrix8, Matrix9
Whose color space values are (ON this example, only. There are hundreds of matrices that can be used, but i´m posting here for better understanding of what the algorithm is doing) :
0.5767309 0.185554 0.1881851
0.2973769 0.6273491 0.075274
0.0270343 0.0706872 0.9911085
Transposing it will become:
0.5767309 0.2973769 0.0270343
0.185554 0.6273491 0.0706872
0.1881851 0.075274 0.9911085
So, in short, the multiplication of transposed matrix is doing nothing more then:
TmpX = TmpRed3* Matrix1+ TmpGreen3* Matrix2+ TmpBlue3* Matrix3
TmpY = TmpRed3* Matrix4+ TmpGreen3* Matrix5+ TmpBlue3* Matrix6
TmpZ = TmpRed3* Matrix7+ TmpGreen3* Matrix8+ TmpBlue3* Matrix9
Then do more math in the resultant matrix multiplication (Again...whiteRefX, WhiteRexY and WhiteRefZ are already precalculated. So those values are fixed for this pseudocode)
TmpX2 = TmpX/WhiteRefX
TmpY2 = TmpY/WhiteRefY
TmpZ2 = TmpZ/WhiteRefZ
If TmpX2 > 1
TmpX2 = 1
EndIf
If TmpY2 > 1
TmpY2 = 1
EndIf
If TmpZ2 > 1
TmpZ2 = 1
EndIf
If TmpX2 > 216/24389
X = TmpX2^(1/3)
Else
X = TmpX2*(841/108) + 16/116 ; Btw. 841/108 is a simplification i made for (24389/27)/116. The original formula goes like this: (TmpX2*(24389/27)+16)/116
EndIf
; For the 1st pratical result we retrieve the values of X, Y, Z (that are used in RGB to XYZ, Lab to XYZ etc etc)
If TmpY2 > 216/24389
Y = TmpY2^(1/3)
Else
Y = TmpY2*(841/108) + 16/116
EndIf
If TmpZ2 > 216/24389
Z = TmpZ2^(1/3)
Else
Z = TmpZ2*(841/108) + 16/116
EndIf
2nd stage  Convert the XYZ to Lab
Luminance = Y*11616
Afactor = (XY)*500
Bfactor = (YZ)*200
3rd stage  Convert Lab to CieLCH
Luminance from Lab is the same for LCH so, no need to do more maths here
Chroma = sqrt(Afactor^2+ Bfactor^2)
Hue = atan2(BFactor/AFactor) ; using atan2 function, but is simple arctan(b/a)