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

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

У меня есть Python и PIL , но я заинтересован в решениях для смежных сред, если это то, что нужно.

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

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

Ответы [ 2 ]

7 голосов
/ 21 февраля 2012

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

В этом примере показано преобразование одного цвета из 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)
5 голосов
/ 16 октября 2010

Есть два пути.

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

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

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

...