如何使用ICC配置文件对一组任意像素值(而不是图像数据结构)执行颜色转换?

7
我想将一组像素值从一个已经校准的颜色空间转换到另一个颜色空间,而不需要这些值存在于图像文件中,例如(比如)RGB/RGBA/CMYK等数据结构的列表。

我拥有Python和PIL,但如果需要的话,我也对相关环境的解决方案感兴趣。

最新的PIL具有非常好的LittleCMS支持,但是除了PIL图像(或遗留的pyCMS对象)之外,没有办法将其交给它来处理。

据我所知,随LittleCMS提供的命令行工具icctrans执行了这样的操作,但我似乎找不到任何非骨架文档,并且文档将其称为演示工具。

2个回答

7
为了在Python中使用当前2.3版本的Little CMS,我使用Python分发中带有的脚本把lcms2.h转换成lcms2consts.py。该脚本不会翻译结构声明,但常量足以使用ctypeslcms2作为动态库执行基本的颜色转换。

以下示例使用内置配置文件将单个颜色从双精度Lab转换为8位sRGB。对于文件,请改用cmsOpenProfileFromFile(filename, 'r')

import ctypes
from ctypes import byref
from lcms2consts import *

lcms = ctypes.windll.lcms2

inprof = lcms.cmsCreateLab4Profile(0)
outprof = lcms.cmsCreate_sRGBProfile()
xform = lcms.cmsCreateTransform(inprof, TYPE_Lab_DBL, 
    outprof, TYPE_RGB_8,
    INTENT_PERCEPTUAL, 0)
lcms.cmsCloseProfile(inprof)
lcms.cmsCloseProfile(outprof)

DblTriplet = ctypes.c_double * 3
ByteTriplet = ctypes.c_ubyte * 3
inbuf = DblTriplet(60.1,20.2,0.5)
outbuf = ByteTriplet()
lcms.cmsDoTransform(xform, byref(inbuf), byref(outbuf), 1)
print list(outbuf)

lcms.cmsDeleteTransform(xform)

我忘记了问题!那是一个很棒的例子,我觉得它非常有用(我将其移植到Cython以平滑跨平台动态链接),但h2py绝对是Python扩展编程的罗塞塔石。谢谢。 - fish2000

6

有两种方法。

  • 一种取巧的方法:要重新调整 N 种颜色结构(和/或在颜色空间之间转换它们),您可以使用 PIL.Image.new() 创建一个 1x(N+2) 图像,使用 yourimage.load() 获取像素设置对象接口,并将值 (0,0) 到 (0,N) 设置为您得到的任何值。将 (0,N+1) 设置为白色,将 (0,N+2) 设置为黑色,并使用您喜欢的 ICC 文件和 PIL.ImageCms.ImageCmsTransform() 转换(或证明转换)该图像。这样,那个 PIL 对象现在就是您的 LUT。使用 image.load() 读取出值即可。

  • 真正的极客方式:您需要使用 Python-colormath -- 它非常适用于颜色空间转换但不适用于配置文件。Colormath 无法读取 ICC 配置文件,因此要么 a) 您要以可靠的方式解析它们的疯狂二进制格式,要么 b) 只需进行数学计算。这位 Bruce Lindbloom 在 Excel 格式中提供了所有数据,例如您需要重新调整 LUT 的 所有矩阵。他太棒了。我仍在尝试“只需”将这些数据馈入 colormath,所以是的,这使我不太棒,因为我仍在尝试将这种“极客方式”转化为类似于生产质量的东西。

这就是我迄今为止为回答独立的、突击式ICC LUT转换问题所做的。你们,认真点。


你在使用python-colormath方面有进展吗? - jedierikb
@jedierikb 我实际上已经这样做了 - 虽然它不允许进行一般的ICC配置文件转换,但如果您有一种读取一些基本配置文件信息的方法,python-colormath 将涵盖90%的数学。这是一种有点违反直觉的方式,因为感觉像是你在特殊处理所有事情,直到你意识到“一般”ICC使用实际上是一个特例 - 大多数情况下,您的数学涉及XYZ矩阵变换到或从sRGB值,并在大多数其他情况下使用LUT。我正在使用来自http://dispcalgui.hoech.net的ICCProfile类读取配置文件。 - fish2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接