# ImageJ

ImageJ es un programa de procesamiento digital de imagen de dominio público programado en Java desarrollado en la agencia estadounidense Institutos Nacionales de Salud. ImageJ fue diseñado con una arquitectura abierta que proporciona extensibilidad vía plugins Java y macros (macroinstrucciones) grabables. Se pueden desarrollar plugins de escaneo personalizado, análisis y procesamiento usando el editor incluido en ImageJ y un compilador Java. Los plug-ins escritos por usuarios hacen posible resolver muchos problemas de procesado y análisis de imágenes, desde imágenes en vivo de las células en tres dimensiones, procesado de imágenes radiológicas, comparaciones de múltiples datos de sistema de imagen hasta sistemas automáticos de hematología. La arquitectura de plugins y entorno de desarrollo integrados de ImageJ lo han convertido en una plataforma popular para enseñar procesamiento de imagen.
ImageJ puede ejecutarse en un applet en línea, como aplicación ejecutable, o en cualquier computadora con Máquina virtual Java 5 o superior. Hay también distribuciones descargables para Microsoft Windows, Mac OS, Mac OS X, Linux, y Sharp Zaurus PDA. El código fuente de ImageJ está disponible gratuitamente.
El desarrollador principal del proyecto, Wayne Rasband, está en el Research Services Branch del National Institute of Mental Health.

## Características

ImageJ puede mostrar, editar, analizar, procesar, guardar, e imprimir imágenes de 8 bits (256 colores), 16 bits (miles de colores) y 32 bits (millones de colores). Puede leer varios formatos de imagen incluyendo TIFF, PNG, GIF, JPEG, BMP, DICOM, FITS, así como formatos RAW (formato). ImageJ aguanta pilas o lotes, una serie de imágenes que comparten una sola ventana, y es multiproceso, de forma que las operaciones que requieren mucho tiempo se pueden realizar en paralelo en hardware multi-CPU. ImageJ puede calcular el área y las estadísticas de valor de píxel de selecciones definidas por el usuario y la intensidad de objetos umbral (thresholded objects). Puede medir distancias y ángulos. Se puede crear histogramas de densidad y gráficos de línea de perfil. Es compatible con las funciones estándar de procesamiento de imágenes tales como operaciones lógicas y aritméticas entre imágenes, manipulación de contraste, convolución, análisis de Fourier, nitidez, suavizado, detección de bordes y filtrado de mediana. Hace transformaciones geométricas como ampliar, rotación y flips. El programa es compatible con cualquier número de imágenes al mismo tiempo, limitado solamente por la memoria disponible.

### Historia

Antes del lanzamiento de ImageJ en 1997, existía un programa de análisis de imagen conocido como NIH Image desarrollado para ordenadores Macintosh de sistema operativo preMac OS X. El desarrollo de este software continúa en la forma de Image SXM, una variante para investigación física de imágenes microscópicas escaneadas. También fue desarrollada una versión para Windows – portada por Scion Corporation, llamada Scion Image for Windows. Ambas versiones están aún disponibles.

## Calibrado de imagen con ImageJ

Para calibrar una imagen hay que traducir los píxeles a distancias, respecto de algún punto de la imagen. Para ello lo que se hace es incluir en la imagen un objeto de dimensiones conocidas. Entonces, midiendo cuántos píxeles ocupa este elemento en la imagen se podrá saber cuanto mide un píxel.
Por ejemplo, utilizamos una pelota que sabemos que mide 6,7 cm. Para ver a cuántos píxeles corresponde esta medida utilizamos las siguientes herramientas de ImageJ:
Se podría simplemente ampliar la imagen en la zona de la pelota y mirar cuántos píxeles ocupa utilizando la posición del cursor en un extremo y otro de la pelota. Para ampliar utilizamos el comando de la lupa que se muestra en la Figura 1 de la barra de herramientas.
Otra opción más precisa, es trazar un perfil de intensidades sobre la pelota. Para ello seleccionamos en la barra de herramientas de ImageJ (Figura 1) el botón que tiene una línea, el quinto empezando por la izquierda.
Esta herramienta nos permite dibujar una recta sobre la imagen en la zona del objeto colocado del que sabemos su medida real y después ver qué valores toma la imagen a lo largo de dicha recta.
Una vez que trazamos la recta apretamos la combinación de teclas ctrl + k e ImageJ nos dibuja un perfil de la intensidades de la recta. Como la pelota es más oscura que el fondo, identificaremos en el perfil los píxeles de la pelota como los de menor valor de gris (Gray Value) y así determinaremos cerca de qué píxel comienza y finaliza el objeto.

## Realce del contraste de una imagen con ImageJ

Si queremos realzar el contraste de una imagen desenfocada lo podemos conseguir haciendo que los niveles de gris de la imagen, definidos en un intervalo [Min, Max], pasen a ocupar todo el intervalo posible [0, 255].
Observamos los valores de intensidad de la imagen en la ventana del Histograma: Count, Min, Max, Mean. Count es el número de píxeles de la imagen y Mean el valor medio de la intensidad. Count*Mean es la intensidad total en la imagen.
El primer paso es restar el valor Min a toda la imagen. Con los desplegables de la barra de herramientas de la Figura 1 hacemos Process/Math/Subtract y en la casilla Value ponemos el valor de Min.
La resta se va a notar en el histograma, ya que lógicamente arrancará de cero. Ejecutamos de nuevo Analyze/Measure para comprobar que Min=0 y ver el nuevo valor de Max.
Ahora el segundo paso es reescalar el intervalo. Hacemos el cociente (256/Max) y multiplicamos toda la imagen por ese valor. Process/Math/Multiply, y en la casilla Value ponemos el valor de 256/Max. El resultado es la misma imagen pero con mayor contraste.
Para conocer la nueva intensidad total, volvemos a Analyze/Measure.

## Filtrado de imagen con ImageJ

ImageJ permite filtrar imágenes tanto en el dominio espacial como en el dominio de frecuencias.

### Filtrado en el dominio espacial

El primer paso para aplicar un filtro en el dominio espacial es definir una máscara de filtrado. La imagen filtrada será el resultado de convolucionar la máscara con la imagen original.
Dependiendo de cómo sea la máscara, existen distintos tipos de filtros (suavizado, realce de bordes, etc)

#### Ejemplos
##### Filtros de suavizado

Filtro de Media (Mean). Es un filtro de suavizado. Tiene una máscara uniforme, por tanto lo que hace es sustituir el valor de cada pixel de la imagen por el promedio de ese pixel y los de alrededor. El efecto de suavizado será mayor cuanto mayor sea el tamaño de la máscara.
Filtro de Mediana (Median). Igual que el anterior, tiene el efecto de suavizar los contrastes en la imagen. En este caso se sustituye el valor de cada pixel por el valor de la mediana del conjunto de píxeles que lo rodean.
Filtro Gaussiano (Gaussian Blur). La máscara tiene la forma de una gaussiana. El efecto del suavizado es mayor cuanto mayor es la sigma de la gaussiana.
| Imagen original | Imagen con filtrado de media | Imagen con filtrado de mediana | Imagen con filtrado gaussiano |

##### Filtros de realce de bordes

Filtro de Sobel (Find Edges). El operador de Sobel trabaja con dos máscaras: una que realza los bordes en el eje X de la imagen y otra que hace lo propio en el eje Y
Bordes: La determinación de bordes de los elementos de una imagen se puede conseguir por diversos medios. En ImageJ se puede utilizar la función que se llama Find Edges que practica un filtro con lo Operador Sobel.
| Imagen Original. | Imagen con filtro Find Edges (Sobel). |
Filtro Laplaciano (Sharpen). Su objetivo es el mismo que el del filtro de Sobel: realzar los bordes de la imagen.

### Filtrado en el dominio frecuencial

Los pasos a seguir para realizar un filtrado en el dominio frecuencial son:
1) Transformar la imagen original al dominio de frecuencias aplicando la FFT (Fast Fourier Transform) o transformada rápida de Fourier
2) Aplicar el filtrado en el dominio de frecuencias.
3) Aplicar la transformada de Fourier inversa para devolver la imagen filtrada al dominio espacial
La ventaja de filtrar en el dominio frecuencial es que es matemáticamente más sencillo, debido a que la trasformada de Fourier de la convolución de dos funciones es igual a la suma de las transformadas de Fourier de cada una de ellas.Es decir, en el dominio de frecuencias basta con sumar las transformadas de la imagen y del filtro, mientras que en el dominio espacial hay que aplicar una convolución.

#### Ejemplos

Filtrado pasa-alta en el dominio frecuencial
Un filtrado pasa-alta elimina las componentes de baja frecuencia. En la transformada de Fourier de la imagen, las componentes de baja frecuencia se encuentran en la zona central, de modo que para eliminarlas hay que poner a cero todos los píxeles de un disco central de la FFT. Calculando la transformada inversa, tendremos la imagen filtrada en el dominio espacial. Al hacer esto, estaremos eliminando también la componente de continua de la imagen, de modo que para obtener el resultado final tendremos que sumar la imagen filtrada (con realce de bordes) y la imagen original.
| Imagen original | FFT de imagen original | FFT filtrada pasa alta | FFT inversa (bordes de la imagen original) | Imagen original + realce de bordes |

## Macros en ImageJ

ImageJ proporciona extensibilidad vía plugins Java y macros (macroinstrucciones) grabables. En este apartado se indica cómo grabar una macro.
La forma más sencilla de grabar una macro es la siguiente:
* Se lanza la aplicación ImageJ y en la barra de menús (Figura 1) pulsamos: Plugins/Macros/Record…
* Se abre una ventana (Figura 4) que nos permite dar el nombre a nuestra macro (prueba): Figura 4. Ventana Recorder en ImageJ
* ImageJ ha comenzado a grabar, todo lo que hagamos a partir de ahora queda registrado en la ventana en forma de instrucciones. De esta manera podemos ver como se invocan las instrucciones de ImageJ:Figura 5. Recorder en funcionamiento en ImageJ. En el ejemplo se puede ver la invocación de las instrucciones Find Edges, Sharpen, ROI Manager,...
* Una vez terminemos lo que queremos grabar y repetir, pulsamos Create y nos permite grabar el registro de las acciones que hemos llevado a cabo en un fichero. La extensión por defecto es ijm, aunque se puede dar cualquier extensión. El fichero generado es tipo texto, de modo que con un editor de texto se puede abrir y editar.
* Es necesario instalar la macro. Para instalar la macro: Plugins/Macros/Install… Seleccionamos el fichero que hemos guardado (prueba.ijm) y el programa nos indica que la macro ha sido instalada. Podemos ver en el menú Macro que aparece el nombre de la macro instalada:Figura 6. Menú macro. La nueva macro prueba ha sido instalada.
* Para ejecutar la macro podemos seleccionar el nuevo elemento creado en el menú o bien seguir los siguientes pasos: - Plugins/Macros/Run… - Seleccionamos de nuevo el fichero generado en el paso 4.
Ejemplos de instrucciones:
makeRectangle(x, y, lado_x, lado_y); Crea una ROI rectangular con el centro situado en las coordenadas (x,y), y de tamaño horizontal lado_x, y tamaño vertica lado_y.
makeOval(x, y, diam_x, diam_y); Crea una ROI circular con el centro situado en las coordenadas (x,y), y con diámetro x = diam_x, y diámetro y = diam_y.
run("Measure"); Calcula el área, la media, la desviación estándar, la moda, el mínimo y el máximo de los píxeles contenidos en una ROI. Las magnitudes calculadas se pueden configurar en la ventana Results.