Как можно выполнять преобразования цвета с профилями ICC для набора произвольных значений пикселей (а не для структуры данных изображения)?

Я хотел бы преобразовать набор значений пикселей из одного профилированного цветового пространства в другое без этих значений, находящихся в файле изображения, например, например, в списке структур данных RGB/RGBA/CMYK/и т. д.

В моем распоряжении есть Python и PIL, но меня интересуют решения в соответствующих средах. если это то, что нужно.

Последний PIL имеет очень хорошую поддержку для LittleCMS, но нет возможности передать ему что-либо, кроме изображения PIL. (или устаревший объект pyCMS), чтобы он действовал.

Насколько я могу судить, инструмент командной строки icctrans, входящий в состав LittleCMS, делает что-то в этом роде, но я не могу найти по нему какой-либо нескелетной документации, а в документации он упоминается как демонстрационный инструмент.


person fish2000    schedule 30.08.2010    source источник


Ответы (2)


Чтобы использовать текущую версию 2.3 Little CMS с Python, я перевел lcms2.h в lcms2consts.py с помощью скрипта h2py.py, который входит в дистрибутив Python. Сценарий не транслирует объявления структур, но констант достаточно для базовых преобразований цвета с помощью ctypes и lcms2 в качестве динамической библиотеки.

В этом примере один цвет преобразуется из лаборатории с двойной точностью в 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)
person Janne Karila    schedule 21.02.2012
comment
Я забыл вопрос! Это фантастический пример, я нашел его весьма полезным (я перенес его на cython, чтобы сгладить кросс-платформенные гниды динамической компоновки), но h2py полностью является Розеттским камнем программирования расширений Python. Спасибо. - person fish2000; 02.03.2012

Есть два способа.

  • Хакерский способ: чтобы перепрофилировать N цветовых структур (и/или преобразовывать их между цветовыми пространствами), вы создаете изображение 1x(N+2) с PIL.Image.new(), используете yourimage.load(), чтобы получить интерфейс объекта с настройкой пикселей, и установите значения (0,0) через (0, N) на то, что у вас есть. Установите (0, N+1) на белый и (0, N+2) на черный и трансформируйте (или преобразуйте для проверки) это изображение, используя ваши любимые файлы ICC и PIL.ImageCms.ImageCmsTransform(). Бламмо: этот объект PIL теперь является вашей LUT. Считайте значения с помощью image.load() штуки, и все в порядке.

  • Настоящий ботаник: вам нужно использовать Python-colormath — отлично подходит для преобразования цветового пространства, но не для профилирования. Colormath не может читать профили ICC, так что либо а) вы можете надежно разобрать их безумный двоичный формат, либо б) просто посчитайте буквально. У этого парня, Брюса Линдблума, есть все данные в формате Excel, например, для всех матрицы, необходимые для перепрофилирования LUT. Он совершенно потрясающий. Я все еще пытаюсь «просто» передать эти данные в цветовую математику, так что да, это делает меня менее крутым, поскольку я все еще пытаюсь превратить этот «ботаник» во что-то, напоминающее производственное качество.

Ну вот. Это то, что я сделал до сих пор, чтобы ответить на вопрос об автономных преобразованиях ICC LUT в стиле коммандос. Ребята, срсли.

person fish2000    schedule 16.10.2010
comment
когда-нибудь продвигались дальше с помощью python-colormath? - person jedierikb; 16.02.2013
comment
@jedierikb На самом деле я это сделал - хотя это не позволяет выполнять общие преобразования профиля ICC, если у вас есть способ прочитать некоторую базовую информацию профиля, python-colormath покроет 90% математики. Это немного нелогичный способ, как если бы вы чувствовали, что вы все используете в специальном регистре, пока вы не поймете, что общее использование ICC само по себе является особым случаем — чаще всего ваша математика включает матрицу XYZ. преобразование в значения sRGB или из них, а также использование LUT в большинстве других случаев. Я читаю профиль с помощью класса ICCProfile с сайта dispcalgui.hoech.net. - person fish2000; 19.02.2013