ImageJ: Canales y colores#
Show code cell content
%load_ext autoreload
%autoreload 2
# Default imports
import sys
sys.path.append('../../../')
from helpers import *
from matplotlib import pyplot as plt
from myst_nb import glue
import numpy as np
from scipy import ndimage
Introducción#
ImageJ tiene un buen soporte tanto para imágenes RGB como multicanal, pero el comportamiento no siempre es obvio. Esta sección explica las ideas, incluyendo las áreas comunes de confusión.
RGB vs. Multicanal#
ImageJ trata RGB como un tipo de imagen especial, aunque sigue siendo 8-bit unsigned integer. Hay varias maneras de reconocer que una imagen tiene el tipo “RGB”:
El texto RGB aparece en la parte superior de la ventana de la imagen
{menuselection} Se selecciona `Image –> Type –> RGB Color
Al mover el cursor sobre la imagen, se muestran tres valores en la barra de estado (por ejemplo, valor=127,127,127) en lugar de uno.
Las imágenes multicanal que no son RGB se reconocen porque tienen un deslizador extra en la parte inferior, con una pequeña etiqueta C, que se utiliza para cambiar el canal «activo». El será , o .
Show code cell content
fig = create_figure(figsize=(8, 4))
show_image('images/neuron-composite.png', pos=121)
show_image('images/neuron-rgb.png', pos=122)
glue_fig('fig_color_neuron', fig)
La distinción es realmente importante cuando se trata de mediciones e histogramas, porque el comportamiento entre las imágenes RGB y multicanal es sutilmente diferente:
Imágenes multicanal:
utiliza sólo el canal activo, basándose en el deslizador {guilabel}C
utiliza sólo el canal activo o todos los canales, después de pedir al usuario que elija
se puede utilizar para ajustar el brillo y el contraste del canal activo.
Es posible cambiar las LUTs independientemente para cada canal
**Imágenes RGB
convierte la imagen para que tenga un único canal de 8 bits antes de realizar las mediciones.
RGB para ver también histogramas separados para los canales rojo, verde y azul.
crea un histograma después de convertir la imagen como arriba, pero también proporciona un botónsólo se puede utilizar para ajustar el brillo y el contraste de todos los canales simultáneamente.
No es posible cambiar las LUTs por canal.
Cuando se trata de medir una imagen RGB, la enigmática afirmación anterior de que ImageJ «convierte la imagen» se explica (con más detalle del que quizá desees) al final.
Explora varias de las imágenes en
e identifica cuáles son tratadas por ImageJ como RGB, cuáles como multicanal y cuáles tienen un solo canal. Sólo hay una respuesta correcta por imagen.Nota 1: Aquí, “RGB” significa que ImageJ trata la imagen como si tuviera el tipo de imagen especial “RGB”. Es posible que una imagen multicanal tenga tres canales con LUTs rojo, verde y azul, pero ImageJ no la considera RGB. Por lo tanto, debe utilizar las reglas indicadas anteriormente para distinguir las imágenes RGB de las multicanal.
Nota 2: En el momento de escribir esto, las imágenes de ejemplo no me funcionan correctamente en Fiji – pero sí en ImageJ. Esperemos que el error en Fiji se corrija antes de que leas esto.
Image |
RGB |
Multichannel |
Single channel |
---|---|---|---|
? |
? |
? |
|
? |
? |
? |
|
? |
? |
? |
|
? |
? |
? |
|
? |
? |
? |
|
? |
? |
? |
Image |
RGB |
Multichannel |
Single channel |
---|---|---|---|
X |
|||
X |
|||
X |
|||
X |
|||
X |
|||
X |
Hay varias imágenes raras:
{menuselection}”HeLa Cells (48-bit RGB)` no se trata como si tuviera el tipo RGB… ¡y ImageJ tampoco tiene un tipo “48-bit”! Aquí, RGB de 48 bits significa que en realidad tenemos tres canales de 16 bits con LUTs rojo, verde y azul. Para ImageJ, eso no es realmente una imagen RGB, es una imagen multicanal. No esperes demasiada consistencia en la nomenclatura: ¡comprueba siempre los tipos!
{menuselection}”Fly Brain” tiene un deslizador, pero no tiene una etiqueta C. Esto se debe a que el deslizador no es para canales, sino para z-cortes. Nos encontraremos con z-cortes en el próximo capítulo.
{menuselection}”Image with Overlay” parece colorida, pero todos los colores provienen de la superposición overlay, no de la imagen RGB. Hay que admitir que el nombre ayuda en este caso.
Trabajar con canales#
Hay varios comandos útiles para trabajar con canales de color en
. Algunos de ellos, como y son bastante intuitivos, y funcionan tanto para imágenes RGB como multicanal.Uno de los comandos más útiles que requiere explicación es
Shift+Z. Si ejecutas el comando para una imagen RGB e intentas hacer algo, ImageJ te preguntaráSi aceptas, la imagen RGB se convertirá en una imagen multicanal.
La pregunta puede ser un poco confusa porque «compuesta» y «multicanal» no significan exactamente lo mismo, aunque a veces se utilicen indistintamente en ImageJ. Para ser más precisos, una «imagen compuesta» en este contexto es una imagen multicanal que se muestra utilizando un modo de visualización concreto.
ImageJ tiene tres modos principales para mostrar imágenes multicanal, accesibles desde el menú desplegable del diálogo Channels Tool:
Composite – Fusiona algunos o todos los canales para mostrarlos juntos. Actualmente, funciona con hasta 7 u 8 canales (dependiendo de la versión del software; recientemente se ha añadido uno más). Los canales individuales pueden activarse y desactivarse.
Color – Visualiza sólo el canal «activo», utilizando su LUT de color original. Puede cambiar de canal con el control deslizante situado debajo de la imagen.
Grayscale – Similar a Color, excepto que siempre utiliza una LUT de escala de grises.
Siempre que un canal esté activo, la LUT puede cambiarse usando las opciones del diálogo Channels Tool – o el submenú
como de costumbre. De forma similar, funciona en el canal activo para actualizar la LUT.Show code cell content
fig = create_figure(figsize=(8, 4))
show_image('images/composite_all.jpg', title='Composite image', pos=141)
show_image('images/composite_red.jpg', title='Red channel', pos=142)
show_image('images/composite_green.jpg', title='Green channel', pos=143)
show_image('images/composite_blue.jpg', title='Blue channel', pos=144)
glue_fig('fig_color_composite', fig)
La forma en que funciona Composite consiste en crear una imagen RGB para cada canal basándose en su LUT, y en sumar los valores de rojo, verde y azul para obtener el color de output final (recortando a 255 si es necesario).
Esta no es la única forma de generar una imagen compuesta, y no funciona bien con todas las LUTs – en particular las LUTs que asignan valores bajos de píxeles a colores brillantes o blanco.
Por lo tanto, desde ImageJ 1.53o se añadieron algunos modos de composición adicionales a image.sc. En el momento de escribir estas líneas, las modalidades disponibles son:
, y se perfeccionaron en las siguientes versiones después de una larga (y ocasionalmente irritable) discusión enComposite Max – Similar a Composite, excepto que utiliza el máximo de los valores rojo, verde y azul de todos los canales (no la suma).
Composite Min – Similar a Composite Max, excepto que utiliza el mínimo de los valores rojo, verde y azul de todos los canales (no el máximo).
Composite Invert – Similar a Composite, excepto que resta los valores LUT rojo, verde y azul en lugar de sumarlos.
Tanto Composite Min como Composite Invert son útiles para LUTs con fondos claros, por lo tanto si seleccionas una de estas opciones, ImageJ puede voltear una LUT para que tenga un fondo claro si es necesario.
Show code cell content
fig = create_figure(figsize=(8, 4))
show_image('images/composite_neuron_default.jpg', title='Composite', pos=141)
show_image('images/composite_neuron_max.jpg', title='Composite Max', pos=142)
show_image('images/composite_neuron_min.jpg', title='Composite Min', pos=143)
show_image('images/composite_neuron_invert.jpg', title='Composite Invert', pos=144)
glue_fig('fig_color_composite_new', fig)
¡Cuidado con los compuestos!
Cualquier nuevo modo de visualización puede causar confusión o dar lugar a exageraciones. Aunque los nuevos modos compuestos pueden ser útiles, aconsejo precaución.
El modo original Composite está realmente bien establecido, y es el predeterminado. Si utilizas alguno de los «nuevos» modos compuestos en una figura para tu publicación, deberás especificar claramente cuál.
Elegir los colores de los canales
Cambiando las LUT, puedes asignar cualquier color que desees a los canales. Aunque las imágenes rojo/verde están muy extendidas, sobre todo para la colocalización, son especialmente poco útiles para el daltonismo. Se pueden crear imágenes más accesibles cambiando las LUTs de al menos un canal a algo más adecuado (por ejemplo, Rojo → Magenta) - aunque mostrar ambos canales por separado es aún mejor.
También puedes probar los efectos de diferentes colores utilizando el comando Fiji
(ten en cuenta que esto puede requerir convertir la imagen a RGB primero).Encontrarás más información sobre cómo generar figuras con los colores adecuados en https://www.nature.com/articles/nmeth.1618.
Conversión a RGB#
Como se describe en Canales y colores, uno de los usos más importantes de las imágenes RGB es crear una imagen compatible para su visualización en diferentes programas. Veremos más sobre cómo guardar dichas imágenes en Archivos y formatos de archivo.
Debería ser posible convertir cualquier imagen a RGB usando
. Sin embargo, mi forma preferida de crear una imagen RGB para su visualización suele ser Shift+F. Esto no sólo convierte la imagen, sino que también incorpora cualquier ROI o superposición en la versión RGB. Aplanar es similar a tomar una captura de pantalla de la imagen tal y como aparece actualmente, excepto que no se ve afectado por el nivel de zoom actual o el campo de visión.ImageJ tiene dos comandos de copia diferentes,
and . ¿Por qué?Nota: Cuando investigues esto, deberías explorar
, junto con dos comandos en el submenú . Pon atencion a las conversiones.{menuselection}”Edit –> Copy te permite copiar parte de una imagen individual (por ejemplo, una parte 2D de un canal de color particular) y pegarla en otra imagen preservando exactamente el tipo de imagen original y los valores de píxel. También puedes utilizar {menuselection}
File –> New –> Internal Clipboard para obtener la región copiada (pero {menuselection}
Image –> Duplicate…` suele ser una mejor opción). Sin embargo, este tipo de imagen podría no ser compatible con otro software, por lo que no se puede acceder a las imágenes copiadas de esta manera fuera de ImageJ.
es necesario si quieres copiar una imagen al portapapeles del sistema para poder pegarla en otro software. Sin embargo, ten en cuenta que esto convierte la imagen a RGB en el proceso. Por lo tanto, conserva la apariencia de la imagen, pero no necesariamente los valores de los píxeles.
Puedes probar la compatibilidad de las imágenes compuestas y RGB abriendo la imagen
, y guardándola usando tanto antes como después de ejecutar para convertir los datos compuestos originales de 16 bits a RGB.Intenta entonces abrir ambas imágenes guardadas en otro software (por ejemplo, Microsoft PowerPoint®) y compara su apariencia.
Piensa en al menos 2 formas en las que al convertir una imagen compuesta a RGB se puede perder información.
Puedes explorar esto comparando las imágenes Neuron-composite.tif y Neuron-RGB.tif. El comando
debería ayudar.Una forma en que la conversión de una imagen a RGB puede perder información es si los datos originales son de 16 bits antes de la conversión y de 8 bits después, lo que provoca el redondeo y/o el recorte (véase Tipos y profundidad de bits).
Otra es que durante la conversión se haya forzado a que los canales sean puramente rojo, verde y azul. Pero quizás no lo eran originalmente, y se han fusionado canales separados en los mismos. Si habías empezado con más de tres canales, esto habrá ocurrido sin duda, pero incluso si tenías menos canales puedes tener problemas (como en los ejemplos Neuron_composite.tif y Neuron_RGB.tif).
El problema de disponer sólo de una imagen RGB es que ya no es posible saber con certeza cómo eran los datos originales, para poder averiguar si se ha perdido algo. Por ejemplo, quizá hayas conseguido generar una magnífica imagen compuesta por canales turquesa, amarillo y rosa deslumbrante. Cada píxel se muestra en pantalla como una combinación de esos colores. Sin embargo, el mismo color exacto para cualquier píxel también puede representarse –de forma bastante más sencilla– como una mezcla de rojo, verde y azul. Por lo tanto, no importa con qué canales y colores hayas empezado, el resultado final después de la fusión se puede replicar utilizando los canales rojo, verde y azul. Pero si sólo tienes la versión RGB, es posible que nunca puedas volver a extraer los 3 canales originales. Sus colores podrían estar tan mezclados que los valores originales de los píxeles se perderían irremediablemente.
Lo bueno de las imágenes RGB es que su aspecto es idéntico al de la imagen original antes de la conversión, y otros programas (por ejemplo, navegadores web o PowerPoint®) pueden entenderlas sin esfuerzo. Pero lo potencialmente muy malo de las imágenes RGB es que para crearlas hay que convertirlas, y después de esto puede ser imposible recuperar los valores originales de los píxeles.
Cómo se convierten las imágenes RGB / Cómo averiguo lo que no recuerdo
Al describir cómo
maneja la imagen RGB, dije que primero convierte la imagen.«Convierte la imagen» es una afirmación bastante vaga por una buena razón: sólo sé vagamente cómo funciona, porque nunca he necesitado saberlo. De todos modos, las imágenes RGB no son buenas para la cuantificación, así que no suelo tener motivos para medir los valores de los píxeles en ellas.
Lo admito para asegurarte que es muy probable que tu tampoco necesites saberlo. Así que si el resto de este recuadro te parece confuso, no te preocupes.
Sin embargo, también nos da la oportunidad de hacer una observación más importante: hay demasiadas complejidades en ImageJ como para recordarlas todas. Y eso está bien. Creo que una habilidad mucho más importante es saber cómo investigar lo que está sucediendo.
Y así es como me puse a entender lo que significa «convierte la imagen».
En primer lugar, he creado una imagen RGB de 50x50 píxeles con valores conocidos para el rojo (0), el verde (100) y el azul (200).
Si la conversión es simplemente promediar los valores rojo, verde y azul, entonces yo esperaría que el resultado de ejecutar
sea 100 (ya que es la media de 0, 100 y 200). Cuando lo probé, descubrí que ese era el caso. Probé otros valores, y todos se comportaron de la misma manera: parece que la conversión está simplemente promediando los canales.Entonces me planteé la hipótesis de que debería obtener lo mismo si utilizaba
. Así que lo probé, y de nuevo coincidió con las expectativas.Así que concluí que
estaba llamando silenciosamente a en una copia de la imagen, y luego midiendo eso.¿O tal vez está llamando a
en su lugar?Necesitaba una nueva imagen que mostrara los efectos del redondeo, así que añadí 1 al canal azul, haciendo que sus valores fueran 201.
Entonces probé
, que dio la media esperada de 100.33. Pero sigue dando 100 por pixel – porque está limitado a enteros. Y también me dio 100 – lo que sugiere que convierte las imágenes RGB a 8-bit, no a punto flotante, cuando hace sus mediciones.Finalmente, me acordé de que ImageJ a veces cuela opciones extra. Así que abrí
y encontré una casilla para . Si la seleccionaba, y repetía los pasos anteriores obtenía respuestas muy diferentes – porque ya no convierte usando una “media de los 3 canales”. Más bien, cada canal es ponderado: 0.30 x Rojo + 0.59 x Verde + 0.11 x Azul.Reflexionando sobre esto, me llevó a un túnel sin fin, para ver que estos son valores de peso estándar para la conversión de imágenes en escala de grises utilizados en los diferentes tipos de software. Pero, lo que es más importante, vi que la opción
afectaba tanto a la medición como a la conversión, lo que apoya mi sospecha de que están conectadas.¿Confundido/a? Yo también.
Pero mi punto principal es que los mortales como yo no podemos predecir lo que el software va a hacer. Incluso si pensamos que sabemos, hay una posibilidad de que alguna opción furtiva en algún lugar está cambiando el comportamiento.
Lo que podemos hacer es fomentar el espíritu crítico. Podemos aprender lo suficiente sobre el software para saber cómo probar lo que hace.
Y así, al menos, es como aprendí a usar ImageJ y llegué a escribir este libro.