xticks barplot python numpy scipy python-imaging-library color-space

python - barplot - pandas plot



Convierta una imagen RGB-> Lab con python (3)

¿Cuál es la forma preferida de hacer la conversión usando PIL / Numpy / SciPy hoy?


Desde 2010, cuando se formuló la pregunta vinculada, el código correspondiente pasó de scipy a un conjunto de herramientas separado: http://scikit-image.org/

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

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

También debe tenerse en cuenta que, debido a la naturaleza del Lab srgb-> la conversión de laboratorio depende de un parámetro adicional: punto blanco , por ejemplo:
Photoshop usa un punto blanco llamado D50 (que es un estándar para icc)
OpenCV y skimage usan D65 (que es un estándar para srgb).
• la implementación predeterminada de Matlab usa D50 (es capaz de usar others ),

Esta bonita FAQ explica de esta manera:

Deberías usar D65 a menos que tengas una buena razón para usar otra cosa.
La industria de la impresión comúnmente usa D50 y la fotografía comúnmente usa D55.
Estos representan compromisos entre las condiciones de visión interior (tungsteno) y luz natural.

Puede decir con qué punto blanco está tratando al convertir RGB (0,0,255) a Lab:
• D50 te daría (30, 68, -112)
• D55 (30, 73, -110)
• D65 (32, 79, -108)

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

Agradezco a Alex y a Roman sus respuestas porque me orientaron en la dirección correcta.


Editar: código de muestra pyCMS:

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

Editar: Almohada, la horquilla PIL, parece tener incorporado pyCMS.

Puede usar pyCMS ( http://www.cazabon.com/pyCMS/ ) que funciona con imágenes PIL.

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


Encontré este código en el antiguo sitio Adobe Cookbook y me he adaptado para Python. No requiere ningún módulo o componente de terceros:

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