今天使用 PIL/Numpy/SciPy 进行转换的首选方式是什么?
5 回答
自 2010 年以来,当询问链接问题时,相应的代码从 scipy 移动到单独的工具包: http ://scikit-image.org/
所以这是我真正要寻找的代码:
from skimage import io, color
rgb = io.imread(filename)
lab = color.rgb2lab(rgb)
还应该注意的是,由于Lab的性质,srgb->lab 转换取决于一个附加参数:whitepoint,例如:
• Photoshop使用称为 D50 的白点(这是 icc 的标准)
• OpenCV和 skimage 使用 D65(即srgb 的标准)。
• 默认的Matlab实现使用 D50(它能够使用其他),
这个很好的常见问题解答是这样解释的:
除非您有充分的理由使用其他东西,否则您应该使用 D65。
印刷业常用D50,摄影常用D55。
这些代表了室内(钨丝灯)和日光观看条件之间的折衷。
(0,0,255)
您可以通过将 RGB 转换为 Lab来判断您正在处理的白点:
• D50 将给您 (30, 68, -112)
• D55 (30, 73, -110)
• D65 (32, 79, -108)
“D”后面的数字对应于(内部)使用的白点色温:D50 = 5003 K(偏黄),D65 = 6504 K(偏蓝)
我很感谢 Alex 和 Roman 的回答,因为他们为我指明了正确的方向。
我在旧的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
编辑:示例 pyCMS 代码:
from PIL import Image
import pyCMS
im = Image.open(...)
im2 = pyCMS.profileToProfile(im, pyCMS.createProfile("sRGB"), pyCMS.createProfile("LAB"))
编辑: PIL fork Pillow 似乎内置了 pyCMS。
您可以使用 pyCMS ( http://www.cazabon.com/pyCMS/ ),它适用于 PIL 图像。
如果速度不是一个因素,请使用 python-colormath ( http://code.google.com/p/python-colormath/ )。
这是一个类,用于转换 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)
目前我还没有找到一个好的包来做到这一点。您必须记住,RGB 是依赖于设备的色彩空间,因此如果您没有配置文件,您将无法准确地转换为 XYZ 或 CIE Lab。
因此请注意,在您看到从 RGB 转换为 CIE Lab 而不指定颜色空间或导入颜色配置文件的许多解决方案必须仔细评估。大多数情况下,看看引擎盖下的代码,他们认为您正在处理 sRGB 颜色空间。