Comment peut-on effectuer des transformations de couleurs avec les profils ICC sur un ensemble de valeurs de pixels arbitraires (et non sur une structure de données d'image)?

StackOverflow https://stackoverflow.com/questions/3597528

Question

je voudrais convertir un ensemble de valeurs de pixel d'un espace colorimétrique profilé à l'autre, sans que ces valeurs résidant dans un fichier d'image, tels que (par exemple) une liste de RVB / RVBA / CMYK / etc structures de données.

J'ai Python et PIL à ma disposition, mais je suis intéressé par des solutions dans des environnements connexes si c'est ce qu'il faut.

Le dernier PIL a très agréable soutien LittleCMS - mais aucun moyen de le remettre autre chose que une image de PIL (ou un objet de pyCMS hérités) pour qu'il puisse agir.

Pour autant que je peux assurer, l'outil de ligne de commande icctrans qui est inclus avec LittleCMS fait quelque chose de ce genre, mais je ne peux pas sembler trouver une documentation non-squelettique sur elle, et la documentation se réfère à elle comme outil de démonstration.

Était-ce utile?

La solution

Pour utiliser la version 2.3 actuelle Little CMS avec Python, je traduis lcms2.h à lcms2consts.py avec le script h2py.py qui vient dans la distribution Python. Le script ne se traduit pas des déclarations struct, mais les constantes sont suffisantes pour faire des transformations de couleur de base avec ctypes et lcms2 comme une bibliothèque dynamique.

Cet exemple transforme une seule couleur de double précision de laboratoire à 8 bits sRGB en utilisant des profils intégrés. Utilisez cmsOpenProfileFromFile(filename, 'r') à la place des fichiers.

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)

Autres conseils

Il y a deux façons.

  • La façon bidouille: Pour reprofiler N structures de couleur (et / ou les transformer entre colorimétriques) vous créez une image 1x (N + 2) avec PIL.Image.new(), utilisez yourimage.load() pour obtenir un pixel -mise chose d'interface objet, et des valeurs de consigne (0,0) à (0, N) à tout ce que vous avez obtenu. Set (0, N + 1) au blanc et (0, N + 2) au noir, et transformer (ou preuve de transformation) cette image en utilisant vos fichiers ICC préférés et PIL.ImageCms.ImageCmsTransform(). Blammo: cet objet PIL est maintenant votre LUT. Lire les valeurs sur la thingy image.load() et vous êtes bon.

  • La façon vraie nerd: Vous devez utiliser juste faire les mathématiques, littéralement. Ce type Bruce Lindbloom a toutes les données disponibles en format Excel pour, comme, tous les matricies vous devez reprofiler vos LUT. Il est tout à fait impressionnant. Je suis toujours en train de « juste » nourrir ces données dans CalCouleurs, alors oui, ça me fait moins impressionnant que j'essaie toujours d'obtenir ce « chemin nerd » en quelque chose qui ressemble à de la qualité de la production.

Il vous allez. Voilà ce que je l'ai fait jusqu'à présent pour répondre à la question de la pose libre, de style commando ICC transforme LUT. U gars, srsly.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top