Reconocimiento de Patrones en JAVA

Iniciado por cyberserver, 29 Mayo 2010, 21:41 PM

0 Miembros y 1 Visitante están viendo este tema.

cyberserver

 :DHola amigos, para todos aquellos que quieran comerce el mundo y como gran sueño como yo tengan en ser investigadores algun dia!

Aqui les traigo un programa super basico de Reconocimiento de patrones en una imagen. lo cree por conviccion y por querer saber como funciona esto.!!!

Pero para que puedo ocupar este programa?:
La pregunta me la han hecho muchas personas y la respuesta es ilimitada! la pregunta seria donde no puedo ocuparla :P

Un ejemplo es en la inteligencia artificial supongamos que creamos un robor que aprender a distinguir en una mesa llena de fruta una manzana. como sabes o como hacele entender al robot k es una manzana y que es diferente a las demas.!!

con este programa de reconocimiento de patrones. esto es muy basico pero abre la puerta a grandes investigaciones k se estan asiendo sobre esto.


Comenzemos.
Primero que nada nuestro proyecto solo reconoce patrones en imagenes .png esto es por el formato y el tipo de imagen de mapa de bits que no cambiar su estructura cuando cambiamos su tamaño o modificamos un pixel, ya que la mayoría de las otras extensiones al cambiar un pixel cambiar todo lo demas :P


Este es el codigo sencillo y pequeño

Código (java) [Seleccionar]
import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import java.io.*;
import javax.imageio.ImageIO;

//Autor Jose abel de la Fuente Arriaga
//CyberServer

public class Pixeles {
public static void main (String[] args) {
JLabel Resultado= new JLabel();

JOptionPane.showMessageDialog(null,"Proyecto: Reconocimiento de Patrones en imagenes \n"+
"Autor: Jose Abel de la fuente \n" +
"Correo: crow_15@hotmail.com \n" +
"Lenguaje: Java \n"+
"Arriva atlacomulco, atte: cyberServer");

String PixelBuscar=JOptionPane.showInputDialog("Color en Hexadecimal del pixel a Buscar \n El Default es Blanco - ffffff","ffffff");
String Archivo=JOptionPane.showInputDialog("Nombre de la imagen para Buscar el pixel \n Tiene que se png");
int contador=0;
String Cordenadas=null;
ImageIcon Imagen = new ImageIcon(Archivo + ".png");

Coversion C = new Coversion();
BufferedImage Nueva = C.toBufferedImage(Imagen.getImage());
Graphics g = Nueva.getGraphics();

for(int x=0;x<=449;x++){
for(int y=0;y<=331;y++){
String val= Integer.toHexString(Nueva.getRGB(x,y) & 0x00ffffff ).toString();
if(val.equals(PixelBuscar)){
Cordenadas=Cordenadas + " (" + x+","+y+") ";
contador++;
g.setColor(Color.yellow);
g.fillOval(x, y, 10, 10);
}
}
}

//JOptionPane.showMessageDialog(null,"Tiene " + contador + " elementos que buscas");
//JOptionPane.showMessageDialog(null,"Cordenadas " + Cordenadas);

if (contador != 0){
try {
  ImageIO.write(Nueva, "jpg", new File("Resultado.png"));
} catch (IOException e) {
  System.out.println("Error de escritura");
}
Resultado.setIcon(new ImageIcon("Resultado.png"));
JOptionPane.showMessageDialog(null,Resultado);
}else{
JOptionPane.showMessageDialog(null,"No se encontro ningun patron");
}
}
   
}
class Coversion {

   BufferedImage toBufferedImage(Image image) {
if( image instanceof BufferedImage ) {
return( (BufferedImage)image );
} else {
image = new ImageIcon(image).getImage();
BufferedImage bufferedImage = new BufferedImage(
image.getWidth(null),
image.getHeight(null),
BufferedImage.TYPE_INT_RGB );
Graphics g = bufferedImage.createGraphics();
g.drawImage(image,0,0,null);
g.dispose();

return( bufferedImage );
}
}
}


La imagen original queda asi:


Si nos damos cuenta emos escrito en la imagen pequeños puntos blancos que en este caso es el patron que estamos buscando

Despues de haber pasado nuestro programa por la imagen y haber especificado buscar el patron blanco!!! no da esta imagen como resultado



Bingo!!! encontro los patrones reconocio lo que estaba buscando y lo señalo!!!

:D

Para muchos funcinal, para muchos novato, para muchos perdida de tiempo. ustedes que opinan???

NOTA: El unico parametro que tienes que cambiar en el codigo es
for(int x=0;x<=449;x++){
for(int y=0;y<=331;y++){


tendras que cambiar los limites de X y Y segun el numero de pixeles de imagen. recuerda que es si la imagen es de 450X332 tienes que poner en los limites de los for anidado 449X331 pues comenzamos de 0

Saludos y espero que les sirva su amigo CyberServer.

Este proyecto todavia no lo muestro asi que si eres del Tecnologico de Jocotitlan ( Tesjo) no se te ocurra copiarlo maldito PIRATA!!! jajaja ntc saludos.!!


NOTOTA: PERDON POR LA ESTRUCTURA "PUERCA DEL CODIGO" Reconozco QUE ES UNA PORQUERIA EN CUANTO A LIMPIEZA PERO ME KEME LA CABEZA PENSANDO COMO HACERLE Y ME OLVIDE DE LA INGENIERIA DE SOFTWARE :p






Blitzkrieg'




Amerikano|Cls

Gracias le dare una ojeada porque estoy en un proyecto de reconocimiento de Imagenes para cierto proyecto en mente  :rolleyes:.




Mi blog:
http://amerikanocls.blogspot.com

cyberserver

Ya pude hacer una modificacion importante. ya puedo agrupar los pixeles.!!!!!

YA no solo me dice el numero de patrones busca los pixeles vecinos y los agrupa.!!!!

;-) ;-) ;-) ;-) ;-) ;-)

Aqui en el foro posteo como agrupar valores y el mismo metodo que comparto aqui http://foro.elhacker.net/java/agrupamiento_de_nodos_vecino_en_un_arreglo_mineria_de_datos-t298383.0.html

Es el mismo metodo que utilize para agrupar los pixeles en el programa de reconocimiento de patrones.



Entonces el codigo modificado para que agrupe los patrones es el siguiente:

Código (java) [Seleccionar]


import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import java.io.*;
import javax.imageio.ImageIO;

//Autor Jose abel de la Fuente Arriaga
//CyberServer

public class Pixeles {
public static void main (String[] args) {
JLabel Resultado= new JLabel();

String arreglo[][];                   
     

JOptionPane.showMessageDialog(null,"Proyecto: Reconocimiento de Patrones en imagenes \n"+
"Autor: Jose Abel de la fuente \n" +
"Correo: crow_15@hotmail.com \n" +
"Lenguaje: Java \n"+
"Arriva atlacomulco, atte: cyberServer");

String PixelBuscar=JOptionPane.showInputDialog("Color en Hexadecimal del pixel a Buscar \n El Default es Blanco - ffffff","ffffff");
String Archivo=JOptionPane.showInputDialog("Nombre de la imagen para Buscar el pixel \n Tiene que se png");
int contador=0;
String Cordenadas=null;
ImageIcon Imagen = new ImageIcon(Archivo + ".png");

Coversion C = new Coversion();
BufferedImage Nueva = C.toBufferedImage(Imagen.getImage());
Graphics g = Nueva.getGraphics();

//Agrupar
arreglo = new String[Nueva.getWidth()][Nueva.getHeight()];
for(int x=0;x<=Nueva.getWidth()-1 ;x++){
for(int y=0;y<=Nueva.getHeight()-1;y++){
String val= Integer.toHexString(Nueva.getRGB(x,y) & 0x00ffffff ).toString();
arreglo[x][y]=val;
}
}
AgrupamientoVecinos objeto=new AgrupamientoVecinos();
    int GruposTotales=objeto.Agrupar(arreglo,PixelBuscar,true,null);
    JOptionPane.showMessageDialog(null,"Termino de Buscar en total fueron " + GruposTotales + " grupos");
   
    //fin de Agrupar
for(int x=0;x<=Nueva.getWidth()-1 ;x++){
for(int y=0;y<=Nueva.getHeight()-1;y++){
String val= Integer.toHexString(Nueva.getRGB(x,y) & 0x00ffffff ).toString();
if(val.equals(PixelBuscar)){
Cordenadas=Cordenadas + " (" + x+","+y+") ";
contador++;
g.setColor(Color.blue);
g.fillOval(x, y, 10, 10);
}
}
}

//JOptionPane.showMessageDialog(null,"Tiene " + contador + " elementos que buscas");
//JOptionPane.showMessageDialog(null,"Cordenadas " + Cordenadas);

if (contador != 0){
try {
    ImageIO.write(Nueva, "jpg", new File("Resultado.png"));
} catch (IOException e) {
    System.out.println("Error de escritura");
}
Resultado.setIcon(new ImageIcon("Resultado.png"));
JOptionPane.showMessageDialog(null,"Numero de Pixeles involucrados " + contador );

JOptionPane.showMessageDialog(null,Resultado);
}else{
JOptionPane.showMessageDialog(null,"No se encontro ningun patron");
}
}
   
}
class Coversion {

    BufferedImage toBufferedImage(Image image) {
if( image instanceof BufferedImage ) {
return( (BufferedImage)image );
} else {
image = new ImageIcon(image).getImage();
BufferedImage bufferedImage = new BufferedImage(
image.getWidth(null),
image.getHeight(null),
BufferedImage.TYPE_INT_RGB );
Graphics g = bufferedImage.createGraphics();
g.drawImage(image,0,0,null);
g.dispose();

return( bufferedImage );
}
}
}

class AgrupamientoVecinos{
public String ValorNuevo;
public String ValorViejo;
public String arreglo[][];
public int Agrupar(String ArregloDeBusqueda[][],String ValorABuscar,boolean RenombradoAutomaticoGrupos,String ValorAModificar){
int grupos=0;
arreglo=ArregloDeBusqueda;
ValorNuevo=ValorAModificar;
ValorViejo=ValorABuscar;

for(int yx=0;yx<ArregloDeBusqueda.length;yx++){
    for(int yy=0;yy<ArregloDeBusqueda[0].length;yy++){
    if(ArregloDeBusqueda[yx][yy].equals(ValorViejo)){
    if(RenombradoAutomaticoGrupos==false){
    grupos++;
    this.BuscarVecino(yx,yy);
    }else{
    grupos++;
    ValorNuevo=Integer.toString(grupos);
    this.BuscarVecino(yx,yy);
    }
    }
    }
    }
    return grupos;
}
private void BuscarVecino(int x,int y){
arreglo[x][y]=ValorNuevo;
if(arreglo[x][y-1].equals(ValorViejo)){
BuscarVecino(x,y-1);
}
if(arreglo[x-1][y-1].equals(ValorViejo)){
BuscarVecino(x-1,y-1);
}
if(arreglo[x-1][y].equals(ValorViejo)){
BuscarVecino(x-1,y);
}
if(arreglo[x-1][y+1].equals(ValorViejo)){
BuscarVecino(x-1,y+1);
}
if(arreglo[x][y+1].equals(ValorViejo)){
BuscarVecino(x,y+1);
}
if(arreglo[x+1][y+1].equals(ValorViejo)){
BuscarVecino(x+1,y+1);
}
if(arreglo[x+1][y].equals(ValorViejo)){
BuscarVecino(x+1,y);
}
if(arreglo[x+1][y-1].equals(ValorViejo)){
BuscarVecino(x+1,y-1);
}
}

}





PERO para que sirve agrupar los patrones???????????

BIEN FACIL PARA FORMAR FIGURAS COMPLETAS, Y EN LUGAR DE QUE TE DIGA QUE EXISTEN 200 PIXELES DE ROJOS... TE DIRA QUE EXISTEN DOS MANZANAZ YA QUE ABRA AGRUPADO LOS PIXELES..... :p :p


eSPERO QUE LES SIRVA SU AMIGO CYBERSERVER






Debci

Buenísimo, muy bueno como siempre, pero agradeceria que pusieses la quote de codigo bueno, no me cuesta hacerlo, pero a ti menos ;)

Enserio muy bueno, hacia tiempo que no veia algo asi.

Saludos

joinko

buenisimo es lo que andava buscandO!! Código muy claro, perfecto!!
Gracias!!

luqueagm2000

oa

pero como se hace para alguien que no sabe java?....

no he podido hacer funcionar el programa....
no sé de java...

alguna ayuda?


Debci

Cita de: luqueagm2000 en 11 Octubre 2011, 22:55 PM
oa

pero como se hace para alguien que no sabe java?....

no he podido hacer funcionar el programa....
no sé de java...

alguna ayuda?


Si quieres que funcione, DEBES, aprender java, no puedes pretender que funcione algo que ni siquiera sabes lo que es.
Si quieres aprender pásate por el entry point de esta misma sección.

Un saludo

ancorzize

AMIGO COMO HAGO PARA INGRESAR LA IMAGEN, ME PIDE EL NOMBRE, EL NOMBRE ES LA RUTA DONDE SE ENCUENTRA LA IMAGEN??, SI ES ASI ME SALE ERROR, O DONDE GUARDO LA IMAGEN=???

ancorzize

AMIGO COMO HAGO PARA INGRESAR LA IMAGEN?? ME PIDE EL NOMBRE DE LA IMAGEN,  AHI VA LA RUTA DONDE TENGO GUARDADA LA IMAGEN?? O COMO ES?? SI ES ASI ME SALE ERROR, O DIME DONDE TENGO QUE GUARDAR LA IMAGEN!! GRACIAS