5

Me gustaría convertir un conjunto de valores de píxeles de un espacio de color perfilado a otro, sin que estos valores residan en un archivo de imagen, como (digamos) una lista de estructuras de datos RGB/RGBA/CMYK/etc.¿Cómo se pueden realizar transformaciones de color con perfiles ICC en un conjunto de valores de píxeles arbitrarios (no en una estructura de datos de imagen)?

Tengo Python y PIL a mi disposición, pero estoy interesado en soluciones en entornos relacionados si eso es lo que se necesita.

La última PIL tiene un soporte muy bueno para LittleCMS - pero no hay forma de entregarle otra cosa que una imagen PIL (o un objeto pyCMS heredado) para que actúe.

Por lo que yo puedo determinar, la herramienta de línea de comandos icctrans que se incluye con LittleCMS hace algo de este tipo, pero me parece que no puede encontrar ninguna documentación no esquelético en él, y la documentación se refiere a ella como una herramienta de demostración.

Respuesta

6

Para utilizar la versión actual 2.3 del Little CMS con Python, traduje lcms2.h-lcms2consts.py con el guión h2py.py que viene en la distribución de Python. El script no traduce declaraciones struct, pero las constantes son suficientes para realizar transformaciones de color básicas con ctypes y lcms2 como una biblioteca dinámica.

Este ejemplo transforma un solo color de doble precisión Lab a 8-bit sRGB usando perfiles incorporados. Use cmsOpenProfileFromFile(filename, 'r') para buscar archivos.

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) 
+0

¡Había olvidado la pregunta! Es un ejemplo fantástico, lo encontré bastante útil (lo porté a Cython para suavizar las nits de vinculación de plataforma multiplataforma) pero 'h2py' es totalmente la piedra Rosetta de la programación de extensión de Python. Gracias. – fish2000

+0

Esto podría ser útil: http://www.cazabon.com/pyCMS/ – jedierikb

5

Hay dos formas.

  • La forma Hack: Para cambiar el perfil de estructuras de color N (y/o transformarlos entre espacios de color) se crea un 1x (N + 2) imagen con PIL.Image.new(), utilice yourimage.load() para obtener una interfaz de objeto el establecimiento de píxeles cosa, y establecer valores (0,0) a través de (0, N) a lo que sea que hayas obtenido. Establezca (0, N + 1) en blanco y (0, N + 2) en negro, y transforme (o corrija) esa imagen usando sus archivos ICC favoritos y PIL.ImageCms.ImageCmsTransform(). Blammo: ese objeto PIL es ahora tu LUT. Lee los valores con la cosa image.load() y estás bien.

  • El camino verdadero-nerd: Es necesario utilizar Python-colormath - que es ideal para las transformaciones colorspace pero no perfilado. Colormath no puede leer los perfiles ICC, por lo que a) se puede analizar su formato binario loco de manera confiable, ob) just do the math, literalmente. Este tipo, Bruce Lindbloom, tiene todos los datos disponibles en formato excel para, por ejemplo, all of the matricies, necesita volver a perfilar sus LUT. Él es totalmente increíble. Todavía estoy tratando de 'solo' alimentar estos datos en color, así que sí, eso me hace menos sorprendente ya que todavía estoy tratando de poner este 'estilo nerd' en algo parecido a la calidad de producción.

Ahi lo tienes. Eso es lo que hice hasta ahora para responder la cuestión de las transformaciones ICC LUT independientes y de estilo comando. U chicos, srsly.

+0

¿Alguna cosa más con python-colormath? – jedierikb

+0

@jedierikb De hecho, si bien no permite las transformaciones de perfil ICC en general, si tiene una forma de leer parte de la información básica del perfil, 'python-colormath' cubrirá el 90% de las operaciones matemáticas.Es una forma contraintuitiva de ir como si se sintiera como si fuera especial, cubriendo todo, hasta que se da cuenta de que el uso "general" de ICC es más o menos un caso especial por sí mismo: la mayoría de las veces su matemática involucra un La matriz XYZ se transforma a valores sRGB o desde ellos, y usa una LUT en la mayoría de los otros casos. Estoy leyendo el perfil usando la clase ICCProfile de http://dispcalgui.hoech.net – fish2000

Cuestiones relacionadas