Búsqueda por palabras claves

No se olviden de consultar por palabras claves! Ejemplo de Estructura de datos en java, tutorial de estructura de datos
Búsqueda personalizada

lunes, 24 de octubre de 2011

Cómo realizar la comparación de 2 imágenes y determinar si son iguales o similares

Esta entrada contiene el código para determinar si 2 imagenes son iguales, si puede variar los parámetros para que dos imágenes que tienen similitud los reconozca como similares.

Está realizado en Netbeans en un proyecto en consola para ello se debe crear un nuevo proyecto Java Aplication, para mi caso el nombre es ComparacionImagen.

A continuación crear una nueva clase, dar clic sobre el paquete y luego crear la Clase ImageCompare.

package comparacionimagen;
import javax.swing.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;

 public class ImageCompare {

 protected BufferedImage img1 = null;
 protected BufferedImage img2 = null;
 protected BufferedImage imgc = null;
 protected int comparex = 0;
 protected int comparey = 0;
 protected int factorA = 0;
 protected int factorD = 10;
 protected boolean match = false;
 protected int debugMode = 0; // 1: textual indication of change, 2: difference of factors

 // constructor 1. use filenames
 public ImageCompare(String file1, String file2) {
  this(loadJPG(file1), loadJPG(file2));
 }

 // constructor 2. use awt images.
 public ImageCompare(Image img1, Image img2) {
  this(imageToBufferedImage(img1), imageToBufferedImage(img2));
 }

 // constructor 3. use buffered images. all roads lead to the same place. this place.
 public ImageCompare(BufferedImage img1, BufferedImage img2) {
  this.img1 = img1;
  this.img2 = img2;
  autoSetParameters();
 }

 // like this to perhaps be upgraded to something more heuristic in the future.
 protected void autoSetParameters() {
  comparex = 10;
  comparey = 10;
  factorA = 10;
  factorD = 10;
 }

 // set the parameters for use during change detection.
 public void setParameters(int x, int y, int factorA, int factorD) {
  this.comparex = x;
  this.comparey = y;
  this.factorA = factorA;
  this.factorD = factorD;
 }

 // want to see some stuff in the console as the comparison is happening?
 public void setDebugMode(int m) {
  this.debugMode = m;
 }

 // compare the two images in this object.
 public void compare() {
  // setup change display image
  imgc = imageToBufferedImage(img2);
  Graphics2D gc = imgc.createGraphics();
  gc.setColor(Color.RED);
  // convert to gray images.
  img1 = imageToBufferedImage(GrayFilter.createDisabledImage(img1));
  img2 = imageToBufferedImage(GrayFilter.createDisabledImage(img2));
  // how big are each section
  int blocksx = (int)(img1.getWidth() / comparex);
  int blocksy = (int)(img1.getHeight() / comparey);
  // set to a match by default, if a change is found then flag non-match
  this.match = true;
  // loop through whole image and compare individual blocks of images
  for (int y = 0; y < comparey; y++) {
   if (debugMode > 0) System.out.print("|");
   for (int x = 0; x < comparex; x++) {
    int b1 = getAverageBrightness(img1.getSubimage(x*blocksx, y*blocksy, blocksx - 1, blocksy - 1));
    int b2 = getAverageBrightness(img2.getSubimage(x*blocksx, y*blocksy, blocksx - 1, blocksy - 1));
    int diff = Math.abs(b1 - b2);
    if (diff > factorA) { // the difference in a certain region has passed the threshold value of factorA
     // draw an indicator on the change image to show where change was detected.
     gc.drawRect(x*blocksx, y*blocksy, blocksx - 1, blocksy - 1);
     this.match = false;
    }
    if (debugMode == 1) System.out.print((diff > factorA ? "X" : " "));
    if (debugMode == 2) System.out.print(diff + (x < comparex - 1 ? "," : ""));
   }
   if (debugMode > 0) System.out.println("|");
  }
 }

 // return the image that indicates the regions where changes where detected.
 public BufferedImage getChangeIndicator() {
  return imgc;
 }

 // returns a value specifying some kind of average brightness in the image.
 protected int getAverageBrightness(BufferedImage img) {
  Raster r = img.getData();
  int total = 0;
  for (int y = 0; y < r.getHeight(); y++) {
   for (int x = 0; x < r.getWidth(); x++) {
    total += r.getSample(r.getMinX() + x, r.getMinY() + y, 0);
   }
  }
  return (int)(total / ((r.getWidth()/factorD)*(r.getHeight()/factorD)));
 }


 // returns true if image pair is considered a match
 public boolean match() {
  return this.match;
 }

 // buffered images are just better.
 protected static BufferedImage imageToBufferedImage(Image img) {
  BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
  Graphics2D g2 = bi.createGraphics();
  g2.drawImage(img, null, null);
  return bi;
 }

 // write a buffered image to a jpeg file.
 protected static void saveJPG(Image img, String filename) {
  BufferedImage bi = imageToBufferedImage(img);
  FileOutputStream out = null;
  try {
   out = new FileOutputStream(filename);
  } catch (java.io.FileNotFoundException io) {
   System.out.println("File Not Found");
  }
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
  JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
  param.setQuality(0.8f,false);
  encoder.setJPEGEncodeParam(param);
  try {
   encoder.encode(bi);
   out.close();
  } catch (java.io.IOException io) {
   System.out.println("IOException");
  }
 }

 // read a jpeg file into a buffered image
 protected static Image loadJPG(String filename) {
  FileInputStream in = null;
  try {
   in = new FileInputStream(filename);
  } catch (java.io.FileNotFoundException io) {
   System.out.println("File Not Found");
  }
  JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
  BufferedImage bi = null;
  try {
   bi = decoder.decodeAsBufferedImage();
   in.close();
  } catch (java.io.IOException io) {
   System.out.println("IOException");
  }
  return bi;
 }

}

En el método main debemos ir calibrando a nuestras necesidades
package comparacionimagen;


/**
 *
 * @author Paulo
 */
public class Main {

  

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       // Especificamos las imagenes que deseamos comparar, cada imagene debe tener una dimension de 300 x 225.
  ImageCompare ic = new ImageCompare("e:\\test1.jpg", "e:\\test5.jpg");
  // Set the comparison parameters.
  //   (numero de regiones verticales, numero de regiones horizontales, sensibilidad, stabilizer)
  ic.setParameters(12, 12, 15, 10); 
                 // Display some indication of the differences in the image.
  ic.setDebugMode(2);
  // Compare.
  ic.compare();
  // Display if these images are considered a match according to our parameters.
  System.out.println("Match: " + ic.match());
  // si las imagenes son distintas se creará una nueva imagen con nombre changes.jpg en la que se muestre las regiones que son distintas pues sobrepasan la sensibilidad.
  if (!ic.match()) {
   ImageCompare.saveJPG(ic.getChangeIndicator(), "e:\\changes.jpg");
  }
 }

}

Información tomada de http://mindmeat.blogspot.com/2008/07/java-image-comparison.html

jueves, 20 de octubre de 2011

Ejemplo de GUI Java Swing

Para realizar una aplicación con Formultario en java, debemos usar el paquete Swing, para ello debemos saber en terminos generales que disponemos de la clase JFrame (Ventana), misma que tiene un panel por defento, para ello podemos hacer uso del método getContentPane, por otro lado debemos implementar la interfaz ActionListener para poder controlar los eventos que se producen.

El siguiente ejercicio es una pequeña simulación de una aplicación para venta de productos de un tienda de juegos.

El ejercicio está desarrollado en Netbeans, los pasos para generar el proyecto son los siguientes:

1.- Crear un nuevo proyecto tipo Java Aplication. (Para este caso lo he puesto Venta Productos)
2.- Sobre el paquete Creamos la clase Producto  que va permitir almacenar la información de cada juego. El código de la clase es el siguiente:
package ventaproductos;

/**
 *
 * @author Paulo
 */
public class Producto {
    private String nombre;
    private String tamanio;
    private String categoria;
    private int disponibles;
    private double precio;

    public Producto(String nombre, String tamanio, String categoria, int disponibles, double precio) {
        this.nombre = nombre;
        this.tamanio = tamanio;
        this.categoria = categoria;
        this.disponibles = disponibles;
        this.precio=precio;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the tamanio
     */
    public String getTamanio() {
        return tamanio;
    }

    /**
     * @param tamanio the tamanio to set
     */
    public void setTamanio(String tamanio) {
        this.tamanio = tamanio;
    }

    /**
     * @return the categoria
     */
    public String getCategoria() {
        return categoria;
    }

    /**
     * @param categoria the categoria to set
     */
    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    /**
     * @return the disponibles
     */
    public int getDisponibles() {
        return disponibles;
    }

    /**
     * @param disponibles the disponibles to set
     */
    public void setDisponibles(int disponibles) {
        this.disponibles = disponibles;
    }

    /**
     * @return the precio
     */
    public double getPrecio() {
        return precio;
    }

    /**
     * @param precio the precio to set
     */
    public void setPrecio(double precio) {
        this.precio = precio;
    }

}

3.- Sobre el paquete Crear una nueva Clase llamada Ventana. Esta clase debe extender de JFrame e implementar la Interfaz ActionListener. Para organizar la información he decidio usar el Layout en modo GridLayout es decir una matriz de N x M en los cuales todos los elementos tienen el mismo tamaño.

Esto se lo puede ver a continuación.



Uploaded with ImageShack.us

Ahora continuando con la programación en el constructor debemos instanciar los Objetos tipo Producto y agregarlos al Arraylist.



Uploaded with ImageShack.us


En seguida debemos definir el título, dimensiones, layout, etc. es decir la configuración de mi Ventana, además agregamos los componentes al panel.



Uploaded with ImageShack.us


Por último debemos definir el actionListener para los controles de los cuales debemos controlar los eventos e implementar el código del método ActionPerforme.

El Código completo de la Clase ventana es el siguiente:


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ventaproductos;

import com.sun.corba.se.impl.naming.cosnaming.InterOperableNamingImpl;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 *
 * @author Paulo
 */
public class Ventana extends JFrame implements ActionListener {
   
    // Componentes que serán agregados a mi Ventana.
    private JComboBox cboJuegos;
    private JLabel lblJuego, lblNombre, lblDisponible, lblTamanio, lblCategoria, lblPrecio, lblCantidad;
    private JTextField txtNombre, txtDisponibles, txtTamanio, txtCategoria, txtPrecio, txtCantidad;
    private JButton pedir, vender;
    // Un arreglo dinámico para los productos(Juegos).
    ArrayList juegos;
    
    // Constructor
    public Ventana(){
        
         juegos=new ArrayList();
         Producto juego;
         juego =new Producto("Cars","102kb","Deportes", 30,1.30F);
         juegos.add(juego);

         juego =new Producto("Cars2","103kb","Deportes", 20,1.50F);
         juegos.add(juego);
         juego =new Producto("FIFA 2011","204kb","Deportes", 35,1.80F);
         juegos.add(juego);
         juego =new Producto("Matador","312kb","Accion", 20,1.10F);
         juegos.add(juego);
        
         this.setSize(500, 400);
         this.setLayout(new GridLayout(8,2,5,5));
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         this.setTitle("MI ventana de Ventas de Juegos");     
         // Instanciamos y Agregamos los componente al panel
         lblJuego=new JLabel("Seleccione el Juego");
         this.getContentPane().add(lblJuego);
         cboJuegos=new JComboBox();
         for(Producto x:juegos ){
             cboJuegos.addItem(x.getNombre());
         }
         this.getContentPane().add(cboJuegos); // agregando al panel
         lblNombre=new JLabel("Nombre del Juego");
         this.getContentPane().add(lblNombre);
         txtNombre=new JTextField(40);
         this.getContentPane().add(txtNombre);

         lblCategoria=new JLabel("Categoria del Juego");
         this.getContentPane().add(lblCategoria);
         txtCategoria=new JTextField(40);
         this.getContentPane().add(txtCategoria);

                 lblTamanio=new JLabel("Tamaño del Juego");
         this.getContentPane().add(lblTamanio);
         txtTamanio=new JTextField(40);
         this.getContentPane().add(txtTamanio);

         lblPrecio=new JLabel("Precio del Juego");
         this.getContentPane().add(lblPrecio);
         txtPrecio=new JTextField(40);
         this.getContentPane().add(txtPrecio);
 lblDisponible=new JLabel("Disponible: ");
         this.getContentPane().add(lblDisponible);
         txtDisponibles=new JTextField(40);
         this.getContentPane().add(txtDisponibles);

         lblCantidad=new JLabel("Cantidad:");
         this.getContentPane().add(lblCantidad);
         txtCantidad=new JTextField(40);
         this.getContentPane().add(txtCantidad);

         pedir=new JButton("Pedir");
         vender=new JButton("Vender");
         this.getContentPane().add(pedir);
         this.getContentPane().add(vender);
         cboJuegos.addActionListener(this);
         pedir.addActionListener(this);
          vender.addActionListener(this);
    }  
    // Implementación del método abstracto
    public void actionPerformed(ActionEvent e) {
        int indice=cboJuegos.getSelectedIndex();
        if(e.getSource()==cboJuegos){
            
            txtNombre.setText(juegos.get(indice).getNombre());
            txtCategoria.setText(juegos.get(indice).getCategoria());
            txtTamanio.setText(juegos.get(indice).getTamanio());
            txtPrecio.setText(String.valueOf(juegos.get(indice).getPrecio()));
            txtDisponibles.setText(String.valueOf(juegos.get(indice).getDisponibles()));
        }

        if(e.getSource()==pedir){
              juegos.get(indice).setDisponibles(juegos.get(indice).getDisponibles()+Integer.parseInt(txtCantidad.getText()));
              txtDisponibles.setText(String.valueOf(juegos.get(indice).getDisponibles()));
        }
       if(e.getSource()==vender ){
           if((juegos.get(indice).getDisponibles()-Integer.parseInt(txtCantidad.getText()))>=0){
              juegos.get(indice).setDisponibles(juegos.get(indice).getDisponibles()-Integer.parseInt(txtCantidad.getText()));
              txtDisponibles.setText(String.valueOf(juegos.get(indice).getDisponibles()));
           }else
           {
               JOptionPane.showMessageDialog(null, "NO se dispone de la cantidad !!!");
           }
        }
    }
}


Ahora lo único que nos queda es crear un objeto tipo ventana en el método main y ejecutar.

package ventaproductos;

/**
 *
 * @author Paulo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Ventana v=new Ventana();
        v.setVisible(true);
        //v.pack();
    }

}


La ejecución del programa se verá asi:



Uploaded with ImageShack.us

sábado, 8 de octubre de 2011

uso de matrices en java

/*
package ejerciciob6matriz;

import java.util.Scanner;

/**
 *
 * @author Paulo
 */
public class Main {

    public static void leerMatriz(float m[][], int f, int c) {
        Scanner in = new Scanner(System.in);

        for (int i = 0; i < f; i++) {
            for (int j = 0; j < c; j++) {
                System.out.print("Ingrese el elemento: ");
                m[i][j] = in.nextFloat();
            }
        }

    }

    public static void simetrica(float m[][], float s[][], int f, int c, int signo) {
        for (int i = 0; i < f; i++) {
            for (int j = 0; j < c; j++) {
                s[i][j] = (m[i][j] + signo* m[j][i]) / 2;
            }
        }
    }

    public static void imprimirMatriz(float m[][], int f, int c) {
        for (int i = 0; i < f; i++) {
            for (int j = 0; j < c; j++) {
                System.out.print(m[i][j]+"  ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        // TODO code application logic here
        float matriz[][] = new float[3][3];
        float simetrica[][] = new float[3][3];
        float antiSimetrica[][] = new float[3][3];

        System.out.println("Ingreso de la matriz");
        leerMatriz(matriz, 3, 3);
        System.out.println("\nMatriz simetrica");
        simetrica(matriz, simetrica, 3, 3,1);
        imprimirMatriz(simetrica, 3, 3);
        System.out.println("\nMatriz antisimetrica");
        simetrica(matriz, antiSimetrica, 3, 3,-1);
        imprimirMatriz(antiSimetrica, 3, 3);
    }
}

Descarga el proyecto desarrollado en Netbeans Ejercicio6

Arreglos en Java método uso de bucle while

package ejercicio5barreglos;

import java.util.Scanner;

/**
 *
 * @author Paulo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void lectura(float m[], int f) {
        Scanner ingreso = new Scanner(System.in);
        for (int cont = 0; cont < f; cont++) {
            System.out.print("Ingrese el elemento: ");
            m[cont] = ingreso.nextFloat();
        }
    }


    public static void main(String[] args) {
        // TODO code application logic here
        float dato[];
        dato = new float[10];
        int numero;
        Scanner ingreso = new Scanner(System.in);

        do {
            System.out.print("Ingrese el numero de elementos: ");
            numero = ingreso.nextInt();
        } while (numero < 1);

        float notas[] = new float[numero];
        System.out.println("Ingreso primer arreglo:");
        lectura(dato, numero);
        System.out.println("Ingreso segundo arreglo:");
        lectura(notas, numero);
        System.out.println("Imprimir primer arreglo:");
        imprimir(dato, numero);
        System.out.println("Imprimir segundo arreglo:");
        imprimir(notas, numero);
    }

    public static void imprimir(float n[], int f) {
        int indice = 0;
        while (indice < f) {
            System.out.print(n[indice++]+" ");
        }

    }
}
Descarga el proyecto desarrollado con Netbeans Ejercicio5

Sentencia switch numeros romanos en Java

package ejercicio4switch;

import java.util.Scanner;

/**
 *
 * @author Paulo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // Ejercicio que permite el ingreso de un número en arábigo y transforma
        // a número Romano

        Scanner entrada = new Scanner(System.in);
        int arabigo;

        System.out.println("Ingrese un número entre 1 y 5: ");
        arabigo = entrada.nextInt();
        switch (arabigo) {
            case 1:
                System.out.println(arabigo+" en Romano es I");
                break; // No olvidar la sentencia de roptura de bucle.
            case 2:
                System.out.println(arabigo+" en Romano es II");
                break;
            case 3:
                System.out.println(arabigo+" en Romano es III");
                break;
            case 4:
                System.out.println(arabigo+" en Romano es IV");
                break;
            case 5:
                System.out.println(arabigo+" en Romano es V");
                break;
            default:
                System.out.println("En la nueva version continuamos con mas numeros");
        }

    }
}

Descarga el proyecto desarrollado con Netbeans Ejercicio4

Ejercicio con for java, ingreso de datos java

package pryejerciciob;
import java.util.Scanner;
/**
 *
 * @author Paulo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        /* La clase Scanner proporciona métodos para ingresar
        datos desde el teclado*/

        Scanner ingreso=new Scanner(System.in);
        int tabla, resultado, cont;

        do{
           System.out.print("Ingrese el numero de la tabla: ");
           // utilizamos el método nextInt para leer un entero desde teclado
           tabla=ingreso.nextInt();
        }while(tabla<1);

        for(cont=1;cont<=12;cont++){
            // observe como se imprime en pantalla el valor de las variables
            // agregando textos a la misma línea
           System.out.println(tabla+" * "+ cont +" = "+tabla*cont);
        }
    }
}

Descargar el proyecto desarrollado con Netbeans Ejercicio3

Ejecicios de Condicional en Java

/*
 
package pryejercicioa;

/**
 *
 * @author Paulo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        float minimo = 14.00F;
        float nota = 17.56f;
        boolean resultado = true;

        resultado = (minimo < nota);
        System.out.println("El valor logico de resultado es: " + resultado);

        int cont = 10;
        String mensaje = "";
       // es un condicional que actual como un if-else
       // No es común usarlo.
        mensaje = (cont % 2 == 0) ? "PAR" : "IMPAR";
        System.out.println("EL NUMERO ES " + mensaje);


        System.out. println("Resolucion del mismo ejercicio con if-else");
        // Obtendrémos el mismo resultado, analice las diferencias en la escritura
        // esta sentencia de control es la mas usada.
        if(cont%2==0)
            mensaje="PAR" ;
        else
            mensaje="IMPAR" ;
        System.out.println("EL NUMERO ES " + mensaje);
    }
}

Descargar el proyecto desarrollado con Netbeans Ejercicio2

Ejercicio de declaración y uso de variables en Java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ejer1variables;

import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 *
 * @author Paulo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        // Empezamos a declarar variables
        String nombre; // tipo cadena de caracteres
        int edad;   // tipo entera
        boolean esJubilado;   // variable solo puede tomar 2 valores: true o false
        float salario;  // datos con punto decimal
        char vocalPreferida; // solo puede almacenar un caracter

        // Asignamos valores
        nombre="Juan Perez";
        edad=45;
        esJubilado=false;
        salario=904.67f;
        vocalPreferida='a';
        // imprimimos en la consola 
        System.out.println("Sr."+nombre);
        System.out.println("Es Jubilado? "+esJubilado);
        System.out.println("Su salario es: "+ salario);
        System.out.println("Su vocal favorita es: "+ vocalPreferida);
    }

}


Descarga el proyecto desarrollado con Ide netbeans ejercicio1