Download NetBeans IDE 5

Document related concepts
no text concepts found
Transcript
NetBeans IDE 5.5: GUÍA RÁPIDA
Autor: Físico, M Sc., Diego Luis Aristizábal Ramírez, profesor asociado, Escuela de Física, UN.
Universidad Nacional de Colombia sede Medellín
Copyright 2007
Bienvenido a NetBeans IDE!
A continuación se desarrollarán tres ejemplos que ilustrarán el manejo básico del IDE
NetBeans 5.5. El primero trata de una aplicación muy simple que desplegará por
consola la cadena “Hola Mundo”. La segunda es una aplicación de contexto gráfico:
corresponde a la creación de una Paleta de Colores como la ilustrada en la figura
siguiente; el panel de la izquierda toma el color que se obtenga de la combinación
(Rojo, Verde, Azul), donde cada color aporta con un “peso” entre 0 y 255, seleccionado
con deslizadores.
La tercera aplicación, también es de contexto gráfico. Aquí se realiza algo de
procesamiento sobre una imagen digital. La interfaz gráfica empleada se fundamenta
en el uso de menús. En esta aplicación se usan además de las librerías del jsk1.6, las
de JAI (Java Advanced Image); por lo que se deberá adicionar este paquete adicional
1
Aplicación I
Creando el proyecto
1. En el IDE, escoger File > New Project, como se ilustra a continuación
2. Al seleccionar New Project se despliega la siguiente ventana,
3. Seleccionar General > Java Aplication, como se observa a continuación,
4. Teclear Next y se desplegará la siguiente ventana,
2
5. En esta ventana escribir el nombre del proyecto (en el campo Project Name:) y
el nombre de la carpeta donde lo guardará (en el campo Project Location:). En
este ejemplo, el proyecto se denominó Ejemplo_1 el cual se albergará en la carpeta
C:\ejemplos_net_beans. Para esta aplicación, las opciones Set as Main Project
y Create Main Class estarán seleccionadas (en los checkbox). En el campo Create
Main Class aparece el texto ejemplo_1; completarlo así: ejemplo_1.HolaMundo:
esto implicará que la clase que posee el método main se denomina HolaMundo.
6. Teclear Finish. El proyecto ha sido creado y abierto en el IDE. En este momento
se debe observar los siguientes componentes

La ventana del proyecto (Projects window), la cual contiene un árbol con
las componentes del proyecto, incluyendo los archivos fuente y las librerías
de las cuales depende el código.

La ventana donde aparece el código fuente desplegado (Source Editor
window). En este caso aparece el código de la clase HolaMundo.java.

El panel de navegación (Navigator), el cual puede se usa para navegar
dentro de los elementos de la clase.
3
Adicionando Código al Archivo Fuente Generado
1. Como se seleccionó el checkbox Create Main Class se generó un código esqueleto
en la clase HolaMundo.
2. A continuación se completará el código para que despliegue por consola la cadena
“Hola Mundo”. Esto se puede hacer en el lugar indicado como,
// TODO code application logia here
Para esto se agrega el siguiente código:
System.out.println("Hello World!");
3. Grabar los cambios realizados escogiendo File > Save.
Compilando el archivo fuente
1. Escoger Build > Build Main Project del menú principal del IDE.
2. En la ventana de salida (Output) se despliega algo similar a lo de la figura siguiente:
4
Si no se ha tenido errores, la última línea desplegada en la ventana Output será la
sentencia, BUILD SUCCESSFUL. Si se han encontrado errores aparecerá en esta línea
la sentencia, BUILD FAILED. En este último caso se debe proceder a corregir los
errores y de nuevo se debe compilar.
3. Si se selecciona la ventana Files se observará la distribución de archivos generados
por el IDE, tal y como aparecen en la carpeta donde está guardando el proyecto.
Ejecutando el programa
1. Escoger en el menú principal, Run > Run Main Project. Se desplegará en la
consola (ventana de salida) la cadena “Hola Mundo”.
5
Felicitaciones, ya elaboró su primer programa con este excelente IDE.
Aplicación II
Creando el proyecto
1. En el IDE, escoger File > New Project como se muestra a continuación,
2. Al seleccionar New Project se despliega la siguiente ventana,
3. Seleccionar General > Java Aplication como se observa a continuación,
6
4. Teclear Next y se desplegará la siguiente ventana,
5. En esta ventana teclear el nombre del proyecto (en el campo Project Name:) y la
carpeta donde lo guardará (en el campo Project Location:). En esta aplicación el
proyecto
se
denominó
Ejemplo_2
el
cual
C:\ejemplos_net_beans. Para esta aplicación
se
albergará
en
la
carpeta
NO estarán seleccionadas (en los
checkbox) las opciones Set as Main Project y Create Main Class. El campo Create
Main Class aparece desactivado. La razón de esto es que la aplicación será en un
contexto gráfico (JFrame). Es decir,
denominará PaletaColores.java
más adelante, se definirá una clase que se
que heredará de JFrame y la cual tendrá el
método main,
6. Teclear Finish. El proyecto ha sido creado y la pantalla tendrá el siguiente aspecto,
7
7. En el menú principal escoger File > new File y se desplegará a siguiente ventana,
8
8. Escoger Java GUI Forms > JFrame Form y teclear Next. Se despliega la siguiente
ventana,
En el campo Class Name escribir PaletaColores y escoger Finísh. La pantalla
adquiere el siguiente aspecto,
La ventana donde se despliega el código fuente está en modo Design (modo de diseño).
Si se selecciona Source (modo Source) la ventana toma el siguiente aspecto,
9
Construir la Interfaz Gráfica de la Aplicación
1. Regresar en el IDE al modo Design. De aquí en adelante es donde realmente se
logra dimensionar la potencialidad del IDE.
En el panel de navegación seleccionar Inspector. Ese panel adopta el siguiente
aspecto,
A continuación se procederá a pegarle controles y paneles al JFrame. Para esto es
necesario primero asignarle un administrador de diseño.
Ubicar el cursor en la etiqueta [JFrame], hacer clic en el botón derecho del ratón y
ubicarse en el item Set Layout. Se desplegará un popmenú.
10
En este ejemplo se escogerá como administrador de diseño el GridLayout: escogerlo.
La ventana se mostrará de la siguiente forma,
Este administrador de diseño (GridLayout) pegará los elementos en este JFrame en
compartimientos de un arreglo matricial. En este ejemplo se pegará dos JPanel en un
arreglo de una fila y dos columnas. Un JPanel se ubicará en el compartimiento (0, 0)
y el otro en el (0, 1).
Para ello es necesario cambiarle las propiedades a GridLayout. Ubique el cursor en la
etiqueta GridLayout, haga clic en el botón derecho del ratón y se desplegará un
popmenú. Escoger el item Properties. Se desplegará la siguiente ventana,
11
En Columns escribir 2 , en Rows 1 y cierre la ventana. Ya se procederá a pegar los
dos JPanel.
2. Ubicar el cursor en la etiqueta [JFrame] y hacer clic en el botón derecho del ratón.
Se despliega un popmenú. Escoger Add From Palette > Swing > JPanel. Ya quedó
pegado el primer JPanel. Repetir los mismos pasos para pegar el segundo JPanel.
En este momento el panel Inspector debe tener la siguiente forma,
12
3. Para darle más legibilidad al código fuente es aconsejable cambiar los nombres de
las variables por nombres fáciles de interpretar. Por ejemplo, la variable jPanel1 se
cambiará por el nombre jpanel_pantalla_despliegue_colores, y la variable
jPanel2 se cambiará por el nombre jpanel_controles.
Para lograr esto se debe
ubicar el cursor primero en la etiqueta jPanel1 y hacer clic en el botón derecho del
ratón. Se despliega un popmenú. Escoger Change Vaiable Name …. Se despliega la
siguiente ventana,
En el campo escribir el nombre jpanel_pantalla_despliegue_colores y oprimir el
botón ok. Repetir lo mismo para cambiar el nombre de la variable jPanel2. El aspecto
de Inspector es ahora así,
13
4. Ahora se agregarán tres JPanel al panel jpanel_controles.
Escoger como administrador de diseño un GridLayout de 3 filas y una columna.
Recordar ubicar el cursor en la etiqueta jpanel_controles y hacer clic en el botón
derecho del ratón; en el popmenú desplegado escoger Set Layout > GridLayout.
Ubicar ahora el cursor en la etiqueta GridLayout de jpanel_controles, hacer clic en el
botón derecho del ratón y en el popmenú desplegado escoger Properties: en la
ventana que se despliega escribir 1 en Columns y 3 en Rows y cerrar esta ventana. El
aspecto que debe tener el panel Inspector es el siguiente,
Para agregarle el primer JPanel a jpanel_controles, ubicar el cursor sobre él (sobre su
etiqueta), hacer clic en el botón derecho del ratón y en el popmenú que se despliega
escoger, Add From Palette > Swing > JPanel. Ya quedó pegado este primer panel.
Repetir estos mismos pasos para adicionar los otros dos JPanel. El apecto del panel
Inspector es,
Cambiar
los
nombres
de
las
variables
jPanel1,
jPanel2,
jPanel3
por
jpanel_control_rojo, jpanel_control_verde,jpanel_control_azul. Para esto
14
es necesario repetir los pasos que se siguieron para cambiar las variables
jpanel_pantalla_despliegue_colores y jpanel_controles.
En este momento el aspecto del panel Inspector es el siguiente,
5. A continuación se agregará a cada uno de los JPanel, jpanel_control_rojo,
jpanel_control_verde y jpanel_control_azul, de a un JSlider (deslizador). Para
esto a cada uno de ellos se le asigna un GridLayout de una fila y 1 columna (no olvide
fijar las filas y las columnas en Properties de GridLayout) como administrador de
diseño. El panel Inspector debe tener ahora el siguiente aspecto,
Proceder a pegar los deslizadores: ubicare el cursor en la etiqueta jpanel_control_rojo;
hacer clic en el botón derecho del ratón. En el popmenú desplegado escoger Add From
Palette > Swing > JSlider. Repetir los mismos pasos para pegar los JSlider de los
paneles
jpanel_control_verde y jpanel_control_azul. El aspecto del panel
Inspector ya es el siguiente,
15
Proceda a cambiar los nombres de las variables jSlider1, jSlider2 y jSlider3 por
jslider_control_rojo,
jslider_control_verde
y
jslider_control_azul
respectivamente. El aspecto de Inspector es ahora,
El aspecto del panel Design es,
6. Aliñar un poco el diseño.
En
el
panel
diseño
hacer
clic
sobre
el
panel
izquierdo
(jpanel_pantalla_despliegue_colores). Como se observa en la siguiente figura se
16
despliegan las propiedades de este panel (observar lo que se indica con la flecha). Aquí
se podrá cambiar las propiedades, en este caso del panel seleccionado.
Hacer clic en border. Se despliega la siguiente pantalla.
En Title escribir “Despliegue de Colores” y presionar el botón ok. El diseño de la
interfaz gráfica debe tener ya el siguiente aspecto,
17
Repetir
los
mismos
pasos
jpanel_control_verde
y
para
los
paneles
JPanel,
jpanel_control_rojo,
jpanel_control_azul, escribiendo “Rojo”, “Verde”y
“Azul” respectivamente. El aspecto de la interfaz gráfica es ahora el siguiente.
7. Cambiar ahora las propiedades de los JSlider: ubicar el cursor en el primer JSlider
y hacer clic (ver figura siguiente).
18
Cambiar las siguientes propiedades:
Major tick Spacing: 50
Maximum: 255
Minor tuck Sapcing: 10
paint labels: seleccionarla
paint ticks: seleccionarla
Repetir el mismo procedimiento sobre los otros dos JSlider. La apariencia de la
interfaz gráfica ya es la siguiente,
Adicionar los Eventos de los JSlider
Hasta el momento sólo se tiene la interfaz gráfica de la aplicación. Para probar esto,
compilar la aplicación: Bulid > Build Main Proyect. Proceder ahora a ejecutarla: Run
> Run Main Project. El resultado es el siguiente,
19
Sin embargo si se deslizan los controles, NADA PASA. Faltan los EVENTOS.
Adicionar los evento
1. Ubicar el cursor sobre el primer JSlider (ver figura) y hacer clic sobre el botón
derecho del ratón. Se despliega un popmenú.
Escoger Events > Change > stateChanged.
Inmediatamente el cursor queda
sumergido en el código fuente (ver figura siguiente).
20
En ese sitio es donde se debe agregar el código que se debe ejecutar cuando sucede el
deslizamiento del jslider_control_rojo. Agregar el siguiente código después de la línea
de comentario, // TODO add your handling code here, o sobre ella.
jpanel_pantalla_despliegue_colores.setBackground(new
Color(jslider_control_rojo.getValue(),jslider_control_verde.getValue()
,jslider_control_azul.getValue()));
Al compilar el programa se despliega un error. Esto se debe a que se debe importar el
paquete java.awt.* que trae las librerías del Color. Procer a agregar al principio del
código de la clase paletaColores la siguiente instrucción,
java.awt.*;
Compilar le programa y ejecutarlo. Observar que al desliza el jSlider del rojo, el panel
izquierdo cambia de tonalidades de rojo.
Repetir el procedimiento para los otros dos jslider agregando el mismo código,
jpanel_pantalla_despliegue_colores.setBackground(new
Color(jslider_control_rojo.getValue(),jslider_control_verde.getValue()
,jslider_control_azul.getValue()));
Compile y ejecute. Acaba de elaborar una aplicación que reproduce los diferentes
colores.
Mejoramiento del programa
Cuando el programa se ejecuta se observa que el panel que despliega el color no está
inicializado en debida forma: no aparece con el color que debería tener para el estado
inicial de los JSlider.
21
Para corregir esto agregar el código que actualiza el color del panel dentro del método
constructor de la aplicación y después de la línea de código, initComponents(), es
decir,
public PaletaColores() {
initComponents();
jpanel_pantalla_despliegue_colores.setBackground(new
Color(jslider_control_rojo.getValue(),jslider_control_verde.getV
alue(),jslider_control_azul.getValue()));
}
Listo: compilar y ejecutar.
Distribuir la aplicación
Dirigirse a la carpeta donde está almacenado el proyecto. Entrar a la subcarpeta dist
El archivo .jar corresponde a la aplicación que se entregará al cliente. En este caso es
PaletaColores.jar. Se puede copiar en otra carpeta o en un disco de almacenamiento.
El cliente haciendo doble clic sobre ese archivo ejecutará la aplicación; obviamente
debe poseer en su computador el runtime, es decir, el jre 1.6 de java.
Felicitaciones, ya elaboró su segundo programa con este excelente IDE.
Aplicación III
Creando el proyecto
1. En el IDE, escoger File > New Project como se muestra a continuación,
22
2. Al seleccionar New Project se despliega la siguiente ventana,
3. Seleccionar General > Java Aplication como se observa a continuación,
4. Teclear Next y se desplegará la siguiente ventana,
23
5. En esta ventana teclear el nombre del proyecto (en el campo Project Name:) y la
carpeta donde lo guardará (en el campo Project Location:). En esta aplicación el
proyecto
se
denominó
Ejemplo_3
el
cual
C:\ejemplos_net_beans. Para esta aplicación
se
albergará
en
la
carpeta
NO estarán seleccionadas (en los
checkbox) las opciones Set as Main Project y Create Main Class. El campo Create
Main Class aparece desactivado. La razón de esto es que la aplicación será en un
contexto gráfico (JFrame). Es decir,
denominará PaletaColores.java
más adelante, se definirá una clase que se
que heredará de JFrame y la cual tendrá el
método main,
6. Teclear Finish. El proyecto ha sido creado y la pantalla tendrá el siguiente aspecto,
24
7. En el menú principal escoger File > new File y se desplegará a siguiente ventana,
8. Escoger Java GUI Forms > JFrame Form y teclear Next. Se despliega la siguiente
ventana,
25
En el campo Class Name escribir ProcesamientoDigitalImagenes y escoger Finísh.
La pantalla adquiere el siguiente aspecto,
La ventana donde se despliega el código fuente está en modo Design (modo de diseño).
Si se selecciona Source (modo Source) la ventana toma el siguiente aspecto,
26
Construir la Interfaz Gráfica de la Aplicación
1. Regresar en el IDE al modo Design. De aquí en adelante es donde realmente se
logra dimensionar la potencialidad del IDE.
En el panel de navegación seleccionar Inspector. Ese panel adopta el siguiente
aspecto,
A continuación se procederá a adicionar un menú y dos paneles con ascensores (en
los cuales se desplegarán las imágenes fuente y resultado) al JFrame.
Adición del Menú
2. Ubicar el cursor en la etiqueta [JFrame], hacer clic en el botón derecho del ratón.
Se desplegará el siguiente popmenú,
27
Escoger: Add Form Palette > Swing > JMenuBar. La interfaz que ese está
desarrollando adopta la siguiente apariencia,
Y el penal Inspector queda así,
28
3. Cambiar el nombre de de jManuBar1 por jMenuBar_principal y jMenu1 por
jMenu_archivos. Para esto se ubica el cursor en la etiqueta respectiva, se hace clic
derecho en el ratón y en el popmenú desplegado se selecciona Change Variable Name
… El aspecto del panel Inspector debe ser ahora el siguiente,
4. Cambiar ahora el nombre que se despliega en la barra del menú (Menu).
Ubicar el cursor en la etiqueta el árbol de Inspector sobre jMenu_archivos. Hacer clic
derecho en el ratón; en el popmenú desplegado, selecciones Properties. Cambie en el
cuadro desplegado cambie en text, Menu por Archivos. La internaza gráfica adopta la
siguiente forma,
5. Agregar Ítems al menú Archivos.
Ubicar el cursor en el árbol de Inpector sobre jMenu_archivos. Hacer clic derecho en
el ratón. En el popmenú desplegado seleccione Add > JMenuItem.
29
El panel inspector toma la siguiente forma,
Cambiar el nombre de jMenuItem1 por jMenuItem_abrir.
Compilar y ejecutar la aplicación. Haga clic sobre el menú Archivos. Se observará lo
siguiente,
30
Cambiar la cadena “Item” desplegada por la cadena “Abrir”: ubicar el cursor en el
árbol de Inspector sobre JMenuItem_abrir; en el popmenú desplegado seleccione
Properties. Cambie en el nuevo cuadro desplegado en text, Item por Abrir.
Compilar y ejecutar la aplicación. Haga clic sobre el menú Archivos. Se observará lo
siguiente,
6. Repetir el procedimiento de 5 para agregar los ítems; Guardar, Imprimir. Las
respectivas
variables
e
el
árbol
de
Inspector
cambiarles
el
nombre
por:
jMenuItem_guardar y jMenuItem_imprimir.
Compilar la aplicación. El aspecto de la interfaz gráfica es el siguiente,
31
El panel lnspector debe tener ahora el siguiente aspecto,
Adicionar más menús a la barra de menús.
7. En el árbol de Inspector ubicar el cursor sobre jMenuBar y hacer clic derecho en el
ratón. En el popmenú desplegado escoger Add JMenu. El aspecto de Inspector es el
siguiente,
El aspecto de la interfaz gráfica (en el panel Design) es,
32
Proceder a repetir los pasos 3 a 6 hasta que la aplicación al ejecutarla muestre en el
segundo menú lo siguiente,
Y que el panel Inspector tenga el siguiente aspecto,
33
Adicionar items dentro de los ítems.
8. Se procederá a construir un tercer menú algo más complejo. La aplicación una vez
terminado este paso deberá tener la siguiente forma,
Y el panel Inspector debe adoptar la siguiente forma,
34
Para lograr esto es necesario adicionar dentro de los JMenu más JMenus. Sólo los
últimos para adicionar en cada rama del árbol del panel Inspector serán los
JMenuItem.
9. Repetir el paso 8 para que la aplicación una vez ejecutada adopte la siguiente
forma,
35
Y el panel Inspector se encuentre en el siguiente estado,
36
Adición de lo Paneles con ascensores
10. Agregar a JFrame un JPanel con un Gridlayout de 1 columna y 1 fila. Luego
adicionar a este JPanel os JScroolPane con un GridLayout de dos columnas y 1 fila.
El panel Inspector deberá tener ahora la siguiente forma (se ha recogido la rama del
árbol de jMenuBar_principal (haciendo clic en el signo -) con el fin de ganar más
visibilidad en esta etapa de la constsrucción de la interfaz.
37
Compilar y ejecutar la aplicación. Se despliega la siguiente GUI,
Asignarle un tamaño de 400x300 y deshabilitar el redisionamiento del JFrame. Para
ello
elegir
el
panel
Source
y
ProcesamientoDigitalImagenes.java
en
el
método
agregar
constructor
después
de
la
de
la
clase
instrucción
initComponents () el siguiente código,
public ProcesamientoDigitalImagenes() {
initComponents();
this.setSize(400,300);
this.setResizable(false);
}
Compilar y ejecutar la aplicación. Se obtendrá la siguiente GUI,
Marcar la barra del Júrame. Adicionar la línea de código,
38
this.setTitle("Análisis Digital de Imágenes");
Es decir,
public ProcesamientoDigitalImagenes() {
initComponents();
this.setSize(400,300);
this.setResizable(false);
this.setTitle("Análisis Digital de Imágenes");
}
Compilar y ejecutar de nuevo. Se observa que la interfaz gráfica de usuario (GUI) ya
tiene la forma deseada.
Felicitaciones, ha construido una nueva GUI con este maravilloso IDE.
Adicionando los eventos
A continuación se adicionarán los eventos y el código respectivo para que la aplicación
realmente sirva para lo que se desea: Procesamiento Digital de Imágenes.
Abrir la imagen fuente que se desea procesar y desplegarla en el panel
izquierdo.
1. Primero se implementarán dos clases que se responsabilizarán la una de almacenar
los datos y las imágenes en el RAM y la otra de de abrir y grabar la imagen en disco.
La primera se denominará Datos.java y pertenecerá a un paquete que se llamará
datos; la segunda se denominará ManejadorArchivos.java y pertenecerá a un
paquete que se denominará manejo_archivos.
Proceder a crear los paquetes datos y manejo_archivos: escoger File > New File y
se desplegará el siguiente cuadro,
39
Seleccionar Java Classes > Java Package y se desplegará el siguiente cuadro,
Escriba en Package Name, datos y oprima el botón Finish.
Repetir lo mismo para crear el paquete manejo_archvos. El panel Projects adopta el
siguiente aspecto,
40
2. Crear la clase Datos.java: ubicar
el cursor sobre en el árbol del panel Projects
sobre la etiqueta del paquete datos y hacer clic en el botón dercecho del ratón. Se
desplegará el sugiente popmenú,
Escoger New > Java Class… y se desplegará el esqueleto del código fuente de la clase
Datos.java. Complételo de tal forma que la clase quede como sigue,
package datos;
import javax.media.jai.RenderedOp;
import javax.media.jai.PlanarImage;
import java.awt.image.RenderedImage;
public class Datos {
public static RenderedOp imagen_fuente;
public static RenderedOp imagen_resultado;
public static RenderedOp imagen_renderizada_buffer;
//Datos de la imagen
public static String nombre_imagen_buffer;
41
public
public
public
public
static
static
static
static
String extension;
String nombre_imagen;
int ancho_imagen;
int alto_imagen;
/** Creates a new instance of Datos */
public Datos() {
}
}
Tratar de comprender este código.
3. Crear la clase ManejadorArchivos.java: ubicar el cursor sobre en el árbol del panel
Projects sobre la etiqueta del paquete manejador_archivos y repita el procedimiento
señalado en 2 hasta obtener el siguiente código de la clase ManejadorArchivos.java,
package manejo_archivos;
import
import
import
import
java.awt.*;
javax.swing.*;
javax.media.jai.*;
datos.*;
public class ManejadorArchivos {
private RenderedOp img;
/** Creates a new instance of ManejadorArchivos */
public ManejadorArchivos() {
}
public void abrirArchivo() {
/*Debe abrir frame para escoger la imagen y la deberá almacenar renderizada en la clase
Datos del paquete datos en la variable estática imagen_fuente*/
String file="";
String directorio="";
String path="";
//Crear y mostrar el cargador de archivos de imágenes
JFrame frame = new JFrame();
String apuntar_a_este_directorio= "imagenes/";
JFileChooser fc = new
JFileChooser(apuntar_a_este_directorio);
int returnVal = fc.showOpenDialog(frame);
if(returnVal == JFileChooser.APPROVE_OPTION) {
file= fc.getSelectedFile().getName();
path=fc.getSelectedFile().getPath();
img=JAI.create("fileload",path);
/*almacenar la imagen renderizada y sus datos en la clase Datos
*/
Datos.imagen_fuente=img;
Datos.nombre_imagen=""+file;
Datos.ancho_imagen=img.getWidth();
Datos.alto_imagen=img.getHeight();
}//fin if
}
}
Tratar de comprender este código.
3. Agregar el evento al item del menú Archivos: el IDE colocarlo en el estado Files y
Design.
42
En el árbol del panel Inspector ubicar el cursor en la etiqueta jMenuItemAbrir ,
Hacer clic derecho en el ratón. En el popmenú desplegado seleccionar Events > Action
> actionPerformed y el cursor quedará sumergido en la región donde se debe adicionar
el código que se desee se ejecute con este evento. Agregar el siguiente código,
private void jMenuItem_abrirActionPerformed(java.awt.event.ActionEvent evt) {
//abrir el archivo imagen fuente (sólo .jpg, .gif o .png
ManejadorArchivos manejador=new ManejadorArchivos();
manejador.abrirArchivo();
//pegar la imagen en el jScroolPane_imagen_fuente
display_imagen_fuente.set(Datos.imagen_fuente);
}
Obviamente aparecerán advertencias de errores debido a que no se han importado
algunos paquetes necesarios. Proceder a hacerlo,
import
import
import
import
import
manejo_archivos.*;
javax.swing.*;
java.awt.*;
com.sun.media.jai.widget.*;
datos.*;
Adicionalmente agregar el siguiente código que está en rojo esta clase (ProcesamientoDigitalImagenes.java),
public class ProcesamientoDigitalImagenes extends javax.swing.JFrame {
//Display donde se pegaran las imágenes renderizadas
DisplayJAI display_imagen_fuente=new DisplayJAI();
DisplayJAI display_imagen_resultado=new DisplayJAI();
/** Creates new form ProcesamientoDigitalImagenes */
public ProcesamientoDigitalImagenes() {
initComponents();
this.setSize(400,300);
this.setResizable(false);
this.setTitle("Análisis Digital de Imágenes");
43
/*pegar los display donde se desplegarán las imágenes renderizadas
*/
jScrollPane_imagen_fuente.getViewport().add(display_imagen_fuente,null);
jScrollPane_imagen_resultado.getViewport().add(display_imagen_resultado,null);
}
4. En la carpeta donde se está almacenando el proyecto cree una carpeta que se
denomina imágenes y agregue allí imágenes fuentes coyos formatos sean .jpg, .jpeg,
.gif, .png. Esto permiitirá acceder a las mismas rápidamente.
5. Compilar y ejecutar. Deberá desplegarse la siguiente GUI,
Seleccione del menú Archivos el item Abrir y se deberá desplegar un cuadro
(JFileChooser) que le permite escoger la imagen deseada,
Seleccionar la imagen; esta se desplegará en el panel izquierdo,
44
Felicitaciones, ya hizo un GRAN AVANCE en el desarrollo de este software.
Haciendo el histograma de la imagen fuente el cual se desplegará en un
JFrame independiente.
1. Siguiendo los mismos pasos que se realizaron en la sección anterior (Abrir la
imagen fuente…) se creará un paquete que se denominará utilidades. Proceder luego
a implementar dos clases de este paquete denominadas Histograma.java y
VisualizarHistograma.java. El panel Projects debe tener el siguiente aspecto,
Completar el código de la clase Histograma.java de tal forma que quede así,
package utilidades;
import
import
import
import
import
import
import
java.awt.*;
javax.swing.*;
java.awt.geom.*;
java.awt.event.*;
javax.media.jai.*;
java.awt.image.renderable.*;
datos.*;
public class Histograma extends javax.swing.JPanel {
//variable que almacena la imagen fuente
45
private RenderedOp fuente;
//variable que almacenará los datos del histograma
private Histogram histograma;
private int w = 256;
private final int h = 150;
private int numero_bandas;
int hdata_R[],hdata_G[],hdata_B[];
private float dx, dy_R,dy_G,dy_B;
/** Creates a new instance of Histograma */
public Histograma() {
//importar la imagen fuente que se encuentra en la clas Datos del paquete datos
fuente=Datos.imagen_fuente;
//crear los datos del histograma
crearDatosHistograma();
}
public void crearDatosHistograma(){
numero_bandas = ((( fuente ).getData()).getNumBands());//fuente
//Encontremos los valores extremos de la imagen
ParameterBlock pbMaxMin = new ParameterBlock();
pbMaxMin.addSource(fuente);
RenderedOp extrema = JAI.create("extrema", pbMaxMin);
// Valores extremos en todas las bandas
double[] allMins = (double[])extrema.getProperty("minimum");
double[] allMaxs = (double[])extrema.getProperty("maximum");
// Parámetros del histograma
int[] bins = new int[numero_bandas];
double[] bajos = new double[numero_bandas];
double[] altos = new double[numero_bandas];
for(int i=0; i<numero_bandas; i++) {
bins[i] = 256;
bajos[i] =allMins[i];
altos[i] = allMaxs[i];
}
// Construir el histograma con los parámetros dados
histograma = new Histogram(bins, bajos, altos);
// Create parameter block
ParameterBlock pb = new ParameterBlock();
pb.addSource(fuente);
RenderedOp op = JAI.create("histogram", pb, null);
histograma = (Histogram) op.getProperty("histogram");
//Dibujar el histograma
repaint();
}
private int[] getHistogramDataForBand(int band) {
int hdata[] = new int[histograma.getNumBins(band)];
for( int i=0; i< histograma.getNumBins(band); i++){
hdata[i] = histograma.getBinSize(band,i);
}
return(hdata);
}
public void paintComponent(Graphics g){
if(numero_bandas!=1){
hdata_R = getHistogramDataForBand(0);
hdata_G = getHistogramDataForBand(1);
hdata_B = getHistogramDataForBand(2);
}
else{
hdata_R = getHistogramDataForBand(0);
hdata_G =hdata_R;
hdata_B =hdata_R;
}
Graphics2D g2D =(Graphics2D) g;
int max_R =-1;
46
int max_G =-1;
int max_B =-1;
int hhist = h-15;
//max es la frecuencia más alta de los valores de 0 a 255
for(int i=0; i<hdata_R.length; i++){
if(hdata_R[i] > max_R)
max_R = hdata_R[i];
}//fin for
for(int i=0; i<hdata_G.length; i++){
if(hdata_G[i] > max_G)
max_G = hdata_G[i];
}//fin for
for(int i=0; i<hdata_B.length; i++){
if(hdata_B[i] > max_B)
max_B = hdata_B[i];
}//fin for
int length = hdata_R.length;
dx = (float)w / (float)length;
dy_R = (float)hhist / (float) max_R;
dy_G = (float)hhist / (float) max_G;
dy_B = (float)hhist / (float) max_B;
int x, y;
if(numero_bandas!=1){
for(int i=0; i<length; i++) {
x =(int)((float)i*dx);
//dibujar rojo
y = (int) ((float)hdata_R[i]*dy_R);
g2D.setPaint(Color.red);
g2D.drawLine(x, hhist, x, hhist - y);
//dibujar verde
y = (int) ((float)hdata_G[i]*dy_G);
g2D.setPaint(new Color(0,255,0,200));
g2D.drawLine(x, hhist, x, hhist - y);
//dibujar azul
y = (int) ((float)hdata_B[i]*dy_B);
g2D.setPaint(new Color(0,0,255,180));
g2D.drawLine(x, hhist, x, hhist - y);
}
}
else{
for(int i=0; i<length; i++) {
x =(int)((float)i*dx);
//dibujar blanco
y = (int) ((float)hdata_R[i]*dy_R);
g2D.setPaint(Color.white);
g2D.drawLine(x, hhist, x, hhist - y);
}
}
// Dibujar los indicadores de color: 0 a 255
BasicStroke lapiz=new
BasicStroke(5F,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g2D.setStroke(lapiz);
if(numero_bandas!=1){
//rojo
Line2D.Double rojo = new Line2D.Double(0.0d,(double)hhist+10,
(double)255,
(double)hhist+10);//w=255
g2D.setPaint(new GradientPaint(0, hhist, Color.black, 255, h, Color.red));//w=255
g2D.draw(rojo);
//verde
Line2D.Double verde = new Line2D.Double(0.0d,(double)hhist+20,
(double)255,
(double)hhist+20);//w=255
g2D.setPaint(new GradientPaint(0, hhist, Color.black, 255, h,
Color.green));//w=255
47
g2D.draw(verde);
//azul
Line2D.Double azul = new Line2D.Double(0.0d,(double)hhist+30,
(double)255,
(double)hhist+30);//w=255
g2D.setPaint(new GradientPaint(0, hhist, Color.black, 255, h,
Color.blue));//w=255
g2D.draw(azul);
}
else{
//grices
Line2D.Double azul = new Line2D.Double(0.0d,(double)hhist+15,
(double)255,
(double)hhist+15);//w=255
g2D.setPaint(new GradientPaint(0, hhist, Color.black, 255, h,
Color.white));//w=255
g2D.draw(azul);
}
}
}
En caso de ser de su interés, tratar de comprender el código anterior. Sin embargo
esto no es necesario.
Completar el código de la clase VisualizarHistograma.java de tal forma que quede así,
package utilidades;
import utilidades.*;
import javax.swing.*;
/**
*
* @author Diego Aristizábal Ramírez
*/
public class VisualizarHistograma extends JFrame{
private Histograma histograma ;
/** Creates a new instance of VisualizarHistograma */
public VisualizarHistograma() {
this.setTitle("Histograma");
this.setSize(260,220);
hacerHistograma();
this.setContentPane(histograma);
this.setResizable(false);
this.setVisible(true);
}
public void hacerHistograma(){
histograma= new Histograma();
}
}
Tratar de comprender el código anterior
2. Agregar el evento al item Histograma del menú Básico. Agregar el siguiente código
a este evento,
private
void
jMenuItem_histogramaActionPerformed(java.awt.event.ActionEvent
evt) {
// TODO add your handling code here:
//Desplegra el histograma de la imagen fuente
new VisualizarHistograma();
}
Tratar de comprender el código anterior
48
Obviamente aparecerán advertencias de errores debido a que no se han importado
algunos paquetes necesarios. Proceder a hacerlo,
import
import
import
import
import
import
manejo_archivos.*;
javax.swing.*;
java.awt.*;
com.sun.media.jai.widget.*;
datos.*;
utilidades.*;
public class ProcesamientoDigitalImagenes extends javax.swing.JFrame {
Tratar de comprender el código anterior.
Compilar y ejecutar. Abrir una imagen y obtenga el histograma. Deberá observarse
algo similar a lo siguiente,
Felicitaciones, ya hizo otro GRAN AVANCE en el desarrollo de este software.
Haciendo el despliegue de la imagen fuente en un JFrame que permita su plena
visualización.
1. Adicionar al paquete utilidades la clase VisualizarImagenCompleta.java con el
siguiente código,
package utilidades;
import java.awt.*;
import javax.swing.*;
import datos.*;
import javax.media.jai.RenderedOp;
/**
*
* @author Diego Aristizábal Ramírez
*/
public class VisualizarImagenCompleta extends JFrame{
private JLabel jLabelImagen=new JLabel();;
49
/** Creates a new instance of VisualizarImagenCompleta */
public VisualizarImagenCompleta() {
getContentPane().add(jLabelImagen);
Image imagen=Datos.imagen_fuente.getAsBufferedImage();
jLabelImagen.setIcon(new ImageIcon(imagen));
//this.setTitle(Datos.nombre_imagen[Datos.display_actual]);
this.setResizable(false);
this.setVisible(true);
this.pack();
}
}
Tratar de comprender el código anterior.
2. Agregar el evento al item Imagen Completa del menú Básico. Agregar el siguiente
código a este evento,
private void jMenuItem_imagen_completaActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
new VisualizarImagenCompleta();
}
Tratar de comprender el código anterior.
Compilar y ejecutar. Abrir una imagen y despliéguela en un cuadro que permita
visualizarla completamente. Deberá observarse algo similar a lo siguiente,
Felicitaciones, ya hizo otro GRAN AVANCE en el desarrollo de este software.
50
Convirtiendo en grices imagen fuente y la imagen resultante desplegándola en
el panel derecho.
1. Adicionar al paquete utilidades la clase ConvertirAGris.java
con el siguiente
código,
package utilidades;
import datos.*;
import javax.media.jai.RenderedOp;
import javax.media.jai.*;
import java.awt.image.renderable.*;
import java.awt.image.IndexColorModel;
/**
*
* @author Diego Luis Aristizábal Ramírez
*/
public class ConvertirAGris {
private RenderedOp fuente;
/** Creates a new instance of ConvertirAGris */
public ConvertirAGris() {
//importar la imagen de Datos
fuente=Datos.imagen_fuente;
//Con esto solucione el problema de de las imágenes GIF de una banda
if(fuente.getColorModel() instanceof IndexColorModel) {
convertirARGB(fuente);
}
//preguntar por el número de bandas de la imagen
int numero_bandas=fuente.getNumBands();
ParameterBlock pb=new ParameterBlock();
if(numero_bandas!=1){
pb.addSource(fuente);
}
if (numero_bandas==4){
double matrix[][]={
{0.33D,0.33D,0.33D,0.0D,0.0D}
};
pb.add(matrix);
}
if (numero_bandas==3){
double matrix[][]={
{0.33D,0.33D,0.33D,0.0D}
};
pb.add(matrix);
}
if(numero_bandas!=1){
Datos.imagen_resultado= (RenderedOp)JAI.create("bandcombine",pb,null);
} else {
Datos.imagen_resultado=fuente;
}
}
private void convertirARGB(RenderedOp im){
// El IndexColorModel
IndexColorModel icm = (IndexColorModel)fuente.getColorModel();
// Cache del número de elementos en cada banda del colormap.
int mapSize = icm.getMapSize();
// Agregar en arreglo los lookup table data.
byte[][] lutData = new byte[3][mapSize];
// Cargar el lookup table data de el IndexColorModel.
icm.getReds(lutData[0]);
icm.getGreens(lutData[1]);
icm.getBlues(lutData[2]);
51
// Crear el objeto lookup table .
LookupTableJAI lut = new LookupTableJAI(lutData);
// Reemplazar la imagen original with la de tres bandas RGB.
im = JAI.create("lookup", im, lut);
fuente=im;
}
}
Tratar de comprender el código anterior.
2. Agregar el evento al item Conversión a gris del menú Básico. Agregar el siguiente
código a este evento,
private void jMenuItem_grisActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
//Convertri a Gris
new ConvertirAGris();
//pegar la imagen que ya debe estar convertida en Gris en datos
display_imagen_resultado.set(Datos.imagen_resultado);
}
Tratar de comprender el código anterior.
Compilar y ejecutar. Abrir una imagen y convertirla en niveles de gris. Deberá
observarse algo similar a lo siguiente,
Felicitaciones, ya hizo otro GRAN AVANCE en el desarrollo de este software.
Convirtiendo al negativo de la imagen y desplegarlo en el panel derecho.
1. Adicionar al paquete utilidades la clase Negativo.java con el siguiente código,
package utilidades;
import datos.*;
import javax.media.jai.RenderedOp;
import javax.media.jai.*;
import java.awt.image.renderable.*;
public class Negativo {
private RenderedOp fuente;
/** Creates a new instance of Negativo */
public Negativo() {
//importar la imagen de Datos
fuente=Datos.imagen_fuente;
ParameterBlock pb=new ParameterBlock();
52
pb.addSource(fuente);
Datos.imagen_resultado= (RenderedOp)JAI.create("invert",pb,null);
}
}
Tratar de comprender el código anterior.
2. Agregar el evento al item Negativo del menú Básico. Agregar el siguiente código a
este evento,
private void jMenuItem_negativoActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
//Negativo
new Negativo();
//pegar la imagen que ya debe estar negativa en Datos
display_imagen_resultado.set(Datos.imagen_resultado);
}
Tratar de comprender el código anterior.
Compilar y ejecutar. Abrir una imagen y convertirla en negativo. Deberá observarse
algo similar a lo siguiente,
Felicitaciones, ya hizo otro GRAN AVANCE en el desarrollo de este software.
Binarizando la imagen y desplegando el resultado en el panel derecho.
1. Adicionar al paquete utilidades la clase Binarizar.java con el siguiente código,
package utilidades;
import
import
import
import
datos.*;
javax.media.jai.RenderedOp;
javax.media.jai.*;
java.awt.image.renderable.*;
public class Binarizar {
private RenderedOp fuente;
/** Creates a new instance of Binarizar */
public Binarizar() {
//importar la imagen de Datos
double corte =100;//nivel de gris de referencia para cortar
fuente=Datos.imagen_fuente;
ParameterBlockJAI pb = new ParameterBlockJAI("BandSelect");
pb.setSource(fuente, 0);
pb.setParameter("bandIndices",new int [] {0});
RenderedOp bandImage = JAI.create("BandSelect", pb);
53
pb = new ParameterBlockJAI("Binarize");
pb.setSource(bandImage, 0);
pb.setParameter("threshold", corte);
Datos.imagen_resultado = JAI.create("Binarize", pb);
}
}
Tratar de comprender el código anterior.
2. Agregar el evento al item Binarizar del menú Básico. Agregar el siguiente código a
este evento,
private void jMenuItem_binarizarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
//Binarizacion
new Binarizar();
//pegar la imagen que ya debe estar binarizada en Datos
display_imagen_resultado.set(Datos.imagen_resultado);
}
Tratar de comprender el código anterior.
Compilar y ejecutar. Abrir una imagen y binarizarla. Deberá observarse algo similar a
lo siguiente,
Felicitaciones, ya hizo otro GRAN AVANCE en el desarrollo de este software.
Aplicando Filtros a la imagen.
Filtros espaciales
1. Crear un paquete que se denominará filtros. El panel Projects debe tener el
siguiente aspecto,
54
2. El diseño de los filtros se realizará usando la propiedad de la OOP (Programación
Orientada a Objetos) denominada HERENCIA.
Adicionar al paquete filtros la clase FiltroEspacial.java con el siguiente código,
package filtros;
import datos.*;
import javax.media.jai.*;
public abstract class FiltroEspacial {
protected RenderedOp fuente;
protected int orden_filtro;
protected float divisor;
protected float coeficientes_filtro[];
/** Creates a new instance of FiltroEspacial */
public FiltroEspacial() {
fuente=Datos.imagen_fuente;
}
public abstract void aplicarFiltro();
}
Tratar de comprender el código anterior.
Adicionar al paquete filtros la clase FiltroEspacialPasoBajo.java con el siguiente
código,
package filtros;
import javax.media.jai.RenderedOp;
import javax.media.jai.*;
import java.awt.image.renderable.*;
import datos.*;
public class FiltroEspacialPasoBajo extends FiltroEspacial{
/** Creates a new instance of FiltroEspacialPasoBajo */
public FiltroEspacialPasoBajo() {
super();
}
public void aplicarFiltro(){
//normalicemos k_media_3x3
divisor=0f;
for(int i=0;i< orden_filtro*orden_filtro;i++){
divisor=divisor+ coeficientes_filtro[i];
}
if ( divisor > 0.0F ) {
for ( int i = 0; i < orden_filtro*orden_filtro; i++ ) {
55
coeficientes_filtro[i] = coeficientes_filtro[i] / divisor;
}
} else {
divisor = 1.0F;
}
ParameterBlock bloque = new ParameterBlock();
bloque.addSource(fuente);
KernelJAI kernel =new KernelJAI(orden_filtro, orden_filtro,coeficientes_filtro);
bloque.add(kernel);
Datos.imagen_resultado = (RenderedOp)JAI.create("convolve", bloque,null);
}
}
Tratar de comprender el código anterior.
Filtro Media 3x3
Adicionar al paquete filtros la clase k_media_3x3.java con el siguiente código,
package filtros;
public class k_media_3x3 extends FiltroEspacialPasoBajo {
/** Creates a new instance of k_media_3x3 */
public k_media_3x3() {
super();
//orden del filtro
orden_filtro=3;
//coeficientes del filtro
coeficientes_filtro=new float[9];
coeficientes_filtro[0]=1;
coeficientes_filtro[1]=1;
coeficientes_filtro[2]=1;
coeficientes_filtro[3]=1;
coeficientes_filtro[4]=1;
coeficientes_filtro[5]=1;
coeficientes_filtro[6]=1;
coeficientes_filtro[7]=1;
coeficientes_filtro[8]=1;
}
}
Tratar de comprender el código anterior
3. Agregar el evento al item Espaciales > Paso Bajo > Suavizantes > Media 3x3 del
menú Filtros. Agregar el siguiente código a este evento,
private void jMenuItem_media_3x3ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
k_media_3x3 filtro=new k_media_3x3();
filtro.aplicarFiltro();
//pegar la imagen que ya debe estar convertida en Gris en datos
display_imagen_resultado.set(Datos.imagen_resultado);
}
Tratar de comprender el código anterior.
Obviamente aparecerán advertencias de errores debido a que no se han importado
algunos paquetes necesarios. Proceder a hacerlo,
import
import
import
import
import
import
manejo_archivos.*;
javax.swing.*;
java.awt.*;
com.sun.media.jai.widget.*;
datos.*;
utilidades.*;
56
import filtros.*;
public class ProcesamientoDigitalImagenes extends javax.swing.JFrame {
Tratar de comprender el código anterior.
Compilar y ejecutar. Abrir una imagen y aplicarle el filtro Media 3x3. Deberá
observarse algo similar a lo siguiente,
Felicitaciones, ya hizo otro GRAN AVANCE en el desarrollo de este software.
Filtro Media 5x5
4. Adicionar al paquete filtros la clase k_media_5x5.java con el siguiente código,
package filtros;
public class k_media_5x5 extends FiltroEspacialPasoBajo {
/** Creates a new instance of k_media_5x5 */
public k_media_5x5() {
super();
//orden del filtro
orden_filtro=5;
//coeficientes del filtro
coeficientes_filtro=new float[25];
coeficientes_filtro[0]=1;
coeficientes_filtro[1]=1;
coeficientes_filtro[2]=1;
coeficientes_filtro[3]=1;
coeficientes_filtro[4]=1;
coeficientes_filtro[5]=1;
coeficientes_filtro[6]=1;
coeficientes_filtro[7]=1;
coeficientes_filtro[8]=1;
coeficientes_filtro[9]=1;
coeficientes_filtro[10]=1;
coeficientes_filtro[11]=1;
coeficientes_filtro[12]=1;
coeficientes_filtro[13]=1;
coeficientes_filtro[14]=1;
coeficientes_filtro[15]=1;
coeficientes_filtro[16]=1;
coeficientes_filtro[17]=1;
coeficientes_filtro[18]=1;
coeficientes_filtro[19]=1;
coeficientes_filtro[20]=1;
coeficientes_filtro[21]=1;
57
coeficientes_filtro[22]=1;
coeficientes_filtro[23]=1;
coeficientes_filtro[24]=1;
}
}
Tratar de comprender el código anterior.
3. Agregar el evento al item Espaciales > Paso Bajo > Suavizantes > Media 5x5 del
menú Filtros. Agregar el siguiente código a este evento,
private void jMenuItem_media_5x5ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
k_media_5x5 filtro=new k_media_5x5();
filtro.aplicarFiltro();
//pegar la imagen que ya debe estar convertida en Gris en datos
display_imagen_resultado.set(Datos.imagen_resultado);
}
Tratar de comprender el código anterior.
Compilar y ejecutar. Abrir una imagen y aplicarle el filtro Media 5x5. Deberá
observarse algo similar a lo siguiente,
Filtros Gauss 1 y Gauss 2
4. Adicionar al paquete filtros la clase k_gauss_1.java con el siguiente código,
package filtros;
/**
*
* @author Diego
*/
public class k_gauss_1 extends FiltroEspacialPasoBajo {
/** Creates a new instance of k_gauss_1 */
public k_gauss_1() {
super();
//orden del filtro
orden_filtro=3;
//coeficientes del filtro
coeficientes_filtro=new float[9];
coeficientes_filtro[0]=1;
coeficientes_filtro[1]=2;
58
coeficientes_filtro[2]=1;
coeficientes_filtro[3]=2;
coeficientes_filtro[4]=4;
coeficientes_filtro[5]=2;
coeficientes_filtro[6]=1;
coeficientes_filtro[7]=1;
coeficientes_filtro[8]=1;
}
}
Agregar el evento al item Espaciales > Paso Bajo > Suavizantes > Gauss 1 del menú
Filtros. Agregar el siguiente código a este evento,
private void jMenuItem_gauss_1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
k_gauss_1 filtro=new k_gauss_1();
filtro.aplicarFiltro();
//pegar la imagen que ya debe estar convertida en Gris en datos
display_imagen_resultado.set(Datos.imagen_resultado);
}
Tratar de comprender el código anterior.
Compilar y ejecutar. Abrir una imagen y aplicarle el filtro Gauss 1. Deberá observarse
algo similar a lo siguiente,
Agregar otro filtro suavizante al paquete filtros,
Gauss 2
package filtros;
/**
*
public class k_gauss_2 extends FiltroEspacialPasoBajo{
/** Creates a new instance of k_gauss_2 */
public k_gauss_2() {
super();
//orden del filtro
orden_filtro=3;
//coeficientes del filtro
coeficientes_filtro=new float[9];
coeficientes_filtro[0]=25;
coeficientes_filtro[1]=50;
coeficientes_filtro[2]=15;
coeficientes_filtro[3]=50;
59
coeficientes_filtro[4]=100;
coeficientes_filtro[5]=50;
coeficientes_filtro[6]=25;
coeficientes_filtro[7]=50;
coeficientes_filtro[8]=15;
}
}
Agregar al paquete filtros los siguientes filtros de paso alto e implementar los eventos
correspondientes de los item del menú de la aplicación:
De realce:
package filtros;
import javax.media.jai.RenderedOp;
import javax.media.jai.*;
import java.awt.image.renderable.*;
import datos.*;
public class FiltroEspacialPasoAltoRealce extends FiltroEspacial{
/** Creates a new instance of FiltroEspacialPasoAltoRealce */
public FiltroEspacialPasoAltoRealce() {
super();
}
public void aplicarFiltro(){
divisor=orden_filtro*orden_filtro;
for ( int i = 0; i < orden_filtro*orden_filtro; i++ ) {
coeficientes_filtro[i] = coeficientes_filtro[i] / divisor;
}
ParameterBlock bloque = new ParameterBlock();
bloque.addSource(fuente);
KernelJAI kernel =new KernelJAI(orden_filtro ,orden_filtro,coeficientes_filtro);
bloque.add(kernel);
Datos.imagen_resultado = (RenderedOp)JAI.create("convolve", bloque,null);
}
}
Sharpen 1
package filtros;
public class Sharpen_1 extends FiltroEspacialPasoAltoRealce {
/** Creates a new instance of Sharpen_1 */
public Sharpen_1() {
super();
//orden del filtro
orden_filtro=3;
//coeficientes del filtro
coeficientes_filtro=new float[9];
coeficientes_filtro[0]=0;
coeficientes_filtro[1]=-1;
coeficientes_filtro[2]=0;
coeficientes_filtro[3]=-1;
coeficientes_filtro[4]=5;
coeficientes_filtro[5]=-1;
coeficientes_filtro[6]=0;
coeficientes_filtro[7]=-1;
coeficientes_filtro[8]=0;
}
}
Sharpen 2
60
package filtros;
public class Sharpen_2 extends FiltroEspacialPasoAltoRealce {
/** Creates a new instance of Sharpen_2 */
public Sharpen_2() {
super();
//orden del filtro
orden_filtro=3;
//coeficientes del filtro
coeficientes_filtro=new float[9];
coeficientes_filtro[0]=-1;
coeficientes_filtro[1]=-1;
coeficientes_filtro[2]=-1;
coeficientes_filtro[3]=-1;
coeficientes_filtro[4]=9;
coeficientes_filtro[5]=-1;
coeficientes_filtro[6]=-1;
coeficientes_filtro[7]=-1;
coeficientes_filtro[8]=-1;
}
}
Sharpen 3
package filtros;
public class Sharpen_3 extends FiltroEspacialPasoAltoRealce {
/** Creates a new instance of Sharpen_3 */
public Sharpen_3() {
super();
//orden del filtro
orden_filtro=3;
//coeficientes del filtro
coeficientes_filtro=new float[9];
coeficientes_filtro[0]=-1;
coeficientes_filtro[1]=-2;
coeficientes_filtro[2]=-1;
coeficientes_filtro[3]=-2;
coeficientes_filtro[4]=13;
coeficientes_filtro[5]=-2;
coeficientes_filtro[6]=-1;
coeficientes_filtro[7]=-2;
coeficientes_filtro[8]=-1;
}
}
De detección de bordes
package filtros;
import javax.media.jai.RenderedOp;
import javax.media.jai.*;
import java.awt.image.renderable.*;
import datos.*;
public class FiltroEspacialPasoAltoDeteccionBordes extends FiltroEspacial{
/** Creates a new instance of FiltroEspacialPasoAltoDeteccionBordes */
public FiltroEspacialPasoAltoDeteccionBordes() {
super();
}
public void aplicarFiltro(){
ParameterBlock bloque = new ParameterBlock();
bloque.addSource(fuente);
KernelJAI kernel =new KernelJAI(orden_filtro ,orden_filtro,coeficientes_filtro);
bloque.add(kernel);
61
Datos.imagen_resultado = (RenderedOp)JAI.create("convolve", bloque,null);
}
}
Laplaciano 1
package filtros;
public class Laplaciano_1 extends FiltroEspacialPasoAltoDeteccionBordes{
/** Creates a new instance of Laplaciano_1 */
public Laplaciano_1() {
super();
//orden del filtro
orden_filtro=3;
//coeficientes del filtro
coeficientes_filtro=new float[9];
coeficientes_filtro[0]=0;
coeficientes_filtro[1]=-1;
coeficientes_filtro[2]=0;
coeficientes_filtro[3]=-1;
coeficientes_filtro[4]=4;
coeficientes_filtro[5]=-1;
coeficientes_filtro[6]=0;
coeficientes_filtro[7]=-1;
coeficientes_filtro[8]=0;
}
}
Laplaciano 2
package filtros;
public class Laplaciano_2 extends FiltroEspacialPasoAltoDeteccionBordes{
/** Creates a new instance of Laplaciano_2 */
public Laplaciano_2() {
super();
//orden del filtro
orden_filtro=3;
//coeficientes del filtro
coeficientes_filtro=new float[9];
coeficientes_filtro[0]=-1;
coeficientes_filtro[1]=-1;
coeficientes_filtro[2]=-1;
coeficientes_filtro[3]=-1;
coeficientes_filtro[4]=8;
coeficientes_filtro[5]=-1;
coeficientes_filtro[6]=-1;
coeficientes_filtro[7]=-1;
coeficientes_filtro[8]=-1;
}
}
Laplaciano 3
package filtros;
public class Laplaciano_3 extends FiltroEspacialPasoAltoDeteccionBordes {
/** Creates a new instance of Laplaciano_3 */
public Laplaciano_3() {
super();
//orden del filtro
orden_filtro=5;
//coeficientes del filtro
coeficientes_filtro=new float[25];
coeficientes_filtro[0]=-1;
coeficientes_filtro[1]=-1;
62
coeficientes_filtro[2]=-1;
coeficientes_filtro[3]=-1;
coeficientes_filtro[4]=-1;
coeficientes_filtro[5]=-1;
coeficientes_filtro[6]=-1;
coeficientes_filtro[7]=-1;
coeficientes_filtro[8]=-1;
coeficientes_filtro[9]=-1;
coeficientes_filtro[10]=-1;
coeficientes_filtro[11]=-1;
coeficientes_filtro[12]=24;
coeficientes_filtro[13]=-1;
coeficientes_filtro[14]=-1;
coeficientes_filtro[15]=-1;
coeficientes_filtro[16]=-1;
coeficientes_filtro[17]=-1;
coeficientes_filtro[18]=-1;
coeficientes_filtro[19]=-1;
coeficientes_filtro[20]=-1;
coeficientes_filtro[21]=-1;
coeficientes_filtro[22]=-1;
coeficientes_filtro[23]=-1;
coeficientes_filtro[24]=-1;
}
}
El panel Projects debe tener en estos momentos el siguiente aspecto,
Compilar y ejecutar la aplicación. Abrir una imagen y realizar pruebas.
Aplicando transformadas a la imagen.
Transformada de Fourier
1. Crear un paquete que se denominará transformadas. El panel Projects debe tener
el siguiente aspecto,
63
2. Adicionar al paquete transformadas la clase TransformadaFourier.java con el
siguiente código,
package transformadas;
import datos.*;
import javax.media.jai.RenderedOp;
import java.awt.image.renderable.*;
import javax.media.jai.JAI;
import javax.media.jai.operator.*;
public class TransformadaFourier {
private
private
private
private
RenderedOp fuente;
RenderedOp resultado;
ParameterBlock bloque=new ParameterBlock();
ParameterBlock bloque1=new ParameterBlock();
/** Creates a new instance of TransformadaFourier */
public TransformadaFourier() {
//Importa la imagen fuente que ya debe estar en Datos
fuente=Datos.imagen_fuente;
//Convierte la imagen en grices.
convertirAGrices();
bloque.addSource(fuente);
//enganchar la imagen para aplicarle la transformada
bloque.add(DFTDescriptor.SCALING_DIMENSIONS);//UNITARY);
bloque.add(DFTDescriptor.REAL_TO_COMPLEX);
RenderedOp imagen_intermedia=(RenderedOp)JAI.create("dft",bloque,null);
//imagen de la magnitud de la transformada
bloque1.addSource(imagen_intermedia);
bloque1.add(DFTDescriptor.COMPLEX_TO_REAL);
}
public void magnitudTransformadaFourier(){
RenderedOp resultado_intermedio=(RenderedOp)JAI.create("magnitude",bloque1,null);
//centremos la transformada
ParameterBlock bloque2=new ParameterBlock();
bloque2.addSource(resultado_intermedio);
Datos.imagen_resultado=(RenderedOp)JAI.create("periodicshift",bloque2,null);
}
public void faseTransformadaFourier(){
RenderedOp resultado_intermedio=(RenderedOp)JAI.create("phase",bloque1,null);
//centremos la transformada
ParameterBlock bloque2=new ParameterBlock();
bloque2.addSource(resultado_intermedio);
Datos.imagen_resultado=(RenderedOp)JAI.create("periodicshift",bloque2,null);
}
public void potenciaTransformadaFourier(){
RenderedOp
resultado_intermedio=(RenderedOp)JAI.create("magnitudesquared",bloque1,null);
//centremos la transformada
64
ParameterBlock bloque2=new ParameterBlock();
bloque2.addSource(resultado_intermedio);
Datos.imagen_resultado=(RenderedOp)JAI.create("periodicshift",bloque2,null);
}
private void convertirAGrices(){
int numero_bandas=fuente.getNumBands();
ParameterBlock pb=new ParameterBlock();
if(numero_bandas!=1){
pb.addSource(fuente);
}
if (numero_bandas==3){
double matrix[][]={
{0.114D,0.587D,0.299D,0.0D}
};
pb.add(matrix);
fuente= (RenderedOp)JAI.create("bandcombine",pb,null);
}
}
}
Recordar que se debe añadir a la clase principal la instrucción,
import transformadas.*;
import
import
import
import
import
import
import
import
manejo_archivos.*;
javax.swing.*;
java.awt.*;
com.sun.media.jai.widget.*;
datos.*;
utilidades.*;
filtros.*;
transformadas.*;
public class ProcesamientoDigitalImagenes extends javax.swing.JFrame {
Implementar los eventos correspondientes de los item de la transformada de Fourier
del menú de la aplicación. Al evento de item magnitud agregar el siguiente códifo,
TransformadaFourier fourier=new TransformadaFourier();
fourier.magnitudTransformadaFourier();
display_imagen_resultado.set(Datos.imagen_resultado);
Al evento del item Fase agregar este código,
TransformadaFourier fourier=new TransformadaFourier();
fourier.faseTransformadaFourier();
display_imagen_resultado.set(Datos.imagen_resultado);
Al evento del item Potencia agregar este código,
TransformadaFourier fourier=new TransformadaFourier();
fourier.potenciaTransformadaFourier();
display_imagen_resultado.set(Datos.imagen_resultado);
Compilar y ejecutar la aplicación. Abrir una imagen y obtener la magnitud, la fase y el
espectro de potencia de ella. Se debe obtener algo así,
65
Magnitud
Fase
Potencia
PULIR LA APLICACIÖN
1. Antes de abrir una imagen deben estar deshabilitadas todas las opciones que
necesitan de la misma para ejecutarse. Esto evitará errores en la ejecución y no
distraerá al usuario.
Para esto se deben deshabilitar los ítems listados a continuación. En el modo Design
entrar al árbol del panel Inspector y ubicar el cursor sobre las etiquetas respectivas;
hacer clic en el botón derecho del ratón y seleccionar del popmenú desplegado
Properties. Desactivar la opción enabled. De esta forma al empezar la aplicación
estos items estarán desactivados.
Lista:
jMenuItem_guardar;
jMenuItem_imprimir;
jMenuItem_histograma;
jMenuItem_imagen_completa;
jMenuItem_gris;
jMenuItem_negativo;
jMenuItem_binarizar;
jMenuItem_sharpe_1;
jMenuItem_sharpen_2;
jMenuItem_sharpen_3;
jMenuItem_laplaciano_1;
jMenuItem_laplaciano_2;
jMenuItem_laplaciano_3;
jMenuItem_media_3x3;
jMenuItem_media_5x5;
jMenuItem_gauss_1;
66
jMenuItem_gauss_2;
jMenu_personal;
jMenu_frecuenciales;
jMenuItem_magnitud;
jMenuItem_fase;
jMenuItem_potencia;
jMenu_coseno;
jMenu_gabor;
jMenu_wavelet;
Compilar y ejecutar la aplicación. Se debe observar deshabilitados los ítems
respectivos.
Cuando se abre la imagen se deberán habilitar los ítems generen eventos para
procesar la imagen. Se habilitarán los siguientes ítems:
jMenuItem_histograma;
jMenuItem_imagen_completa;
jMenuItem_gris;
jMenuItem_negativo;
jMenuItem_binarizar;
jMenuItem_sharpe_1;
jMenuItem_sharpen_2;
jMenuItem_sharpen_3;
jMenuItem_laplaciano_1;
jMenuItem_laplaciano_2;
jMenuItem_laplaciano_3;
jMenuItem_media_3x3;
jMenuItem_media_5x5;
jMenuItem_gauss_1;
jMenuItem_gauss_2;
jMenuItem_magnitud;
jMenuItem_fase;
jMenuItem_potencia;
Debido a que no se ha implementado el código respectivo, no se habilitarán los
siguientes ítems:
jMenuItem_guardar;
jMenuItem_imprimir;
jMenu_personal;
jMenu_frecuenciales;
67
jMenu_coseno;
jMenu_gabor;
jMenu_wavelet;
Para esto se debe agregar el siguiente código en rojo al código ya existente en la clase
ProcesamientoDigitalImagenes.java:
private void jMenuItem_abrirActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
//abrir el archivo imagen fuente (sólo .jpg, .gif o .png
ManejadorArchivos manejador=new ManejadorArchivos();
manejador.abrirArchivo();
//pegar la imagen en el jScroolPane_imagen_fuente
display_imagen_fuente.set(Datos.imagen_fuente);
habilitarItems();
}
private void habilitarItems(){
jMenuItem_histograma.setEnabled(true);
jMenuItem_imagen_completa.setEnabled(true);;
jMenuItem_gris.setEnabled(true);;
jMenuItem_negativo.setEnabled(true);;
jMenuItem_binarizar.setEnabled(true);;
jMenuItem_sharpe_1.setEnabled(true);;
jMenuItem_sharpen_2.setEnabled(true);;
jMenuItem_sharpen_3.setEnabled(true);;
jMenuItem_laplaciano_1.setEnabled(true);;
jMenuItem_laplaciano_2.setEnabled(true);;
jMenuItem_laplaciano_3.setEnabled(true);;
jMenuItem_media_3x3.setEnabled(true);;
jMenuItem_media_5x5.setEnabled(true);;
jMenuItem_gauss_1.setEnabled(true);;
jMenuItem_gauss_2.setEnabled(true);;
jMenuItem_magnitud.setEnabled(true);;
jMenuItem_fase.setEnabled(true);;
jMenuItem_potencia.setEnabled(true);;
}
Compilar y ejecutar la aplicación. Una vez se abra una imagen deberán aparecer
habilitados de nuevo los ítems deseados.
Una vez se implemente el código faltante se deberán habilitar los ítems,
jMenuItem_guardar;
jMenuItem_imprimir;
jMenu_personal;
jMenu_frecuenciales;
jMenu_coseno;
jMenu_gabor;
jMenu_wavelet;
Distribuir la aplicación
Dirigirse a la carpeta donde está almacenado el proyecto. Entrar a la subcarpeta dist
El archivo .jar corresponde a la aplicación que se entregará al cliente. En este caso es
ProcesamietoDigitalImagenes.jar. Se puede copiar en otra carpeta o en un disco de
almacenamiento. El cliente haciendo doble clic sobre ese archivo ejecutará la
aplicación; obviamente debe poseer en su computador los dos runtime, es decir, el jre
68
1.6 de java y el jre de jai. El cliente deberá crear una subcarpeta denominada
imagenes en la misma carpeta donde ubicó la aplicación; esto con el fin de depositar
en ella las imágenes a procesar y poder acceder más fácil a las mismas.
FELICITACIONES, HA LOGRADO UN AVACE INMENSO EN EL DESARROLLO DE
SOFTWARE EMPLEANDO EL NETBEANS.
69