¿Cuál es la mejor manera de hacer la conversión de uso de PIL/Numpy/SciPy hoy?

  • He leído esta pregunta stackoverflow.com/questions/3228361/…, y se da un enlace roto para un color.py que falta de scipy tronco.
  • Sí, he encontrado este archivo profundo en el scipy repositorio de git, pero no puedo creer que no hay una manera estándar de hacer una cosa tan simple uso de herramientas de gran alcance.
  • Y sí, yo sé acerca de code.google.com/p/python-colormath lib, y todavía no puedo entender por qué no hacer su camino en ninguna de estas tres herramientas.

3 Comentarios

  1. 52

    Desde 2010, cuando el vinculado pregunta preguntó el código correspondiente movido de scipy, aparte el kit de herramientas:
    http://scikit-image.org/

    Así que aquí está el código en realidad estaba buscando:

    from skimage import io, color
    rgb = io.imread(filename)
    lab = color.rgb2lab(rgb)

    También se debe señalar que debido a Laboratorio naturaleza srgb->laboratorio de conversión depende de un parámetro adicional: whitepoint, por ejemplo:

       • Photoshop utiliza un punto blanco llamado D50 (que es un estándar para icc)

       • OpenCV y skimage uso D65 (que es un estándar para srgb).

       • predeterminado Matlab aplicación utiliza D50 (es capaz de utilizar otros),

    Este bonito Preguntas frecuentes explica de esta manera:

    Debe utilizar D65 a menos que tenga una buena razón para utilizar algo
    los demás.

    La industria de la impresión que comúnmente se utiliza D50 y la fotografía comúnmente
    utiliza D55.

    Estos representan compromisos entre las condiciones de la cubierta
    (tungsteno) y la visión diurna.

    Puede decir que whitepoint usted está tratando mediante la conversión de RGB (0,0,255) de Laboratorio:

       • D50 daría usted (30, 68, -112)

       • D55                         (30, 73, -110)

       • D65                         (32, 79, -108)

    Los números después de ‘D’ corresponden a (internamente) se utiliza la temperatura de color de punto blanco: D50 = 5003 K (amarillento), D65 = 6504 K (azulado)

    Estoy agradecido a Alex y Romana por sus respuestas, ya que me señaló en la dirección correcta.

  2. 19

    He encontrado este código en el antiguo Adobe libro de cocina de sitio y se han adaptado para Python. No requiere de módulos de terceras partes o componentes:

    def rgb2lab ( inputColor ) :
    num = 0
    RGB = [0, 0, 0]
    for value in inputColor :
    value = float(value) / 255
    if value > 0.04045 :
    value = ( ( value + 0.055 ) / 1.055 ) ** 2.4
    else :
    value = value / 12.92
    RGB[num] = value * 100
    num = num + 1
    XYZ = [0, 0, 0,]
    X = RGB [0] * 0.4124 + RGB [1] * 0.3576 + RGB [2] * 0.1805
    Y = RGB [0] * 0.2126 + RGB [1] * 0.7152 + RGB [2] * 0.0722
    Z = RGB [0] * 0.0193 + RGB [1] * 0.1192 + RGB [2] * 0.9505
    XYZ[ 0 ] = round( X, 4 )
    XYZ[ 1 ] = round( Y, 4 )
    XYZ[ 2 ] = round( Z, 4 )
    XYZ[ 0 ] = float( XYZ[ 0 ] ) / 95.047         # ref_X =  95.047   Observer= 2°, Illuminant= D65
    XYZ[ 1 ] = float( XYZ[ 1 ] ) / 100.0          # ref_Y = 100.000
    XYZ[ 2 ] = float( XYZ[ 2 ] ) / 108.883        # ref_Z = 108.883
    num = 0
    for value in XYZ :
    if value > 0.008856 :
    value = value ** ( 0.3333333333333333 )
    else :
    value = ( 7.787 * value ) + ( 16 / 116 )
    XYZ[num] = value
    num = num + 1
    Lab = [0, 0, 0]
    L = ( 116 * XYZ[ 1 ] ) - 16
    a = 500 * ( XYZ[ 0 ] - XYZ[ 1 ] )
    b = 200 * ( XYZ[ 1 ] - XYZ[ 2 ] )
    Lab [ 0 ] = round( L, 4 )
    Lab [ 1 ] = round( a, 4 )
    Lab [ 2 ] = round( b, 4 )
    return Lab
    • Ella no contesta directamente la pregunta: necesitaba un one-liner. Pero es útil de todos modos. Gracias!
    • Aunque me gustaría hacer referencia a la original easyrgb sitio web en lugar de adobe libro de cocina.
    • El código no es muy python debo decir. Al menos yo uso la enumerate en lugar de la num variable y 1/3. en lugar de 0.3333333333333333
    • Este código aparece para hacer la corrección gamma ( ** 2.4 ). Lo que si sé que mi gamma 2.2 2.4? Es suficiente para cambiar el exponente a 2.2, o son cambios necesarios para otros rígida constantes (como la 1.055) ?
    • la gamma 2.4 se puede ver aquí es el sRGB estándar. Se une con un lineal de la conversión a los valores más bajos, y juntos se asemejan estrechamente a un 2.2 curva de gamma. Yo no cambiaría nada.
    • Gracias por trabajar fuera de esto, yo he probado un par de valores y que coincidan con los de colormine.org/convert/rgb-to-lab

  3. 7

    Editar: Muestra pyCMS código:

    from PIL import Image
    import pyCMS
    im = Image.open(...)
    im2 = pyCMS.profileToProfile(im, pyCMS.createProfile("sRGB"), pyCMS.createProfile("LAB"))

    Edición: Almohada, el PIL tenedor, parece haber pyCMS construido en.

    Puede utilizar pyCMS ( http://www.cazabon.com/pyCMS/ ), el cual funciona con PIL imágenes.

    Si la velocidad no es un factor, el uso de python-colormath (http://code.google.com/p/python-colormath/).

    • pyCMS ofertas con los perfiles ICC, espacios de color son «efectos secundarios». Yo pedí un one-liner.
    • Sí, he mencionado python-colormath en mi tercer comentario a la pregunta.
    • No, no es una matriz.
    • Anthony, sin embargo, usted está en lo correcto que no es una sola matriz, debido a que el xyz->laboratorio de transformación se define de manera diferente en diferentes rangos de xyz. Bueno, yo no creo que haya una sola línea, corto de portar la parte pertinente de colormath a numpy primero 🙂
    • La pregunta no es si no es de una sola línea (dos fueron dados en mis comentarios a la cuestión), sino porque que ninguno de los dos encontró su camino en PIL/numpy/scipy o si hay algunas alternativas mejores.
    • También no hay necesidad de ‘trasladar’ colormath a numpy, ya que utiliza numpy desde sus inicios.
    • Si se da un ejemplo de la utilización de pyCMS para esta conversión, voy a aceptar su respuesta.
    • Me gustaría eliminar la última parte relativa al PIL-la única solución, ya que es incorrecto.
    • pyCMS se ve bien, pero el uso es arriesgado — parece que no va a ser bien mantenidos.
    • Después de algunas investigaciones que he mejorado considerablemente mi respuesta y yo creo que debería ser aceptado en la actualidad. Me compensa su reputación 😉

Dejar respuesta

Please enter your comment!
Please enter your name here