lunes, 10 de octubre de 2016

Java ImageJ: Procesamiento Digital de Imágenes con Java, Ejercicio Cebra

Anteriormente se realizó la programación del ejercicio de la cebra utilizando operaciones morfológicas e implementando el código en Matlab/Octave, el artículo explicativo se encuentra aquí. Descargar desde github el ejemplo Matlab/Octave.

En un artículo anterior, se hizo mención a la librería ImageJ y sus características.
Esta es una versión del ejercicio de procesamiento digital de imágenes (PDI) utilizando Java + Netbeans IDE 8.1. Para acompañar, se ha incluido el código Java utilizando la librería ImageJ.

La idea es obtener las líneas de contorno de la cebra a partir de una imagen original en escala de grises.

Se parte desde una imagen en escala de grises, la cebra contiene las líneas verticales que se desean eliminar.
Cebra en escala de grises
El resultado al cual se desea llegar, es una figura con el contorno de líneas en escala de colores binaria similar a la siguiente imagen.

Contorno de líneas

Secuencias de imágenes obtenidas en según los pasos aplicados.
  • Binarización.
  • Erosión.
  • Erosión.
  • Operación XOR.
Secuencia de imágenes

Operaciones básicas

La aplicación de las operaciones morfológicas básicas se sintetizan en estas intrucciones:
  • IJ.run(IB2, "Make Binary", ""); //convertir a imagen binaria 
  • IJ.run(IB3, "Options...", "iterations=1 count=1 do=Erode"); //erosionar        IJ.run(IB4, "Options...", "iterations=1 count=2 do=Erode"); //erosionar con mayor iteraciones        
  • ImagePlus IB5 = ic.run("XOR create", IB3, IB4);//operacion de calculo XOR entre imagenes

Código Java - ImagenJ

A continuación el código del plugin.

//------------------------------- CORTAR AQUI ---------------------------
package variaspruebasimagej;

import ij.*;
import ij.process.*;
import ij.gui.*;
import ij.io.Opener;
import java.awt.*;
import ij.plugin.*;

/*
www.otroblogdetecnologias.blogspot.com
A partir de una imagen original establece la secuencia de pasos para obtener el
contorno de la cebra quitando las lineas verticales.
Se aplican operaciones para lograr un procesamiento de imágenes.
*/

public class My_secuencia_cebra implements PlugIn {

    public void run(String arg) {
                //apertura de imagen
                Opener opener = new Opener();               
                String directorioActualDefault = System.getProperty("user.dir"); //estableciendo el directorio del proyecto
                String imageFilePathDefault = directorioActualDefault+"/Cebra.png";
                ImagePlus Iorig= opener.openImage(imageFilePathDefault);           
           
    //    ImagePlus Iorig = IJ.openImage("/home/usuario/materialMaestria/2016trabajoTesisMaestria/javaCodigo/variasPruebasImageJ/Cebra.png");
                ImagePlus IB2 = Iorig.crop();
        Prefs.blackBackground = false;
        IJ.run(IB2, "Make Binary", ""); //convertir a imagen binaria

                ImagePlus IB3 = IB2.crop();
        IJ.run(IB3, "Options...", "iterations=1 count=1 do=Erode"); //erosionar

                ImagePlus IB4 = IB2.crop();
        IJ.run(IB4, "Options...", "iterations=1 count=2 do=Erode"); //erosionar con mayor iteraciones
       
               
                ImageCalculator ic = new ImageCalculator();

        ImagePlus IB5 = ic.run("XOR create", IB3, IB4);//operacion de calculo XOR entre imagenes

                //--- Mostrar imagenes ---
        Iorig.show();Iorig.setTitle("1) Original Gris");               
                IB2.show(); IB2.setTitle("2) Binarización");
                IB3.show(); IB3.setTitle("3) Erosión iteración=1 contador=1");              
        IB4.show(); IB4.setTitle("4) Erosión iteración=1 contador=2");                                              
        IB5.show(); IB5.setTitle("3) XOR 4)");

    }//run

}//fin clase

//------------------------------- CORTAR AQUI ---------------------------


//
//------------------------ MAIN CORTAR AQUI ---------------------------
package variaspruebasimagej;

import ij.ImagePlus;
import ij.plugin.filter.PlugInFilter;
import ij.io.Opener;
import ij.process.ImageProcessor;
import ij.IJ;

/*
 este es el programa principal, la lógica que se plantea es la de poder explicar
 con ejemplos las funcionalidades básicas. Los ejemplos se estructuran en plugins
*/
public class PrincipalImageJ {

    public static void main(String[] args) {
        //-----------------------------------
        // Declaracion de Plugins
        //-----------------------------------

        My_secuencia_cebra ej3=new My_secuencia_cebra();
       
        //-----------------------------------------
        // Declaracion de variables iniciales
        //-----------------------------------------
        Opener opener = new Opener();               
        String directorioActualDefault = System.getProperty("user.dir"); //estableciendo el directorio del proyecto
        //String imageFilePathDefault = directorioActualDefault+"/barco.jpg";       
        String imageFilePathDefault = directorioActualDefault+"/Cebra.png";
        ImagePlus imagenDefault= opener.openImage(imageFilePathDefault);
        ImageProcessor imagenPDefault= imagenDefault.getProcessor();
               
        ej3.run("");

    }//main
   
}//FIN clase

//------------------------ MAIN CORTAR AQUI --------------------------- 



No hay comentarios:

Publicar un comentario