使用python转换图像RGB-> Lab

Ant*_*ins 32 python numpy scipy color-space python-imaging-library

今天使用PIL/Numpy/SciPy进行转换的首选方式是什么?

Ant*_*ins 53

自2010 年问到链接问题以来,相应的代码从scipy转移到了一个单独的工具包:http://scikit-image.org/

所以这是我实际需要的代码:

from skimage import io, color
rgb = io.imread(filename)
lab = color.rgb2lab(rgb)
Run Code Online (Sandbox Code Playgroud)

还应该注意的是,由于实验室性质srgb->实验室转换取决于一个额外的参数:whitepoint,例如:
   • Photoshop使用一个名为D50的白点(这是icc的标准)
   • OpenCV和skimage使用D65(这是srgb的标准.
   •默认的Matlab实现使用D50(它能够使用其他人),

这个很好的FAQ以这种方式解释:

除非你有充分的理由使用其他东西,否则你应该使用D65.
印刷业通常使用D50,而摄影通常使用D55.
这些代表了室内(钨)和日光观察条件之间的妥协.

你可以通过将RGB转换(0,0,255)为Lab 来判断你正在处理哪个白点:
   •D50会给你(30,68,-112)
   •D55(30,73,-110)
   •D65(32,79,-108)

"D"后的数字对应于(内部)使用的白点色温:D50 = 5003 K(带蓝色),D65 = 6504 K(黄色)

我很感激亚历克斯和罗曼的答案,因为他们指出了我正确的方向.

  • 在`skimage`中你可以将白点改为D50或其他东西http://stackoverflow.com/a/22968744/2863099 (2认同)

Rom*_*kin 20

我在旧的Adobe Cookbook网站上找到了这个代码并且已经适应了Python.它不需要任何第三方模块或组件:

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
Run Code Online (Sandbox Code Playgroud)

  • @jez 你在这里看到的 gamma 2.4 是 sRGB 标准。它与较低值处的线性转换结合在一起,并且它们一起紧密匹配 2.2 伽马曲线。我不会改变任何事情。 (2认同)

Ale*_*x I 7

编辑:示例pyCMS代码:

from PIL import Image
import pyCMS
im = Image.open(...)
im2 = pyCMS.profileToProfile(im, pyCMS.createProfile("sRGB"), pyCMS.createProfile("LAB"))
Run Code Online (Sandbox Code Playgroud)

编辑:枕头,PIL前叉,似乎内置了pyCMS.

您可以使用与PIL图像一起使用的pyCMS(http://www.cazabon.com/pyCMS/).

如果速度不是一个因素,请使用python-colormath(http://code.google.com/p/python-colormath/).