jueves, 6 de octubre de 2016

Procesamiento digital de imágenes, Intro a Java + ImageJ

 Contenidos


 Introducción


Durante la década de los 1980’s, el acceso a imágenes era costoso, la situación que se presentaba en aquel entonces era la falta de formatos estándar para la representación de las imágenes. Por otro lado, las librerías de acceso no se encontraban documentadas y abiertas a los programadores. Prácticamente pasaban meses antes de que se pudiera realizar un procesamiento de imágenes con operaciones elementales.
Actualmente existen librerías para C/C++, Java, y otros lenguajes; los cuales cuentan con soporte para trabajar con imágenes. También existen varias herramientas visuales software para manipular y procesar archivos de imágenes.

Las herramientas visuales para manipular archivos de imágenes, se encuentran orientadas a profesionales y diseñadores, posibilitan realizar cambios y manipular imágenes. En algunos casos, se pueden extender las características incluyendo el uso de scripts.

Las herramientas para procesamiento digital de imágenes enfatizan en algoritmos específicos y se encuentran enfocadas a programadores, científicos e ingenieros que trabajan con imágenes, donde se puede decir que la facilidad de uso y la interactividad no son los focos principales. En estos entornos se hace énfasis en librerías bien documentadas para el procesamiento de imágenes.

En base a lo anterior, se hace una distinción en las funcionalidades del software relacionado al área:
  • Software de manipulación de imágenes.
  • Software de procesamiento de imágenes.
El software de manipulación de imágenes, pueden ser utilizado por usuarios que no cuentan con conocimientos de programación, a la vez estas herramientas utilizan algoritmos pertenecientes a la categoría de procesamiento de imágenes. Bajo la funcionalidad de manipulación de imágenes se encuentra Corel Draw, GIMP, InkScape, Photoshop.

El software de procesamiento de imágenes, incluye los algoritmos que luego son utilizados en manipulación de imágenes. En la categoría de procesamiento de imágenes se agrupan opciones como Matlab, ImageJ.


Codificación en Java, ejemplo de un plugin

Las modalidades para escribir programas que procesen una imagen, pueden ser incuso hasta abrumadoras, mas cuando previamente se han trabajado con software como Matlab u Octave en donde el trabajo de elaborar una secuencia simple no representa gran complejidad.

ImageJ posee muchísimas herramientas y varias funcionalidades pueden ser creadas desde cero según la necesidad de la tarea. El objeto de esta sección es orientar desde un ejemplo práctico para codificar un plugin y llamarlo desde una clase main en Java.

Los ejemplos de plugins y su código han sido tomados de http://imagej.net/Introduction_into_Developing_Plugins

Ejemplo para Java utilizando la clase PluginFilter

public class My_Plugin implements PlugInFilter {
  public int setup ( String arg , ImagePlus image ) {
    return DOES_ALL;
  }
  public void run ( ImageProcessorip ) {
    // Aqui secuencias de comandos
  }
}//fin My_Plugin


Ejemplo para Java utilizando la clase Plugin.

public class My_Plugin implements PlugIn {
  public void run ( String arg ) {
    // Aqui secuencias de comandos
  }
}//fin My_Plugin


A continuación un ejemplo de llamada desde una clase main en Java.

import ij.*;
public class VariasPruebasImageJ {
    public static void main(String[] args) {
        //-----------------------------------
        My_Plugin mi = new My_Plugin(); //clase del plugin definida
        Opener opener = new Opener(); 
       
        //estableciendo el directorio del proyecto
        String directorioActual = System.getProperty("user.dir");
        //-----------------------------------------
        //apertura de la imagen segun directorio
        String imageFilePath = directorioActual+"/cebra.png";
        ImagePlus imp2 = opener.openImage(imageFilePath);
        ImageProcessor ip2 = imp2.getProcessor(); // ImageProcessor from ImagePlus
        //-----------------------------------------
       
        //-----------------------------------------
        //ejecucion del plugin
        // ----------------------------------------
        imp2.show(); //ImagePlus es para mostrar la imagen
        mi.run(ip2); //llamada al plugin
        imp2.updateAndDraw();
        imp2.show();
    } //fin main   
}//fin clase


Clases para el desarrollo de plugins. ¿Cuando utilizar PlugIn PlugInFilter?


Existen dos modalidades de herencia para desarrollar plugins:
  • PlugIn, no requiere una imagen abierta para comenzar la ejecución.
  • PlugInFilter, requiere una imagen activa y que la misma sea pasada cuando comienza la ejecución. Esta clase, requiere que se implementen dos métodos setup() y run().
Se utiliza PlugIn para tareas que crean, cargan y graban imágenes, o que realizan operaciones sin imágenes abiertas.

Se utiliza PlugInFilter, es utilizado para procesar imágenes abiertas con la herramienta visual.

La finalidad que busca este documento es poder llegar a estructurar secuencias de operaciones, para este fin ambas clases mencionadas sirven.

Funciones/ tipos básicos en el desarrollo de plugins


A continuación se hace una breve descripción de los métodos y tipos que deben ser definidos en un plugin que utilice ImageJ.
  • setup() , establece las configuraciones para la ejecución. El método int setup(String args, ImagePlus im)
  • posibilita la recepción de parámetros que utilizará el plugin.
  • run() , es el método principal del pluging, similar a un método main en Java. La sentencia de declaración del método void run(ImageProcessor ip), recibe una imagen como parámetros.
Los tipos básicos utilizados son:
  • DOES_ALL, especifica que la función puede trabajar con cualquier tipo de imagen.
  • DOES_8G, especifica que se trabajará con una imagen de escala de grises de 8-bit.
  • ImagePlus, clase utilizada para cargar la imagen desde una ruta específica.
  • ImageProcessor, el elemento contiene la imagen a ser procesada y permite el acceso a funciones de modificación.

¿Conviene utilizar un lenguaje script?


Este es un buen punto para establecer, depende especialmente de la tarea que se desee realizar. Un motivo por el cual se pueden utilizar scripts es para prototipar secuencias de pasos y verificar si el proceso funciona. ImageJ tiene muchos lenguajes que pueden ser utilizados para el desarrollo de scripts, ver http://imagej.net/Scripting.

Una tarea tediosa, es crear las secuencias de operaciones que se aplicarán a una imagen o a un conjunto de imágenes, sin poder ver los resultados, algo que puede solucionarse utilizando una herramienta visual. Para esto, se ha creado la opción visual para grabación de macros, con esta funcionalidad se pueden traspasar secuencias de comandos a clases java.

Otros recursos

No hay comentarios:

Publicar un comentario