Foro de elhacker.net

Programación => Java => Mensaje iniciado por: cyberserver en 29 Mayo 2010, 21:41 pm



Título: Reconocimiento de Patrones en JAVA
Publicado por: cyberserver en 29 Mayo 2010, 21:41 pm
 :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
  1. import java.awt.*;
  2. import javax.swing.*;
  3. import java.awt.image.BufferedImage;
  4. import javax.swing.ImageIcon;
  5. import java.io.*;
  6. import javax.imageio.ImageIO;
  7.  
  8. //Autor Jose abel de la Fuente Arriaga
  9. //CyberServer
  10.  
  11. public class Pixeles {
  12. public static void main (String[] args) {
  13. JLabel Resultado= new JLabel();
  14.  
  15. JOptionPane.showMessageDialog(null,"Proyecto: Reconocimiento de Patrones en imagenes \n"+
  16. "Autor: Jose Abel de la fuente \n" +
  17. "Correo: crow_15@hotmail.com \n" +
  18. "Lenguaje: Java \n"+
  19. "Arriva atlacomulco, atte: cyberServer");
  20.  
  21. String PixelBuscar=JOptionPane.showInputDialog("Color en Hexadecimal del pixel a Buscar \n El Default es Blanco - ffffff","ffffff");
  22. String Archivo=JOptionPane.showInputDialog("Nombre de la imagen para Buscar el pixel \n Tiene que se png");
  23. int contador=0;
  24. String Cordenadas=null;
  25. ImageIcon Imagen = new ImageIcon(Archivo + ".png");
  26.  
  27. Coversion C = new Coversion();
  28. BufferedImage Nueva = C.toBufferedImage(Imagen.getImage());
  29. Graphics g = Nueva.getGraphics();
  30.  
  31. for(int x=0;x<=449;x++){
  32. for(int y=0;y<=331;y++){
  33. String val= Integer.toHexString(Nueva.getRGB(x,y) & 0x00ffffff ).toString();
  34. if(val.equals(PixelBuscar)){
  35. Cordenadas=Cordenadas + " (" + x+","+y+") ";
  36. contador++;
  37. g.setColor(Color.yellow);
  38. g.fillOval(x, y, 10, 10);
  39. }
  40. }
  41. }
  42.  
  43. //JOptionPane.showMessageDialog(null,"Tiene " + contador + " elementos que buscas");
  44. //JOptionPane.showMessageDialog(null,"Cordenadas " + Cordenadas);
  45.  
  46. if (contador != 0){
  47. try {
  48.   ImageIO.write(Nueva, "jpg", new File("Resultado.png"));
  49. } catch (IOException e) {
  50.   System.out.println("Error de escritura");
  51. }
  52. Resultado.setIcon(new ImageIcon("Resultado.png"));
  53. JOptionPane.showMessageDialog(null,Resultado);
  54. }else{
  55. JOptionPane.showMessageDialog(null,"No se encontro ningun patron");
  56. }
  57. }
  58.  
  59. }
  60. class Coversion {
  61.  
  62.    BufferedImage toBufferedImage(Image image) {
  63. if( image instanceof BufferedImage ) {
  64. return( (BufferedImage)image );
  65. } else {
  66. image = new ImageIcon(image).getImage();
  67. BufferedImage bufferedImage = new BufferedImage(
  68. image.getWidth(null),
  69. image.getHeight(null),
  70. BufferedImage.TYPE_INT_RGB );
  71. Graphics g = bufferedImage.createGraphics();
  72. g.drawImage(image,0,0,null);
  73. g.dispose();
  74.  
  75. return( bufferedImage );
  76. }
  77. }
  78. }

La imagen original queda asi:
(http://r.i.elhacker.net/cache?url=http://crow.webcindario.com/2.png)

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

(http://r.i.elhacker.net/cache?url=http://crow.webcindario.com/Resultado.png)

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
Código:
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


Título: Re: Reconocimiento de Patrones en JAVA
Publicado por: Blitzkrieg' en 29 Mayo 2010, 22:53 pm
Buen aporte, gracias.  ;D


Título: Re: Reconocimiento de Patrones en JAVA
Publicado por: Amerikano|Cls en 3 Junio 2010, 00:03 am
Gracias le dare una ojeada porque estoy en un proyecto de reconocimiento de Imagenes para cierto proyecto en mente  :rolleyes:.


Título: Re: Reconocimiento de Patrones en JAVA
Publicado por: cyberserver en 2 Julio 2010, 23:50 pm
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 (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
  1.  
  2. import java.awt.*;
  3. import javax.swing.*;
  4. import java.awt.image.BufferedImage;
  5. import javax.swing.ImageIcon;
  6. import java.io.*;
  7. import javax.imageio.ImageIO;
  8.  
  9. //Autor Jose abel de la Fuente Arriaga
  10. //CyberServer
  11.  
  12. public class Pixeles {
  13. public static void main (String[] args) {
  14. JLabel Resultado= new JLabel();
  15.  
  16. String arreglo[][];                  
  17.  
  18.  
  19. JOptionPane.showMessageDialog(null,"Proyecto: Reconocimiento de Patrones en imagenes \n"+
  20. "Autor: Jose Abel de la fuente \n" +
  21. "Correo: crow_15@hotmail.com \n" +
  22. "Lenguaje: Java \n"+
  23. "Arriva atlacomulco, atte: cyberServer");
  24.  
  25. String PixelBuscar=JOptionPane.showInputDialog("Color en Hexadecimal del pixel a Buscar \n El Default es Blanco - ffffff","ffffff");
  26. String Archivo=JOptionPane.showInputDialog("Nombre de la imagen para Buscar el pixel \n Tiene que se png");
  27. int contador=0;
  28. String Cordenadas=null;
  29. ImageIcon Imagen = new ImageIcon(Archivo + ".png");
  30.  
  31. Coversion C = new Coversion();
  32. BufferedImage Nueva = C.toBufferedImage(Imagen.getImage());
  33. Graphics g = Nueva.getGraphics();
  34.  
  35. //Agrupar
  36. arreglo = new String[Nueva.getWidth()][Nueva.getHeight()];
  37. for(int x=0;x<=Nueva.getWidth()-1 ;x++){
  38. for(int y=0;y<=Nueva.getHeight()-1;y++){
  39. String val= Integer.toHexString(Nueva.getRGB(x,y) & 0x00ffffff ).toString();
  40. arreglo[x][y]=val;
  41. }
  42. }
  43. AgrupamientoVecinos objeto=new AgrupamientoVecinos();
  44.     int GruposTotales=objeto.Agrupar(arreglo,PixelBuscar,true,null);
  45.     JOptionPane.showMessageDialog(null,"Termino de Buscar en total fueron " + GruposTotales + " grupos");
  46.  
  47.     //fin de Agrupar
  48. for(int x=0;x<=Nueva.getWidth()-1 ;x++){
  49. for(int y=0;y<=Nueva.getHeight()-1;y++){
  50. String val= Integer.toHexString(Nueva.getRGB(x,y) & 0x00ffffff ).toString();
  51. if(val.equals(PixelBuscar)){
  52. Cordenadas=Cordenadas + " (" + x+","+y+") ";
  53. contador++;
  54. g.setColor(Color.blue);
  55. g.fillOval(x, y, 10, 10);
  56. }
  57. }
  58. }
  59.  
  60. //JOptionPane.showMessageDialog(null,"Tiene " + contador + " elementos que buscas");
  61. //JOptionPane.showMessageDialog(null,"Cordenadas " + Cordenadas);
  62.  
  63. if (contador != 0){
  64. try {
  65.   ImageIO.write(Nueva, "jpg", new File("Resultado.png"));
  66. } catch (IOException e) {
  67.   System.out.println("Error de escritura");
  68. }
  69. Resultado.setIcon(new ImageIcon("Resultado.png"));
  70. JOptionPane.showMessageDialog(null,"Numero de Pixeles involucrados " + contador );
  71.  
  72. JOptionPane.showMessageDialog(null,Resultado);
  73. }else{
  74. JOptionPane.showMessageDialog(null,"No se encontro ningun patron");
  75. }
  76. }
  77.  
  78. }
  79. class Coversion {
  80.  
  81.    BufferedImage toBufferedImage(Image image) {
  82. if( image instanceof BufferedImage ) {
  83. return( (BufferedImage)image );
  84. } else {
  85. image = new ImageIcon(image).getImage();
  86. BufferedImage bufferedImage = new BufferedImage(
  87. image.getWidth(null),
  88. image.getHeight(null),
  89. BufferedImage.TYPE_INT_RGB );
  90. Graphics g = bufferedImage.createGraphics();
  91. g.drawImage(image,0,0,null);
  92. g.dispose();
  93.  
  94. return( bufferedImage );
  95. }
  96. }
  97. }
  98.  
  99. class AgrupamientoVecinos{
  100. public String ValorNuevo;
  101. public String ValorViejo;
  102. public String arreglo[][];
  103. public int Agrupar(String ArregloDeBusqueda[][],String ValorABuscar,boolean RenombradoAutomaticoGrupos,String ValorAModificar){
  104. int grupos=0;
  105. arreglo=ArregloDeBusqueda;
  106. ValorNuevo=ValorAModificar;
  107. ValorViejo=ValorABuscar;
  108.  
  109. for(int yx=0;yx<ArregloDeBusqueda.length;yx++){
  110.     for(int yy=0;yy<ArregloDeBusqueda[0].length;yy++){
  111.     if(ArregloDeBusqueda[yx][yy].equals(ValorViejo)){
  112.     if(RenombradoAutomaticoGrupos==false){
  113.     grupos++;
  114.     this.BuscarVecino(yx,yy);
  115.     }else{
  116.     grupos++;
  117.     ValorNuevo=Integer.toString(grupos);
  118.     this.BuscarVecino(yx,yy);
  119.     }
  120.     }
  121.     }
  122.     }
  123.     return grupos;
  124. }
  125. private void BuscarVecino(int x,int y){
  126. arreglo[x][y]=ValorNuevo;
  127. if(arreglo[x][y-1].equals(ValorViejo)){
  128. BuscarVecino(x,y-1);
  129. }
  130. if(arreglo[x-1][y-1].equals(ValorViejo)){
  131. BuscarVecino(x-1,y-1);
  132. }
  133. if(arreglo[x-1][y].equals(ValorViejo)){
  134. BuscarVecino(x-1,y);
  135. }
  136. if(arreglo[x-1][y+1].equals(ValorViejo)){
  137. BuscarVecino(x-1,y+1);
  138. }
  139. if(arreglo[x][y+1].equals(ValorViejo)){
  140. BuscarVecino(x,y+1);
  141. }
  142. if(arreglo[x+1][y+1].equals(ValorViejo)){
  143. BuscarVecino(x+1,y+1);
  144. }
  145. if(arreglo[x+1][y].equals(ValorViejo)){
  146. BuscarVecino(x+1,y);
  147. }
  148. if(arreglo[x+1][y-1].equals(ValorViejo)){
  149. BuscarVecino(x+1,y-1);
  150. }
  151. }
  152.  
  153. }
  154.  
  155.  



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


Título: Re: Reconocimiento de Patrones en JAVA
Publicado por: Debci en 3 Julio 2010, 00:31 am
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


Título: Re: Reconocimiento de Patrones en JAVA
Publicado por: joinko en 21 Julio 2011, 10:52 am
buenisimo es lo que andava buscandO!! Código muy claro, perfecto!!
Gracias!!


Título: Re: Reconocimiento de Patrones en JAVA
Publicado por: 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?



Título: Re: Reconocimiento de Patrones en JAVA
Publicado por: Debci en 12 Octubre 2011, 10:48 am
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


Título: Re: Reconocimiento de Patrones en JAVA
Publicado por: ancorzize en 29 Noviembre 2014, 15:08 pm
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=???


Título: Re: Reconocimiento de Patrones en JAVA
Publicado por: ancorzize en 29 Noviembre 2014, 15:11 pm
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