diff --git a/ASCII/plugin.py b/ASCII/plugin.py index bca3aa0..14965a4 100644 --- a/ASCII/plugin.py +++ b/ASCII/plugin.py @@ -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':