rgb->lab cache
This commit is contained in:
parent
f555b08f0d
commit
1991cd8f08
|
|
@ -471,43 +471,47 @@ class ASCII(callbacks.Plugin):
|
|||
return self.rgbColors.index(pixel, 0, 98)
|
||||
else:
|
||||
return self.rgbColors.index(pixel, 16, 98)
|
||||
def rgb2lab (self, inputColor) :
|
||||
num = 0
|
||||
RGB = [0, 0, 0]
|
||||
for value in inputColor :
|
||||
value = float(value) / 255
|
||||
if value > 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 )
|
||||
XYZ[ 0 ] = float( XYZ[ 0 ] ) / 95.047 # ref_X = 95.047 Observer= 2°, Illuminant= D65
|
||||
XYZ[ 1 ] = float( XYZ[ 1 ] ) / 100.0 # ref_Y = 100.000
|
||||
XYZ[ 2 ] = float( XYZ[ 2 ] ) / 108.883 # ref_Z = 108.883
|
||||
num = 0
|
||||
for value in XYZ :
|
||||
if value > 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 )
|
||||
return Lab
|
||||
def rgb2lab (self, inputColor) :
|
||||
try:
|
||||
return self.labmatches[inputColor]
|
||||
except:
|
||||
num = 0
|
||||
RGB = [0, 0, 0]
|
||||
for value in inputColor :
|
||||
value = float(value) / 255
|
||||
if value > 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 )
|
||||
XYZ[ 0 ] = float( XYZ[ 0 ] ) / 95.047 # ref_X = 95.047 Observer= 2°, Illuminant= D65
|
||||
XYZ[ 1 ] = float( XYZ[ 1 ] ) / 100.0 # ref_Y = 100.000
|
||||
XYZ[ 2 ] = float( XYZ[ 2 ] ) / 108.883 # ref_Z = 108.883
|
||||
num = 0
|
||||
for value in XYZ :
|
||||
if value > 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 )
|
||||
self.labmatches[inputColor] = Lab
|
||||
return self.labmatches[inputColor]
|
||||
|
||||
def ciede2000(self, lab1, lab2):
|
||||
""" CIEDE2000 color difference formula. https://peteroupc.github.io/colorgen.html"""
|
||||
|
|
@ -934,6 +938,7 @@ class ASCII(callbacks.Plugin):
|
|||
image2 = image2.convert('RGB')
|
||||
colormap = np.array(image2)
|
||||
self.matches = {}
|
||||
self.labmatches = {}
|
||||
# ascii image is a list of character strings
|
||||
aimg = []
|
||||
if type == '1/2':
|
||||
|
|
|
|||
Loading…
Reference in New Issue