# RGB to Lab conversion |
# Step 1: RGB to XYZ |
# http://www.easyrgb.com/index.php?X=MATH&H=02#text2 |
# Step 2: XYZ to Lab |
# http://www.easyrgb.com/index.php?X=MATH&H=07#text7 |
defrgb2lab(inputColor): |
num=0 |
RGB= [0, 0, 0] |
forvalueininputColor: |
value=float(value) /255 |
ifvalue>0.04045: |
value= ((value+0.055) /1.055) **2.4 |
else: |
value=value/12.92 |
RGB[num] =value*100 |
num=num+1 |
XYZ= [0, 0, 0, ] |
X=RGB[0] *0.4124+RGB[1] *0.3576+RGB[2] *0.1805 |
Y=RGB[0] *0.2126+RGB[1] *0.7152+RGB[2] *0.0722 |
Z=RGB[0] *0.0193+RGB[1] *0.1192+RGB[2] *0.9505 |
XYZ[0] =round(X, 4) |
XYZ[1] =round(Y, 4) |
XYZ[2] =round(Z, 4) |
# Observer= 2°, Illuminant= D65 |
XYZ[0] =float(XYZ[0]) /95.047# ref_X = 95.047 |
XYZ[1] =float(XYZ[1]) /100.0# ref_Y = 100.000 |
XYZ[2] =float(XYZ[2]) /108.883# ref_Z = 108.883 |
num=0 |
forvalueinXYZ: |
ifvalue>0.008856: |
value=value** (0.3333333333333333) |
else: |
value= (7.787*value) + (16/116) |
XYZ[num] =value |
num=num+1 |
Lab= [0, 0, 0] |
L= (116*XYZ[1]) -16 |
a=500* (XYZ[0] -XYZ[1]) |
b=200* (XYZ[1] -XYZ[2]) |
Lab[0] =round(L, 4) |
Lab[1] =round(a, 4) |
Lab[2] =round(b, 4) |
returnLab |
Hey, I used your gist in mine, I hope that's ok: https://gist.github.com/SinBirb/f71ab664d6f6bd3bbea7992bb264f2cf |
I think that this line: Is buggy. If you're using float elsewhere to make the divisions produce float results (i.e. for Python 2 support) then I'd expect you to have to write 16.0 / 116.0 (technically only one would have to be a float literal). |
According to wikipedia, line 29 should be: Z = RGB[0] * 0.0193 + RGB[1] * 0.1192 + RGB[2] * 0.9504 , that is, changing 0.9505 to 0.9504 |
Hi! I used your RGB>LAB code as confirmation mine was working. I then used it in SLIC superpixel segmentation. |
Great. Any feedback @i-make-robots? :) |
Your work is appreciated and I thank you. :) |