使用python转换图像RGB-> Lab

时间:2012-11-15 20:49:54

标签: python numpy scipy python-imaging-library color-space

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

5 个答案:

答案 0 :(得分:51)

自2010年问及linked question后,相应的代码从scipy转移到单独的工具包: http://scikit-image.org/

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

from skimage import io, color
rgb = io.imread(filename)
lab = color.rgb2lab(rgb)

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

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

  

除非你有充分的理由使用D65,否则你应该使用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(偏蓝)

我很感谢Alex和Roman的回答,因为他们指出了我正确的方向。

答案 1 :(得分:19)

我在旧的Adobe Cookbook site上找到了这个代码并且已经适应了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

答案 2 :(得分:7)

编辑:示例pyCMS代码:

from PIL import Image
import pyCMS
im = Image.open(...)
im2 = pyCMS.profileToProfile(im, pyCMS.createProfile("sRGB"), pyCMS.createProfile("LAB"))

编辑:枕头,PIL分叉,似乎内置了pyCMS。

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

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

答案 3 :(得分:1)

这是一个类,用于转换 PIL 图像的 RGB<->LAB 颜色空间:

from PIL import ImageCms

class ColorTrans:

    '''Class for transforming RGB<->LAB color spaces for PIL images.'''
    
    def __init__(self):
        self.srgb_p = ImageCms.createProfile("sRGB")
        self.lab_p  = ImageCms.createProfile("LAB")
        self.rgb2lab_trans = ImageCms.buildTransformFromOpenProfiles(srgb_p, lab_p, "RGB", "LAB")
        self.lab2rgb_trans = ImageCms.buildTransformFromOpenProfiles(lab_p, srgb_p, "LAB", "RGB")
    
    def rgb2lab(self, img):
        return ImageCms.applyTransform(img, self.rgb2lab_trans)

    def lab2rgb(self, img):
        return ImageCms.applyTransform(img, self.lab2rgb_trans)

示例用法:

color_trans = ColorTrans()
c_img = Image.open(FILENAME)
c_img_lab = color_trans.rgb2lab(c_img)
c_img_rgb = color_trans.lab2rgb(c_img_lab)

答案 4 :(得分:0)

此刻,我还没有找到一个好的方法来做到这一点。您必须记住,RGB是与设备有关的色彩空间,因此如果没有配置文件,则无法准确地转换为XYZ或CIE Lab。

因此请注意,必须仔细评估许多在不指定颜色空间或导入颜色配置文件的情况下从RGB转换为CIE Lab的解决方案。大多数情况下,他们假设您正在处理sRGB色彩空间,请仔细阅读幕后代码。

相关问题