introducción - euler.mat.uson.mx
TRANSCRIPT
![Page 1: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/1.jpg)
![Page 2: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/2.jpg)
Introducción� ImageJ ofrece herramientas para la visualización y la manipulación
interactiva de imágenes.� ImageJ está implementado Java y, por lo tanto, es independiente de la
plataforma.� Se ejecuta sin modificaciones en Windows, MacOS o Linux.� También se puede ampliar escribiendo nuevos componentes de
software en Java.
Universidad de Sonora 2
![Page 3: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/3.jpg)
Introducción� El modelo de ejecución dinámica de Java permite que los nuevos
módulos (”plugins") se escriban como piezas independientes de código Java.
� Estos plugins se pueden compilar, cargar y ejecutar "sobre la marcha" sin la necesidad de reiniciar ImageJ.
� ImageJ es software libre y open-source.� Website: http://rsb.info.nih.gov/ij/
Universidad de Sonora 3
![Page 4: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/4.jpg)
Características� Un conjunto de herramientas interactivas para crear, visualizar, editar,
procesar, analizar, cargar y almacenar imágenes, con soporte para varios formatos de archivo comunes.
� Imágenes enteras de 16 bits, imágenes de punto flotante de 32 bits y secuencias de imágenes (“stacks” o “pilas”).
� Un mecanismo simple de plugins para extender la funcionalidad de ImageJ escribiendo fragmentos de código en Java.
Universidad de Sonora 4
![Page 5: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/5.jpg)
Características� Un lenguaje de macros y el intérprete correspondiente, que facilitan la
implementación de bloques de procesamiento más grandes al combinar funciones existentes sin ningún conocimiento de Java.
� En este curso se verán algunos ejemplos de plugins.� En este curso no se estudia el lenguaje de macros.� Más información de macros:
https://imagej.nih.gov/ij/developer/macro/macros.html
Universidad de Sonora 5
![Page 6: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/6.jpg)
Instalación de ImageJ� Entrar a https://imagej.nih.gov/ij/download.html
Universidad de Sonora 6
![Page 7: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/7.jpg)
Instalación de ImageJ
Universidad de Sonora 7
![Page 8: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/8.jpg)
Instalación de ImageJ� Si se selecciona alguna de las opciones en bundle con Java 1.8, hay
que seguir las instrucciones.� Para Mac: https://imagej.nih.gov/ij/docs/install/osx.html� Para Linux: https://imagej.nih.gov/ij/docs/install/linux.html� Para Windows: https://imagej.nih.gov/ij/docs/install/windows.html� Si se selecciona la primera opción (plataforma independiente), se baja
el .zip y se descomprime en algún directorio.
Universidad de Sonora 8
![Page 9: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/9.jpg)
Instalación de ImageJ
Universidad de Sonora 9
![Page 10: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/10.jpg)
Instalación de ImageJ� Contenido del archivo “run”:
java -Xmx512m -jar ij.jar
Universidad de Sonora 10
![Page 11: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/11.jpg)
Ventana principal en Mac
Universidad de Sonora 11
![Page 12: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/12.jpg)
Ventana principal en Windows
Universidad de Sonora 12
![Page 13: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/13.jpg)
Plugins� Los plugins son pequeños módulos de Java para ampliar la
funcionalidad de ImageJ mediante el uso de una interface standard.� Los plugins se pueden crear, editar, compilar, invocar y organizar a
través del menú “Plugins” en la ventana principal de ImageJ.� Los plugins se pueden agrupar para mejorar la modularidad, y los
comandos de plugins se pueden colocar arbitrariamente dentro de la estructura del menú principal.
Universidad de Sonora 13
![Page 14: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/14.jpg)
Tipos de plugins� Los plugins son clases en Java que implementan alguna interface en
particular de ImageJ.� Hay 2 tipos de plugins:1. PlugIn: no requiere que una imagen esté abierta para iniciar un plugin.2. PlugInFilter: la imagen activa se le pasa al plugin cuando comienza.� La mayoría de los plugins que se verán para procesar imágenes son
del tipo PlugInFilter.
Universidad de Sonora 14
![Page 15: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/15.jpg)
Plugins tipo PlugInFilter� La interface PlugInFilter requiere que los plugins de este tipo
implementen al menos dos métodos: setup() y run().� int setup(String args, ImagePlus im)� El método setup() se invoca al comenzar el plugin.� Sirve para verificar que las capacidades de este plugin coincidan con la
imagen de destino.� Devuelve un entero de 32 bits que representa un vector de banderas
binarias que describen las propiedades del plugin.
Universidad de Sonora 15
![Page 16: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/16.jpg)
Plugins tipo PlugInFilter� void run(ImageProcessor ip)� Este método hace el trabajo real para este plugin.� Recibe un único argumento, ip, de tipo ImageProcessor, que contiene la
imagen a procesar y toda la información relevante sobre la misma.� El método run no devuelve nada (es void) pero puede modificar la
imagen recibida y crear nuevas imágenes.
Universidad de Sonora 16
![Page 17: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/17.jpg)
Ejemplo: invertir una imagen� Problema: obtener el negativo de una imagen de 8 bits.� Imagen positiva Imagen negativa
Universidad de Sonora 17
![Page 18: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/18.jpg)
Solución� Las imágenes de 8 bits tienen pixeles con valores entre 0 (negro) y 255
(blanco).� Sean 𝑀 y 𝑁 el ancho y el alto de la imagen, respectivamente.� Para invertir la imagen, el valor de cada pixel 𝐼(𝑢, 𝑣) se reemplaza por:� 𝐼 𝑢, 𝑣 = 255 − 𝐼(𝑢, 𝑣)� Para todas las coordenadas (𝑢, 𝑣) con 𝑢 = 0, 1,… ,𝑀 − 1 y 𝑣 =0, 1,… ,𝑁 − 1.
Universidad de Sonora 18
![Page 19: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/19.jpg)
Implementación� Crear una clase que implemente a PlugInFilter.� Se escoge PlugInFilter (la otra opción es PlugIn) porque se va a
procesar una imagen existente.� public class My_Inverter_A implements PlugInFilter {� El underscore (‘_’) en el nombre de la clase hace que ImageJ la
reconozca como un plugin y lo inserte en el menú de forma automática.
Universidad de Sonora 19
![Page 20: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/20.jpg)
Método setup()� Cuando ImageJ ejecuta un plugin de tipo PlugInFilter, lo primero que
hace es invocar a setup() para obtener información del plugin.� En este ejemplo, setup() regresa el valor DOES_8G (una constante
entera definida en la interface PlugInFilter).� DOES_8G indica que es plugin maneja imágenes en tonos de grises de
8 bits.
Universidad de Sonora 20
![Page 21: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/21.jpg)
Método setup()public int setup(String args, ImagePlus im){
return DOES_8G;}� En este caso, los argumentos args e im no se utilizan.
Universidad de Sonora 21
![Page 22: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/22.jpg)
Método run()� El método run() de un plugin PlugInFilter recibe un objeto de tipo
ImageProcessor que contiene la imagen a procesar y toda la información relevante sobre la misma.
� Se usan los métodos getWidth() y getHeight(), definidos en la clase ImageProcessor, para consultar el tamaño de la imagen.
� Luego se usan dos ciclos for anidados para iterar sobre todos los pixeles de la imagen
� Para leer los valores de los pixeles se usa el método int getPixel (int u, int v)
Universidad de Sonora 22
![Page 23: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/23.jpg)
Método run()� Para escribir los valores de los pixeles se usa el método void putPixel
(int u, int v, int a)
Universidad de Sonora 23
![Page 24: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/24.jpg)
Método run()public void run(ImageProcessor ip){
int M = ip.getWidth();int N = ip.getHeight();// iterate over all image coordinates (u,v)for (int u = 0; u < M; u++) {
for (int v = 0; v < N; v++) {int p = ip.getPixel(u, v);ip.putPixel(u, v, 255 – p);
}}
}
Universidad de Sonora 24
![Page 25: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/25.jpg)
Implementación alternativa� Crear una clase que implemente a PlugIn en lugar de PlugInFilter.� En este caso solo se necesita un método run().� La referencia a la imagen no es directa, hay que invocar al método
IJ.getImage().� Si no hay una imagen abierta, getImage() manda un mensaje de error y
aborta el plugin.� Hay que revisar de manera explícita que el tipo de la imagen sea el
correcto.
Universidad de Sonora 25
![Page 26: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/26.jpg)
Implementación alternativa� run() recibe un parámetro de tipo String que puede ser usado para
pasar información arbitraria al plugin.
Universidad de Sonora 26
![Page 27: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/27.jpg)
Parte 1public class My_Inverter_B implements PlugIn {
public void run(String args){
ImagePlus im = IJ.getImage();if (im.getType() != ImagePlus.GRAY8) {
IJ.error("8-bit grayscale image required");return;
}
Universidad de Sonora 27
![Page 28: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/28.jpg)
Parte 2ImageProcessor ip = im.getProcessor();int M = ip.getWidth();int N = ip.getHeight(); for (int u = 0; u < M; u++) {
for (int v = 0; v < N; v++) {int p = ip.get(u, v);ip.set(u, v, 255 - p);
}}im.updateAndDraw(); // redraw the modified image
} // end run} // end class
Universidad de Sonora 28
![Page 29: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/29.jpg)
¿PlugIn o PlugInFilter?� Es cuestión de gusto.� Los dos tienen ventajas y desventajas.� Como regla general, se utiliza el tipo PlugIn para tareas que no
requieren que se abra ninguna imagen.� Si se deben procesar una o más imágenes abiertas, PlugInFilter es la
opción preferida.
Universidad de Sonora 29
![Page 30: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/30.jpg)
Editar, compilar y ejecutar plugins� El código fuente del plugin debe estar en <ij>/plugins/ o en un
subdirectorio debajo de plugins.� Se pueden crear nuevos plugins desde el menú Plugins/New.� Hay un editor de texto muy básico.� Se recomienda utilizar un IDE profesional como Eclipse o Netscape.� Para compilar y ejecutar un plugin se usa el menú Plugins/Compile and
Run.� Los errores de compilación se muestran en otra ventana.
Universidad de Sonora 30
![Page 31: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/31.jpg)
Editar, compilar y ejecutar plugins� Una vez compilado el plugin, el archivo .class se carga
automáticamente y el plugin es aplicado a la imagen actual.� Se despliega un mensaje de error si no hay una imagen abierta o si la
imagen no es del tipo esperado por el plugin.� Al reiniciar ImageJ carga todos los plugins nombrados correctamente
que se encuentre en el directorio <ij>/plugins (o en algún subdirectorio) y los agrega el menú Plugins.
� Estos plugins se pueden ejecutar sin necesidad de recompilarlos.� Se pueden instalar plugins que estén en un directorio arbitrario desde
el menú Plugins/Install.Universidad de Sonora 31
![Page 32: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/32.jpg)
Editar, compilar y ejecutar plugins� Se pueden grabar secuencias de plugins y otros comandos de ImageJ
como macros en el menú Plugins/Macros/Record.
Universidad de Sonora 32
![Page 33: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/33.jpg)
Desplegar imágenes� Los dos ejemplos no crean una imagen nueva, sino que modifican la
imagen recibida.� Esto no tiene que ser así, un plugin puede crear imágenes nuevas.� No se necesitan comandos para desplegar la imagen modificada.� ImageJ lo hace de manera automática cuando la imagen recibida
cambia.� Además, ImageJ guarda una copia de la imagen al método run() en un
filtro de tipo PlugInFilter.� Se puede restaurar la imagen original con el menú Edit/Undo.
Universidad de Sonora 33
![Page 34: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/34.jpg)
Depurar� Por default, System.out no está disponible en ImageJ.� Se puede usar otra ventana para escribir mensajes de texto usando el
método ij.IJ.log(String s).� ImageJ no ofrece mucho soporte para depurar código (breakpoints,
inspeccionar variables locales).� Los valores de los pixeles se pueden analizar mediante posicionando
el ratón sobre la imagen.
Universidad de Sonora 34
![Page 35: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/35.jpg)
Depurar
Universidad de Sonora 35
![Page 36: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/36.jpg)
Depurar� Otra opción es utilizar algún IDE tipo Eclipse o Netbeans.
Universidad de Sonora 36
![Page 37: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/37.jpg)
Comandos de ImageJ� ImageJ tiene comandos predefinidos.� Estos comandos implementan distintas operaciones de procesamiento
de imágenes.� Un comando puede ser un plugin, una macro o un script (JavaScript,
BeanShell, Python).� Los comandos disponibles están listados en el menú
Plugins/Utilities/Find Commands.� Por ejemplo, invertir una imagen se puede hacer desde el menú
Edit/Invert o usando la clase ij.plugin.filter.Filters (con el argumento "invert").
Universidad de Sonora 37
![Page 38: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/38.jpg)
Comandos de ImageJ� Un comando también se puede ejecutar desde un plugin con el método
IJ.run().� Hay que tener en cuenta que los plugins de tipo PlugInFilter le aplican
un candado (lock) a la imagen actual durante la ejecución para que ninguna otra operación se le pueda aplicar.
� Esto de resuelve llamando a los métodos unlock() y lock().
Universidad de Sonora 38
![Page 39: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/39.jpg)
Comandos de ImageJ
Universidad de Sonora 39
![Page 40: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/40.jpg)
Comandos de ImageJ
Universidad de Sonora 40
![Page 41: Introducción - euler.mat.uson.mx](https://reader031.vdocuments.net/reader031/viewer/2022012505/6180926447fe2c68201091db/html5/thumbnails/41.jpg)
Comandos de ImageJ� Se pueden grabar una serie de comandos mediante el Macro Recorder
disponible en Plugins/Macros/Record.� Los macros se guardan en un archivo de texto para su uso posterior.� Los comandos pueden ser plugins, macros o scripts.
Universidad de Sonora 41