Programar es el estado de gracia


Publicado el 6 de junio de 2025.
Etiquetas:          

[Que los ingenieros y los cientificos del color sepan disculparme, si es que he incurrido en alguna tontería: ya me lo señalaréis]


El otro día, Rony Flatcher, profesor de la WU Wien (la Universidad de Economía y Negocios de Viena, situada en el Prater de esa magnífica capital), que además es uno de los desarrolladores principales del lenguajede programación ooRexx, me mandó un pequeño programa que había escrito. El programa estaba relacionado con un parser AST que he desarrollado para ese lenguaje, y con el correspondiente highlighter (me niego a escribir "resaltador de sintáxis") que se deriva de él, casi necesariamente (los podéis encontrar aquí, con documentación abundante: los acabo de presentar en el Symposium Internacional anual, que este año era en Viena). Lo que Rony me mandaba era una utilidad que realizaba diversas conversiones entre colores HTML, con especial énfasis en los colores definidos por el W3C, en el CSS Color Module Level 3.

El programa que Rony que me mandó era muy interesante, pero yo no tenía demasiado claro para qué lo había escrito. Se lo pregunté; me contestó que su intención, entre otras cosas, era facilitar la substitución de colores CSS sin nombre por otros con nombre, y viceversa.

Quizás haga falta que explique de qué estoy hablando, para que los que no estáis enterados del tema podáis entenderlo.

Cuando vemos colores en los textos o en los fondos de una página web, esos colores tienen que estar definidos en algún sitio. Las definiciones se hacen mediante HTML y CSS, que utilizan el espacio RGB con una profundidad de 8 bits. Esto quiere decir que los colores están formados por una combinación de tres colores primarios, $R$ (de «Red», rojo), $G$ (de «Green», verde) y $B$ (de «Blue», azul), y que cada uno de esos primarios puede tomar un valor de ocho bits, es decir, un entero entre $0$ y $255$. Como estamos hablando de una síntesis aditiva, $\langle 0,0,0 \rangle$ es el negro absoluto, y $\langle 255,255,255 \rangle$ es el blanco puro; del mismo modo, $\langle 255,255,0 \rangle$ es amarillo puro, y así sucesivamente. El espacio RGB de 8 bits contiene $256^3 = (2^8)^3 = 2^{24} = 16.777.216$ colores: es un espacio euclídeo, discreto y acotado.

Algunos pocos colores tienen, además, un nombre: se trata, precisamente, de aquellos listados en el mencionado CSS Color Module Level 3. Ese módulo define $142$ colores, mediante la asignación de valores a $147$ nombres (algunos nombres son sinónimos de otros, y por eso hay más nombres que colores). Son ejemplos de estos colores: «Red», «Purple» o «Teal»; pero también los hay más complejos, como «DarkMagenta» o «NavajoWhite».

Substituir un color sin nombre por otro con nombre no es, en general, posible, sin perder información. Lo que sí que es posible es buscar colores con nombre que se parezcan, es decir, que estén «cerca» de un color dado. Ahora bien, ¿qué quiere decir, realmente, que dos colores están cerca?

Bueno, podemos tomar el espacio de color RGB y pensarlo como si fuese el espacio normal, tridimensional, en el que vivimos. Tendríamos, entonces, un cubo de lado $256$, numerado de $0$ a $255$, y con tres ejes, llamados $R$, $G$ y $B$ en vez de $X$, $Y$ y $Z$. La distancia entre dos puntos cualesquiera $\langle r_1, g_1, b_1 \rangle$ y $\langle r_2, g_2, b_2 \rangle$ sería, simplemente,

\[ \sqrt{ (r_1-r_2)^2 + (g_1-g_2)^2 + (b_1-b_2)^2 }, \]

es decir, la distancia euclídea habitual.

Esto puede hacerse, claro que sí: dado un punto cualquiera $\langle r,g,b \rangle$ y un diámetro $d$, podemos examinar los $142$ colores definidos por el Módulo 3 de CSS y ver cuáles están a una distancia $\delta \le d$ de $\langle r,g,b \rangle$ , es decir, cuáles están dentro de la esfera de radio $d$ centrada en $\langle r,g,b \rangle$ .

Es muy fácil programar eso. ¿Hay algún problema? Pues sí: resulta que nadie nos garantiza que la distancia euclídea entre dos colores en el espacio RGB tenga ninguna correspondencia con nuestras percepciones. ¿Qué quiere decir esto? Que en algunas regiones del cubo RGB una distancia grande puede separar dos puntos que nos parecen, perceptualmente, casi idénticos, y que en otras regiones puede suceder lo contrario: dos puntos que están separados por una distancia pequeña pueden aparecer, a nuestra percepción, como bastante distintos. Entonces, si la distancia no corresponde a lo que percibimos, el hecho de saber que nuestro color está a una distancia $x$ de un color con nombre pierde significatividad.

Una manera de intentar solucionar este problema es utilizar un espacio de color diferente (es decir, un sistema de coordenadas biyectable con el espacio RGB, pero que tenga propiedades distintas). La Comisión Internacional de la Iluminación (CIE, por la Commission Internationale de l'Éclairage), definió un espacio de color, llamado $L^\star a^\star b^\star$, o $Lab$, o CIELAB. Pasar de RGB a CIELAB es muy sencillo, hay que aplicar algunas fórmulas, multiplicar una matriz por un vector, y usar logaritmos y exponenciales (si no se dispone de un lenguaje que permita la potenciación con exponentes no enteros).

Una vez hemos transformado nuestros colores RGB para que sean CIELAB, podemos utilizar una vez más la distancia euclídea. Pero, ahora, en vez de calcularla a partir $R$, $G$ y $B$, la podremos calcular a partir de $L$, $a$ y $b$, que son los nombres de las coordenadas en CIELAB (por eso el espacio se llama $Lab$). Esa distancia pretende ser mucho más cercana a la fisiología de nuestra percepción; en realidad, con el tiempo se ha ido averiguando que tampoco es demasiado perfecta, pero, sin ninguna duda, es mucho mejor que RGB. Ahora generaremos esferas en el espacio Lab, en vez de en el espacio RGB, e iremos listando los colores con nombre que caigan dentro de esas esferas. El resultado tendría que ser una lista de colores con nombre tales que, si los substituimos por los colores anónimos de los que hemos partido, nos produzcan la máxima sensación de similitud — dependiendo del radio de la esfera, claro: una distancia de aproximadamente $1$ se supone que es imperceptible, y la mínima distancia perceptible oscila, según las diversas explicaciones, entre $2.5$ y $3$.

La generación del espacio de color Lab depende, además, de un iluminante, una luz teórica que ilumina toda la escena. El iluminante estándar tiene una temperatura de color de $6500$ K, y por eso se llama $D65$. ¿Qué es la temperatura de color? La radiación de un cuerpo negro. Si tomo un pedazo de hierro y lo caliento un poco, puedo hacerme un huevo frito. Si lo caliento mucho, se pone «al rojo»: aquí tenemos una temperatura de color. Si lo caliento todavía más, va pasando por toda la gama, hasta el azul que representan los $6500$ K, y más allá: $6500$ K es la temperatura de la luz que hay en la calle un día nublado. Los que somos aficionados a la fotografía y recordamos los tiempos en los que no siempre podíamos disponer de fotómetros, sabemos que, en los días nublados, hay que incrementar la velocidad, o cerrar un poco más el diafragma.

Bueno, ya está. Ayer estudié todo esto. Tiene que ver con la denominada «ciencia del color», que no sabía ni que existía antes de sumergirme en el tema. Estudié el asunto, hice un programa en Rexx para transformar RGB en CIELAB, escribí otra rutina para calcular $\Delta E^\star$, que es el nombre que tiene la distancia en el espacio de color CIELAB, y se lo mandé todo a Rony.

En unas pocas horas (porque, además, no creáis, tenía trabajo de otro tipo, y lo hice), reuní: programación (en ooRexx); matemáticas (espacios euclídeos; distancia; producto de matrices por vectores; exponenciales y logaritmos; etc.); física (en la que se basa, en última instancia, todo el análisis de los espacios de color); ingeniería (son los ingenieros y los fabricantes de monitores, televisiones, etcétera, los que estudian a fondo todo esto); institucionalidad (la Comisión Internacional de la Iluminación); ciencias (la ciencia del color); fisiología (la fisiología de nuestra percepción); fotografía (fotómetros, velocidades de obturación, diafragmas, sensibilidades), ...

Y todo, porque un colega y amigo me mandó un programa, y me entraron ganas de contestarle, y también una gran curiosidad.

El conocimiento no tiene fronteras. Si se las ponemos, no podremos entender nada. Y, además, empezaremos a aburrirnos mortalmente.

Los que enseñan tienen el deber de conocer todas las relaciones que puedan entre lo que están enseñando y todo lo demás. De otro modo, pondrán fronteras a lo que no las tiene, y, siendo aburridos, generarán desafección y, en última instancia, más seres aburridos. Así se llenará el planeta de imbéciles, de funcionarios, y de todo tipo de otros seres desubstanciados.

Al obligar a los docentes a «ver todo el temario», estamos estigmatizando el divagar, el perderse, el rumiar: el viajar por el conocimiento, el aprender, el gozar. El detenerse, morosamente, en cada pregunta, supuestamente «tonta»: suelen ser, precisamente, las preguntas «filosóficas», que habitualmente se desprecian. El extraviarse, sin mapa ni rumbo, para encontrar otras cosas, otras relaciones: cosas y relaciones que se encuentran sin buscarlas, uno se topa con ellas, pero no tenía intención alguna de hallarlas.

El aprender gozando, el gozar de aprender. Aquello que significa, realmente, el conocimiento.

Así nos va.

Y eso, que, para mí, la programación es lo más parecido que existe al estado de gracia. Pero, claro, hay que hacerlo en serio: sin jefes, sin empleados, sin un proyecto definido de antemano; sin deadlines, sin reuniones. Solo gozar, sin propósito, y confiar en que, al final, algo terminarás encontrando.

De esa confianza y de lo que me va otorgando traigo hoy, aquí, este testimonio.

Un abrazo,


Josep Maria


Postdata (20250615): Después he seguido leyendo, claro está: queriendo saber, investigando. Me he enterado de que la especificación de nivel 3 de los colores CSS está muy, pero que muy antigua: ahora la más reciente es la de nivel 5. También he aprendido que, realmente, el espacio CIELAB se fue viendo, a medida que pasaba el tiempo, que no cumplía las ambiciones de ser perceptualmente isotrópico. La función $\Delta{}E$, que tenía que ser euclidiana, se fue complejizando de un modo increíble, para poder seguir cumpliendo con las cometidos que se le habían asignado.

Bueno: pues resulta que, en 2020, un señor llamado Björn Ottoson se inventó, él solito, un nuevo espacio de color, que no tenía ya esos defectos. Lo llamó «OKLab», queriendo expresar que se trataba de un espacio LAB que era «OK». Aquí está la documentación. Ya paro: este es un tema científico y, por tanto, es algo que nunca se termina. Y, además, como se habrá deducido si, además de leer el artículo, se lo ha entendido, no he intentado hacer la teoría definitiva de absolutamente nada: al contrario, solo he procurado, como ya lo he dicho, dar el testimonio de un cierto recorrido.


Copyright © 2008-2025, Josep Maria Blasco. Esta web funciona con ooRexx y con RexxHttp.