¿Cómo puedo convertir RGB a CMYK y viceversa en python?

Si tuviera un decimal RGB como 255, 165, 0 , ¿qué podría hacer para convertir esto a CMYK?

Por ejemplo:

 >>> red, green, blue = 255, 165, 0 >>> rgb_to_cmyk(red, green, blue) (0, 35, 100, 0) 

Aquí hay un puerto Python de una implementación de Javascript .

 cmyk_scale = 100 def rgb_to_cmyk(r,g,b): if (r == 0) and (g == 0) and (b == 0): # black return 0, 0, 0, cmyk_scale # rgb [0,255] -> cmy [0,1] c = 1 - r / 255. m = 1 - g / 255. y = 1 - b / 255. # extract out k [0,1] min_cmy = min(c, m, y) c = (c - min_cmy) / (1 - min_cmy) m = (m - min_cmy) / (1 - min_cmy) y = (y - min_cmy) / (1 - min_cmy) k = min_cmy # rescale to the range [0,cmyk_scale] return c*cmyk_scale, m*cmyk_scale, y*cmyk_scale, k*cmyk_scale 

Siguiendo con la implementación del Sr. Fooz.

Hay dos implementaciones posibles de CMYK. Hay una donde las proporciones son con respecto al espacio en blanco (que se usa, por ejemplo, en GIMP) y que es la implementada por el Sr. Fooz, pero también hay otra implementación de CMYK (que se utiliza, por ejemplo, por LibreOffice) que da Las proporciones de color con respecto al espacio de color total. Y si desea usar CMYK para modelar la mezcla de pinturas o tintas, la segunda podría ser mejor porque los colores solo se pueden agregar linealmente usando pesos para cada color (0.5 para la mitad de la mezcla).

Aquí está la segunda versión de CMYK con conversión inversa:

 rgb_scale = 255 cmyk_scale = 100 def rgb_to_cmyk(r,g,b): if (r == 0) and (g == 0) and (b == 0): # black return 0, 0, 0, cmyk_scale # rgb [0,255] -> cmy [0,1] c = 1 - r / float(rgb_scale) m = 1 - g / float(rgb_scale) y = 1 - b / float(rgb_scale) # extract out k [0,1] min_cmy = min(c, m, y) c = (c - min_cmy) m = (m - min_cmy) y = (y - min_cmy) k = min_cmy # rescale to the range [0,cmyk_scale] return c*cmyk_scale, m*cmyk_scale, y*cmyk_scale, k*cmyk_scale def cmyk_to_rgb(c,m,y,k): """ """ r = rgb_scale*(1.0-(c+k)/float(cmyk_scale)) g = rgb_scale*(1.0-(m+k)/float(cmyk_scale)) b = rgb_scale*(1.0-(y+k)/float(cmyk_scale)) return r,g,b 

Para que esta conversión sea útil, necesita un sistema de administración de color, con perfiles que describan el sistema RGB y el sistema CMYK que se está convirtiendo.

http://en.wikipedia.org/wiki/CMYK_color_model#Conversion

Aquí hay una discusión de cómo resolver este problema usando los perfiles ICC:

¿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)?

Aquí hay un enlace a pyCMS, que usa perfiles de color ICC para hacer la conversión:

http://www.cazabon.com/pyCMS/

Pero convertir la imagen completa RGB2CMYK o viceversa es tan simple como

 from PIL import Image image = Image.open(path_to_image) if image.mode == 'CMYK': rgb_image = image.convert('RGB') if image.mode == 'RGB': cmyk_image = image.convert('CMYK') 

Intenté usar el cálculo posterior provisto por bisounours_tronconneuse y falló para CMYK (96 63 0 12). El resultado debe ser: como este

Al convertir w3schools javascript ( codifique aquí ) en python, el siguiente código ahora devuelve resultados correctos:

 def cmykToRgb(c, m, y, k) : c=float(c)/100.0 m=float(m)/100.0 y=float(y)/100.0 k=float(k)/100.0 r = round(255.0 - ((min(1.0, c * (1.0 - k) + k)) * 255.0)) g = round(255.0 - ((min(1.0, m * (1.0 - k) + k)) * 255.0)) b = round(255.0 - ((min(1.0, y * (1.0 - k) + k)) * 255.0)) return (r,g,b) 

La respuesta aceptada proporcionó una buena manera de pasar de RGB a CMYK, pero el título de la pregunta también incluye

viceversa

Aquí está mi contribución para la conversión de CMYK a RGB:

 def cmyk_to_rgb(c, m, y , k, cmyk_scale, rgb_scale = 255): r = rgb_scale*(1.0-c/float(cmyk_scale))*(1.0-k/float(cmyk_scale)) g = rgb_scale*(1.0-m/float(cmyk_scale))*(1.0-k/float(cmyk_scale)) b = rgb_scale*(1.0-y/float(cmyk_scale))*(1.0-k/float(cmyk_scale)) return r,g,b 

A diferencia de la respuesta de patapouf_ai, esta función no produce valores rgb negativos.

El uso de una conversión CMYK como la que se da en la respuesta aceptada (en el momento de escribir esto) no es exacto para los propósitos más prácticos.

CMYK se basa en cómo cuatro tipos de tinta forman colores en papel; sin embargo, la mezcla de colores de las tintas es considerablemente compleja, más que la mezcla de “luces” utilizadas para formar colores en el modelo de color RGB.

Como CMYK es útil, sobre todo, al imprimir imágenes, cualquier conversión a CMYK debe tener en cuenta las condiciones de impresión , incluida la impresora y el papel que se utiliza para imprimir. Una conversión precisa a CMYK para fines de impresión no es trivial y requiere calibrar la impresora y medir parches CMYK en una hoja de prueba, entre otras cosas.

No hay ningún significado para los colores CMYK que es tan ubicuo como sRGB para RGB, como se ilustra en la página de datos de caracterización CMYK del International Color Consortium.

Véase también mi artículo de color sobre este tema.