Convert an image RGB->Lab with python

前端 未结 4 2085
醉梦人生
醉梦人生 2020-12-07 12:44

What is the preferred way of doing the conversion using PIL/Numpy/SciPy today?

4条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-07 13:26

    I've found this code on the old Adobe Cookbook site and have adapted for Python. It doesn't require any third-party modules or components:

    def rgb2lab ( 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
    

提交回复
热议问题