Documentos de Académico
Documentos de Profesional
Documentos de Cultura
RECONOCIMIENTO PTICO DE
CARACTERES (OCR)
MANUAL DE USUARIO
ndice
1. Presentacin............................................................................................................. 3
2. Proceso de ejecucin............................................................................................. 3
2.1. Abrir archivo.................................................................................................... 3
2.2. Ejecucin directa............................................................................................ 5
2.3. Ejecucin paso por paso .............................................................................. 6
2.3.1. Paso 1: Escala de grises ........................................................................... 7
2.3.2. Paso 2: Blanco y negro.............................................................................. 7
2.3.3. Paso 3: Cajas de texto............................................................................... 8
2.3.4. Paso 4: Conexin cajas de texto.............................................................. 8
2.3.5. Paso 5: Filtrado de cajas ........................................................................... 9
2.3.6. Paso 6: Decisin ......................................................................................... 9
2.4. Entrenamiento .............................................................................................. 10
2.4.1. Crear Red Neuronal ................................................................................. 10
2.4.2. Activar OCR............................................................................................... 10
2.4.3. Entrenar Red Neuronal............................................................................ 10
2.4.4. Grficos de Matlab ................................................................................... 11
2.5. Correccin..................................................................................................... 11
2.5.1. Texto Corregido ........................................................................................ 11
2.5.2. Botn Corregir ........................................................................................... 12
2.5.3. Grficos de Matlab ................................................................................... 12
2.6. Activacin final del OCR ............................................................................. 13
2.6.1. Activar OCR .......................................................................................... 13
3. Parmetros.............................................................................................................. 13
3.1. Funciones de activacin ............................................................................. 13
3.2. Tipo de entrenamiento ................................................................................ 14
3.3. Otros parmetros ......................................................................................... 14
4. ANEXO I: Cdigo fuente...................................................................................... 16
1. Presentacin
El Reconocedor ptico de Caracteres (de aqu en adelante OCR) presenta una
interfaz sencilla y de fcil utilizacin. Esta interfaz podra dividirse en tres secciones
claramente diferenciadas: la barra de herramientas y accesos directos; la zona de
visualizacin; y la zona de seleccin de parmetros.
El objetivo principal de esta aplicacin es obtener a partir de una imagen que contenga
texto obtener un documento de texto que sea modificable y legible por cualquier editor
de texto. Este procedimiento se lleva a cabo con una red neuronal a la que hay que
entrenar para que obtenga los resultados ms ptimos y por otra parte, resultados
esperados.
2. Proceso de ejecucin
2.1. Abrir archivo
Para comenzar la ejecucin y procesamiento del OCR se abre un archivo de
imagen. Para ello la aplicacin ofrece dos mecanismos: acceso directo y acceso
mediante men. El primero, el ms rpido, se procede pulsando el primero de los
botones visibles en la barra de herramientas.
2.2.
Ejecucin directa
El resultado final de este proceso se obtiene en una ventana cuyo nombre ser
Resultado Final de igual forma que la primera imagen a la que denominamos
Imagen Original.
2.3.
Para ir ejecutando los distintos pasos del proceso tambin ofrece dos mecanismos:
acceso directo y acceso mediante men. El primero, el ms rpido, se procede
pulsando uno de los botones visibles en la barra de herramientas.
2.4.
Entrenamiento
10
2.5.
Correccin
Para completar el entrenamiento hay que introducir la palabra correcta para que la
red la contenga y en prximas iteraciones realice correctamente la identificacin.
11
12
3. Parmetros
3.1. Funciones de activacin
La aplicacin permite seleccionar las distintas funciones de activacin que se van a
utilizar en cada una de las tres capas de neuronas que tiene la red neuronal.
13
Logsig:
3.2.
Tipo de entrenamiento
3.3.
Otros parmetros
14
15
/*
* NewJFrame.java
*
* Created on 8 de mayo de 2007, 17:35
*/
import java.awt.image.ImageFilter;
import javax.swing.filechooser.FileFilter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.io.File;
import java.io.IOException;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
javax.swing.ImageIcon;
javax.swing.JButton;
javax.swing.JDesktopPane;
javax.swing.JFileChooser;
javax.swing.JFrame;
javax.swing.JInternalFrame;
javax.swing.JLabel;
javax.swing.JLayeredPane;
javax.swing.JMenu;
javax.swing.JMenuBar;
javax.swing.JMenuItem;
javax.swing.JOptionPane;
javax.swing.JScrollPane;
javax.swing.JTextField;
javax.swing.JToolBar;
java.awt.BorderLayout;
jmatlink.*;
import javax.swing.JFrame;
import
import
import
import
import
javax.swing.JPanel;
javax.swing.*;
java.awt.Label;
java.awt.*;
java.awt.event.ActionEvent;
16
import java.awt.event.ActionListener;
import javax.imageio.*;
import java.awt.Graphics;
import java.awt.Canvas;
import java.awt.image.MemoryImageSource;
import java.util.*;
/**
*
* @author Alberto
*/
public class NewJFrame extends javax.swing.JFrame {
private JDesktopPane jdp = new JDesktopPane();
/** Creates new form NewJFrame */
private ImageIcon imageHelp =
new ImageIcon(NewJFrame.class.getResource("help.gif"));
private ImageIcon imageClose =
new ImageIcon(NewJFrame.class.getResource("save1.gif"));
private ImageIcon imageOpen =
new
ImageIcon(NewJFrame.class.getResource("abrirFichero1.gif"));
private ImageIcon imageCompleta =
new
ImageIcon(NewJFrame.class.getResource("completa.gif"));
private ImageIcon imagePasoAPaso =
new
ImageIcon(NewJFrame.class.getResource("pasoAPaso.gif"));
private ImageIcon imageSiguiente =
new
ImageIcon(NewJFrame.class.getResource("siguientePaso.gif"));
private Image imagenOriginal;
Vector centradas;
JPanel jPanel2 = new JPanel();
JLabel jLabel6 = new JLabel();
JLabel jLabel7 = new JLabel();
JPanel pnlImagenOriginal = new JPanel();
JPanel pnlSeparados = new JPanel();
JLabel jLabel8 = new JLabel();
JPanel jPanel3 = new JPanel();
JLabel jLabel9 = new JLabel();
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel jLabel5 = new JLabel();
JButton btnCrear = new JButton();
JButton btnEntrenar = new JButton();
JPanel jPanel4 = new JPanel();
JLabel jLabel10 = new JLabel();
JPanel pnlEncuadrada = new JPanel();
JPanel pnlSinMarco = new JPanel();
JPanel jPanel5 = new JPanel();
17
menuEjecucionCompleta.setEnabled(false);
buttonCompleta.setEnabled(false);
menuEjecucionPasoAPaso.setText("Ejecucion paso a paso");
menuEjecucionPasoAPaso.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
inicializa();
ejecucionPasoAPaso();
menuEjecucionCompleta.setEnabled(false);
menuEjecucionPasoAPaso.setEnabled(false);
menuSiguientePaso.setEnabled(true);
buttonCompleta.setEnabled(false);
buttonPasoAPaso.setEnabled(false);
buttonSiguiente.setEnabled(true);
}
});
menuEjecucionPasoAPaso.setEnabled(false);
buttonPasoAPaso.setEnabled(false);
menuSiguientePaso.setText("Siguiente paso...");
menuSiguientePaso.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
ejecucionPasoAPaso();
if(analizador.getPasoActual() == 6)
{
menuEjecucionCompleta.setEnabled(true);
menuEjecucionPasoAPaso.setEnabled(true);
menuSiguientePaso.setEnabled(false);
buttonCompleta.setEnabled(true);
buttonPasoAPaso.setEnabled(true);
buttonSiguiente.setEnabled(false);
}
else if (analizador.getPasoActual()==3)
{
menuHistogramaMarcas.setEnabled(true);
}
}
});
menuSiguientePaso.setEnabled(false);
buttonSiguiente.setEnabled(false);
menuHistogramaMarcas.setText("Obtener histograma de las
cajas");
menuHistogramaMarcas.addActionListener(new ActionListener()
20
{
public void actionPerformed(ActionEvent ae)
{
interno2=analizador.PintarHistogramaMarcas();
jdp.add(interno2);
jdp.moveToFront(interno2);
}
});
menuHistogramaMarcas.setEnabled(false);
menuConfiguracion.setText("Configuracion");
menuOpciones.setText("Opciones");
menuOpciones.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
obtenerMenuOpciones();
}
});
menuHelp.setText("Ayuda");
menuHelpAbout.setText("Acerca de");
menuHelpAbout.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
helpAbout_ActionPerformed(ae);
}
});
statusBar.setText("");
buttonOpen.setToolTipText("Abrir Fichero");
buttonOpen.setIcon(imageOpen);
buttonOpen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
abrirFichero_actionPerformed(ae);
}
});
buttonClose.setToolTipText("Cerrar Fichero");
buttonClose.setIcon(imageClose);
buttonCompleta.setToolTipText("Ejecucion Completa");
buttonCompleta.setIcon(imageCompleta);
buttonCompleta.addActionListener(new ActionListener()
21
{
public void actionPerformed(ActionEvent ae)
{
inicializa();
ejecucionCompleta();
menuHistogramaMarcas.setEnabled(true);
}
});
menuEjecucionCompleta.setEnabled(false);
buttonCompleta.setEnabled(false);
buttonPasoAPaso.setToolTipText("Ejecucion Paso A Paso");
buttonPasoAPaso.setIcon(imagePasoAPaso);
buttonPasoAPaso.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
inicializa();
ejecucionPasoAPaso();
menuEjecucionCompleta.setEnabled(false);
menuEjecucionPasoAPaso.setEnabled(false);
menuSiguientePaso.setEnabled(true);
buttonCompleta.setEnabled(false);
buttonPasoAPaso.setEnabled(false);
buttonSiguiente.setEnabled(true);
}
});
menuEjecucionPasoAPaso.setEnabled(false);
buttonPasoAPaso.setEnabled(false);
buttonSiguiente.setToolTipText("Siguiente Paso");
buttonSiguiente.setIcon(imageSiguiente);
buttonSiguiente.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
ejecucionPasoAPaso();
if(analizador.getPasoActual() == 6)
{
menuEjecucionCompleta.setEnabled(true);
menuEjecucionPasoAPaso.setEnabled(true);
menuSiguientePaso.setEnabled(false);
buttonCompleta.setEnabled(true);
buttonPasoAPaso.setEnabled(true);
buttonSiguiente.setEnabled(false);
}
else if (analizador.getPasoActual()==3)
{
menuHistogramaMarcas.setEnabled(true);
}
}
22
});
menuSiguientePaso.setEnabled(false);
buttonSiguiente.setEnabled(false);
buttonHelp.setToolTipText("Acerca de");
buttonHelp.setIcon(imageHelp);
buttonHelp.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
helpAbout_ActionPerformed(ae);
}
});
menuFile.add(menuAbrirFichero);
//menuFile.add(menuGuardarFichero);
//menuFile.add(menuCerrarFichero);
menuFile.addSeparator();
menuFile.add(menuFileExit);
menuBar.add(menuFile);
menuAplicacion.add(menuEjecucionCompleta);
menuAplicacion.add(menuEjecucionPasoAPaso);
menuAplicacion.addSeparator();
menuAplicacion.add(menuSiguientePaso);
menuAplicacion.add(menuHistogramaMarcas);
menuBar.add(menuAplicacion);
menuConfiguracion.add(menuOpciones);
menuBar.add(menuConfiguracion);
menuHelp.add(menuHelpAbout);
menuBar.add(menuHelp);
this.getContentPane().add(statusBar, BorderLayout.SOUTH);
toolBar.add(buttonOpen);
toolBar.add(buttonClose);
toolBar.add(buttonCompleta);
toolBar.add(buttonPasoAPaso);
toolBar.add(buttonSiguiente);
toolBar.add(buttonHelp);
toolBar.add(ActivarOCR);
toolBar.add(jButton4);
//toolBar.setSize(buttonCompleta.getSize());
this.getContentPane().add(toolBar, BorderLayout.NORTH);
this.getContentPane().add(jPanel1, BorderLayout.SOUTH);
this.getContentPane().add(jdp);
23
jPanel2.add(jLabel21);
jPanel2.add(jLabel8);
);
panel1Layout.setVerticalGroup(
panel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 0, Short.MAX_VALUE)
);
jPanel1.setBackground(new java.awt.Color(255, 204, 51));
jPanel1.setBorder
(javax.swing.BorderFactory.createBevelBorder(javax.
swing.border.BevelBorder.RAISED));
jTextField9.setBackground(new java.awt.Color(255, 204,
51));
jTextField9.setEditable(false);
jTextField9.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField9.setText("Numero de neronas 2\u00aa Capa");
jTextField9.setBorder(null);
jTextField8.setBackground(new java.awt.Color(255, 204,
51));
jTextField8.setEditable(false);
jTextField8.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField8.setText("Numero de neronas 1\u00aa Capa");
jTextField8.setBorder(null);
txtNeuronas2.setText("17");
txtNeuronas.setText("50");
cmbCentro.setModel(new javax.swing.DefaultComboBoxModel
(new String[] { "purelin", "tansig", "logsig" }));
jTextField4.setBackground(new java.awt.Color(255, 204,
51));
jTextField4.setEditable(false);
jTextField4.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField4.setText("1\u00aa Capa");
jTextField4.setBorder(null);
jTextField5.setBackground(new java.awt.Color(255, 204,
51));
jTextField5.setEditable(false);
jTextField5.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField5.setText("2\u00aa Capa");
jTextField5.setBorder(null);
cmbIzquierda.setModel(new
javax.swing.DefaultComboBoxModel
(new String[] { "tansig", "logsig", "purelin" }));
jTextField6.setBackground(new java.awt.Color(255, 204,
26
51));
jTextField6.setEditable(false);
jTextField6.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField6.setText("3\u00aa Capa");
jTextField6.setBorder(null);
cmbDerecha.setModel(new javax.swing.DefaultComboBoxModel
(new String[] { "purelin", "tansig", "logsig" }));
cmbEntrenamiento.setModel(new
javax.swing.DefaultComboBoxModel
(new String[] { "traingdx", "traingda", "traingd" }));
jButton1.setFont(new java.awt.Font("Tahoma", 1, 11));
jButton1.setText("Crear red Neuronal");
jButton1.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent
evt) {
crearRedNeuronal(evt);
}
});
jTextField10.setBackground(new java.awt.Color(255, 204,
51));
jTextField10.setEditable(false);
jTextField10.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField10.setText("Tipo de entrenamiento");
jTextField10.setBorder(null);
jTextField11.setBackground(new
java.awt.Color(255, 204, 51));
jTextField11.setEditable(false);
jTextField11.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField11.setText("Learning rates");
jTextField11.setBorder(null);
jTextField12.setBackground(new java.awt.Color(255, 204,
51));
jTextField12.setEditable(false);
jTextField12.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField12.setText("Goal");
jTextField12.setBorder(null);
jTextField13.setBackground(new java.awt.Color(255, 204,
51));
jTextField13.setEditable(false);
jTextField13.setFont(new java.awt.Font("Tahoma", 1,
27
11));
jTextField13.setText("Iterations");
jTextField13.setBorder(null);
jTextField14.setBackground(new java.awt.Color(255, 204,
51));
jTextField14.setEditable(false);
jTextField14.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField14.setText("Biass");
jTextField14.setBorder(null);
jTextField15.setBackground(new java.awt.Color(255, 204,
51));
jTextField15.setEditable(false);
jTextField15.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField15.setText("LW");
jTextField15.setBorder(null);
jTextField16.setBackground(new java.awt.Color(255, 204,
51));
jTextField16.setEditable(false);
jTextField16.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField16.setText("Momentum");
jTextField16.setBorder(null);
txtLR.setText("0.9");
txtGoal.setText("0.001");
txtBiass.setText("0.01");
txtIteraciones.setText("2000");
txtLW.setText("0.01");
txtMomentum.setText("0.2");
jButton2.setFont(new java.awt.Font("Tahoma", 1, 11));
jButton2.setText("Entrenar red Neuronal");
jButton2.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent
evt) {
entrenarRedNeuronal(evt);
}
});
jTextField17.setBackground(new java.awt.Color(102, 102,
28
102));
jTextField17.setEditable(false);
jTextField18.setBackground(new java.awt.Color(255, 204,
51));
jTextField18.setEditable(false);
jTextField18.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField18.setText("Texto Correccion");
jTextField18.setBorder(null);
org.jdesktop.layout.GroupLayout jPanel1Layout =
new org.jdesktop.layout.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.add(jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.add(jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING, false)
.add
(cmbEntrenamiento, 0,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.add(jTextField10,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
130,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(53, 53, 53)
.add(
jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.TRAILING)
.add
(jPanel1Layout.createSequentialGroup()
.add(jTextField8,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
204, Short.MAX_VALUE)
.addPreferredGap
(org.jdesktop.layout.LayoutStyle.RELATED)
.add(txtNeuronas,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
38, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(jPanel1Layout.createSequentialGroup()
.add(jTextField9,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 205,
Short.MAX_VALUE)
.addPreferredGap(
29
org.jdesktop.layout.LayoutStyle.RELATED)
.add(txtNeuronas2,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 37,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(44, 44, 44)
.add(jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.add(20, 20, 20)
.add(jTextField4,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(61, 61, 61)
.add(jTextField5,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(jPanel1Layout.
createSequentialGroup()
.addPreferredGap
(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cmbCentro,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 109,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap
(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cmbIzquierda,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 100,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(jPanel1Layout.
createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.
createSequentialGroup()
.add(17, 17, 17)
.add(jTextField6,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(jPanel1Layout.createSequentialGroup()
.addPreferredGap
(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cmbDerecha,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
110, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(28, 28, 28))
.add(jPanel1Layout.createSequentialGroup()
.add(4, 4, 4)
.add(jTextField18,
30
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 105,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(txtCorreccion,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 171,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jButton1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 383,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)))
.add(jTextField17,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 11,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(48, 48, 48)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(jTextField11,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 94,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.TRAILING, false)
.add(org.jdesktop.layout.GroupLayout.LEADING, jTextField14)
.add(org.jdesktop.layout.GroupLayout.LEADING, jTextField12,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 61,
Short.MAX_VALUE)))
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED, 46, Short.MAX_VALUE)
.add(jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(txtGoal,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 48,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtLR,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 48,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtBiass,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 49,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(57, 57, 57)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING, false)
.add(jTextField15)
.add(jTextField16,
31
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 76,
Short.MAX_VALUE)
.add(jTextField13))
.add(22, 22, 22)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING, false)
.add(txtMomentum,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 44,
Short.MAX_VALUE)
.add(txtIteraciones)
.add(txtLW)))
.add(jPanel1Layout.createSequentialGroup()
.add(10, 10, 10)
.add(jButton2,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 252,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED, 126,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(jTextField4,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField5,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField6,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField10,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField8,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
32
.add(txtNeuronas,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(cmbEntrenamiento,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField9,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtNeuronas2,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(cmbCentro,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(cmbIzquierda,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(cmbDerecha,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(15, 15, 15)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(jTextField18,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jButton1)
.add(txtCorreccion,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(jPanel1Layout.createSequentialGroup()
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(jTextField15,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
33
.add(jTextField11,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtLR,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtLW,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(txtMomentum,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtGoal,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField12,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField16,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(txtIteraciones,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 19,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtBiass,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField14,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField13,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
34
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jButton2)))
.addContainerGap(
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.add(jTextField17,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 109,
Short.MAX_VALUE)
);
txt.setBackground(new java.awt.Color(204, 204, 204));
txt.setColumns(20);
txt.setFont(new java.awt.Font("Comic Sans MS", 0, 13));
txt.setRows(5);
jScrollPane1.setViewportView(txt);
setJMenuBar(jMenuBar1);
org.jdesktop.layout.GroupLayout layout = new
org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING,
layout.createSequentialGroup()
.addContainerGap(2986, Short.MAX_VALUE)
.add(panel1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(534, 534, 534))
.add(layout.createSequentialGroup()
.add(toolBar,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 651,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jScrollPane1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 649,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(2214, Short.MAX_VALUE))
.add(layout.createSequentialGroup()
.add(377, 377, 377)
.add(jPanel1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(1838, Short.MAX_VALUE))
);
layout.setVerticalGroup(
35
layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(toolBar,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 39,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(layout.createSequentialGroup()
.add(39, 39, 39)
.add(jScrollPane1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 567,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(80, 80, 80)
.add(jPanel1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(121, 121, 121)
.add(panel1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void correcion(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
controlador.correccion(txtCorreccion.getText(),
analizador.ObtenerCajas(),analizador.numero);
}
private void activarOcr(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
CORTADOS
txt.setText(controlador.reconocimiento(
analizador.ObtenerCajas()));
}
private void entrenarRedNeuronal(java.awt.event.MouseEvent
evt) {
// TODO add your handling code here:
controlador.entrenamiento(txtGoal.getText(),
txtIteraciones.getText(),txtLR.getText(),txtMomentum.getText(),
txtBiass.getText(),txtLW.getText());
}
36
controlador=new control();
controlador.creacion((String)cmbEntrenamiento.
getSelectedItem
(),
(String)cmbDerecha.getSelectedItem(),(String)
cmbCentro.getSelectedItem(),(String)cmbIzquierda.getSelectedItem
(),txtNeuronas.getText(),txtNeuronas2.getText());
}
void fileExit_ActionPerformed(ActionEvent e)
{
System.exit(0);
}
void helpAbout_ActionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(this,
new Frame1_AboutBoxPanel1(), "Acerca de",
JOptionPane.PLAIN_MESSAGE);
}
return null;
}
}
private void ejecucionCompleta()
{
interno2=analizador.ejecucionCompleta();
jdp.add(interno2);
jdp.moveToFront(interno2);
}
private void ejecucionPasoAPaso()
{
interno2=analizador.ejecucionPasoAPaso();
jdp.add(interno2);
jdp.moveToFront(interno2);
}
private void obtenerMenuOpciones()
{
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JButton jButton1 = new JButton();
JButton jButton2 = new JButton();
interno = new JInternalFrame("
Opciones",false,false,false,false);
interno.setSize(300,200);
interno.setLocation(100,100);
interno.setVisible(true);
interno.setFrameIcon(null);
interno.setResizable(false);
interno.setMaximizable(false);
JDesktopPane jdpInt = new JDesktopPane();
jdpInt.setSize(300,200);
jdpInt.setBackground(new Color(128,128,128));
jLabel1.setBounds(25, 75, 81, 20);
jLabel1.setText(" Iteraciones");
jLabel2.setBounds(25, 100, 120, 20);
jLabel2.setText(" Factor de Correcion");
jLabel3.setBounds(25, 50, 130, 20);
jLabel3.setText(" Factor de Aceptacion");
jTextField1.setBounds(190, 50, 45, 20);
jTextField1.setText(Double.toString(
analizador.getfAceptacion()));
jTextField2.setBounds(190, 75, 45, 20);
38
jTextField2.setText(Integer.toString(
analizador.getnumIteraciones()));
jTextField3.setBounds(190, 100, 45, 20);
jTextField3.setText(Double.toString(
analizador.getmodUnificacion()));
jButton1.setBounds(30, 140, 90, 20);
jButton1.setText("Aceptar");
jButton2.setBounds(140, 140, 90, 20);
jButton2.setText("Cancelar");
jdpInt.add(jLabel1);
jdpInt.add(jLabel2);
jdpInt.add(jLabel3);
jdpInt.add(jTextField1);
jdpInt.add(jTextField2);
jdpInt.add(jTextField3);
jdpInt.add(jButton1);
jdpInt.add(jButton2);
interno.getContentPane().add(jdpInt);
jdp.add(interno);
jdp.setLayer(interno,JLayeredPane.POPUP_LAYER.intValue());
jButton1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
analizador.setfAceptacion(
Double.parseDouble(jTextField1.getText()));
analizador.setnumIteraciones(
Integer.parseInt(jTextField2.getText()));
analizador.setmodUnificacion(
Double.parseDouble(jTextField3.getText()));
try {
interno.setClosed(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
});
jButton2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
try {
interno.setClosed(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
39
}
});
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
public void btnCrear_actionPerformed(ActionEvent e) {
controlador=new control();
controlador.creacion((String)cmbEntrenamiento.
getSelectedItem(),
(String)cmbDerecha.getSelectedItem(),(String)cmbCentro.
getSelectedItem(),(String)cmbIzquierda.getSelectedItem(),
txtNeuronas.getText(),txtNeuronas2.getText());
}
import javax.swing.JInternalFrame;
public class FrameInterno extends JInternalFrame
{
static int openFrameCount = 0;
static int xOffset = 30, yOffset = 30;
private static String[] titulosFrame= {"Paso1:I.Escala de
Grises","Paso2:I. Blanco y Negro","Paso3:Cajas de
Texto","Paso4:Conexion Cajas de Texto","Paso5:Filtrado de
Cajas","Paso6:Decision","Imagen Original","Resutaldo
Final","Histograma de marcas"};
public FrameInterno(int altura,int anchura,int pasoActual)
{
42
import
import
import
import
import
import
import
import
import
import
import
import
java.awt.BorderLayout;
java.awt.Color;
java.awt.Container;
java.awt.Graphics2D;
java.awt.Image;
java.awt.MediaTracker;
java.awt.image.BufferedImage;
java.awt.image.FilteredImageSource;
java.awt.image.ImageObserver;
java.awt.image.PixelGrabber;
java.util.ArrayList;
java.util.Iterator;
import javax.swing.ImageIcon;
import javax.swing.JInternalFrame;
43
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import java.io.*;
public ControlPrograma()
{
inicializa();
}
public void setImagen(Image imagenTratar)
{
imagenOriginal=imagenTratar;
altura = imagenOriginal.getHeight(null);
anchura = imagenOriginal.getWidth(null);
inicializa();
}
pasoActual = 0;
textos = new ArrayList();
porAnalizar = new ArrayList();
todosRectangulos = new ArrayList();
imagenes = new ArrayList();
}
protected static ImageIcon createImageIcon(String
path,String description)
{
if (path != null)
{
return new ImageIcon(path, description);
}
else
{
System.err.println("Couldn't find file: " + path);
return null;
}
}
/*
* Funcion utilizada para realizar una ejecucion directa
del algoritmo, una vez cargada una imagen
* Una vez terminada la ejecucin del mismo devuelve una
referencia a una ventana que contiene
* la imagen resultante del algoritmo
* Consume menos recursos que la ejecucion paso a paso
*/
public JInternalFrame ejecucionCompleta()
{
aplicaFiltroDeColor();
aplicaFiltroBlancoYNegro();
matrizImagen=null;
ObtenerCajas();
ObtenerMarcas();
filtroDeRectangulos(todosRectangulos);
analisisRectangulos();
BufferedImage imagenconbuffer = new
BufferedImage(imagenbn.getWidth(null),imagenbn.getHeight
(null),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.drawImage(imagenbn,null,null);
PintarCajas(gbn,textos,Color.GREEN);
PintarCajas(gbn,imagenes,Color.RED);
imagenResultado=(Image) imagenconbuffer;
FrameInterno frame2=new FrameInterno(altura,anchura,7);
JLabel jLabel = new JLabel();
45
else if(pasoActual==4)
{
filtroDeRectangulos(todosRectangulos);
BufferedImage imagenconbuffer = new
BufferedImage(imagenbn.getWidth(null),imagenbn.getHeight
(null),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.drawImage(imagenbn,null,null);
PintarCajas(gbn,porAnalizar,Color.BLUE);
imagenAPintar=(Image)imagenconbuffer;
}
else
{
analisisRectangulos();
BufferedImage imagenconbuffer = new
BufferedImage(imagenbn.getWidth(null),imagenbn.getHeight
(null),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.drawImage(imagenbn,null,null);
PintarCajas(gbn,textos,Color.GREEN);
PintarCajas(gbn,imagenes,Color.RED);
imagenResultado=(Image) imagenconbuffer;
imagenAPintar=imagenResultado;
}
FrameInterno frame2= new FrameInterno(altura,anchura,
pasoActual);
JLabel jLabel = new JLabel();
ImageIcon iconSalida = new ImageIcon(imagenAPintar,
"TXT");
jLabel.setIcon(iconSalida);
frame2.getContentPane().add(new JScrollPane(jLabel),
BorderLayout.CENTER);
pasoActual++;
return (JInternalFrame)frame2;
}
/*
* Convierte una imagen en color en una imagen en escala de
grises
*/
private void aplicaFiltroDeColor()
{
FiltroDeColor filtroGrises = new FiltroDeColor();
imagenGrises = contenedor.createImage(new
FilteredImageSource(imagenOriginal.getSource(),filtroGrises));
MediaTracker tracker=new MediaTracker(contenedor);
tracker.addImage(imagenGrises, 0);
try
47
{
tracker.waitForID(0);
}
catch (InterruptedException e)
{
System.out.println("ERROR convirtiendo la
imagen");
}
matrizImagen = aMatriz(imagenGrises);
}
/*
* Conmvierte una imagen en escala de grises en una imagen
en Blanco y nego
*/
private void aplicaFiltroBlancoYNegro()
{
int fcorte;
BinarizadorImagenes binarizador;
fcorte=procesarHistograma(matrizImagen);
FiltroBlancoNegro filtrobn = new FiltroBlancoNegro
(fcorte);
imagenbn = contenedor.createImage(new
FilteredImageSource(imagenGrises.getSource(),filtrobn));
MediaTracker tracker=new MediaTracker(contenedor);
tracker.addImage(imagenbn, 1);
try
{
tracker.waitForID(1);
}
catch (InterruptedException e)
{
System.out.println("ERROR convirtiendo la
imagen");
}
binarizador = new BinarizadorImagenes(matrizImagen,
fcorte);
matrizBinaria = binarizador.getMatrizBinaria();
}
/*
* Obtencion de las cajas(que rodean a cada componente conexa)
de una matriz
*/
public ArrayList ObtenerCajas()
{
idMarcas = new IdentificacionDeMarcas(matrizBinaria);
numero=idMarcas.numero;
48
return idMarcas.obtenerCajas();
}
/*
* Analisis de las cajas previamente obtenidas, permite
obtener aquellos rectangulos
* que unifican con sus vecinos (solo son devueltos los mas
frecuentes)
*/
private void ObtenerMarcas()
{
idMarcas.setMaxIteracion(numIteraciones);
idMarcas.setModUnificacion(modUnificacion);
idMarcas.analizarCajas();
todosRectangulos = idMarcas.obtenerRectangulos();
}
/*
* Funcion que decide que rectangulos son imagen y cuales
son texto en funcion
* de sus texturas
*/
private void analisisRectangulos()
{
Caja recActual;
IdentificacionDeTexto txtAnalizer= new
IdentificacionDeTexto
(matrizBinaria);
Iterator it=porAnalizar.iterator();
while(it.hasNext())
{
recActual = (Caja) it.next();
if (txtAnalizer.analizarCaja(recActual))
{
textos.add(recActual);
//System.out.println("nueva linea");
}
else
{
imagenes.add(recActual);
}
}
}
/*
* Permite dibujar las cajas de decision en una imagen
*/
private void PintarCajas(Graphics2D gbn,ArrayList porDibujar,
Color color)
49
{
int i=0;
gbn.setColor(color);
Iterator it = porDibujar.iterator();
while(it.hasNext())
{
Caja recActual = (Caja) it.next();
if(i==1)
gbn.setColor(color);
else
gbn.setColor(Color.GREEN);
gbn.drawRect(recActual.getOrigenX(),
recActual.getOrigenY(),
recActual.getAnchura(),recActual.getAltura());
i++;
}
}
/*
* Funcion que tras haber obtenido las marcas de una imagen
permite mostrar el histograma
*/
public JInternalFrame PintarHistogramaMarcas()
{
int[] hist=idMarcas.generarHistogramaCajas();
int maxHist=0,longitudHist=0;
double log10=Math.log(10);
for (int i=0;i<hist.length;i++)
{
if (hist[i]>maxHist)
{
maxHist=hist[i];
}
if (hist[i]>1)
{
longitudHist=i+1;
}
}
BufferedImage imagenconbuffer = new
BufferedImage(longitudHist*20+100,(int)(50*Math.log(maxHist)
+100),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.setColor(Color.WHITE);
gbn.fillRect(0,0,longitudHist*20+100,(int)(50*Math.log
(maxHist)+100));
gbn.setColor(Color.BLACK);
char[] cad=new char[6];
for(int i=0;i<=Math.ceil(Math.log(maxHist)/Math.log(10));
50
i+=1)
{
int j;
cad[0]='1';
for(j=1;j<=i;j++)
{
cad[j]='0';
}
gbn.drawChars(cad,0,j,10,300-i*50);
}
}
public void setmodUnificacion(double modUnificacion)
{
this.modUnificacion=modUnificacion;
}
}
b. Binarizacin de la imagen:
Obtiene la imagen original.
54
return matrizBinaria;
}
}
c. Filtro blanco y negro: filtroBlancoNegro
Pasa la imagen a escala de grises.
import java.awt.image.RGBImageFilter;
public class FiltroBlancoNegro extends RGBImageFilter
{
private int frecCorte;
public FiltroBlancoNegro(int frecCorte)
{
canFilterIndexColorModel = true;
this.frecCorte = frecCorte;
}
public int filterRGB(int x, int y, int rgb)
{
int rojo = (rgb & 0xff0000)/(0x10000);
int verde = (rgb & 0xff00)/(0x100);
int azul = (rgb & 0xff);
int salida;
if(azul<frecCorte)
salida=0;
else
salida=255;
salida = salida + (salida * 0x100) + (salida *
0x10000) + (rgb & 0xff000000);
//System.out.println("Rojo : "+rojo+" Verde: "+verde+" Azul
: "+azul+" Salida:"+salida);
return salida;
}
}
d. Filtro color:
Obtener la imgen en blanco y negro.
import java.awt.image.RGBImageFilter;
public class FiltroDeColor extends RGBImageFilter{
55
public FiltroDeColor()
{
canFilterIndexColorModel = true;
}
public int filterRGB(int x, int y, int rgb)
{
int rojo = (rgb & 0xff0000)/(0x10000);
int verde = (rgb & 0xff00)/(0x100);
int azul = (rgb & 0xff);
int salida = (int) (rojo*0.299 + azul*0.114 +
verde*0.587);
salida = salida + (salida * 0x100) + (salida *
0x10000) + (rgb & 0xff000000);
//System.out.println("Rojo : "+rojo+" Verde: "+verde+" Azul
: "+azul+" Salida:"+salida);
return salida;
}
}
e. Identificacin de marcas:
Muestra las cajas con los caracteres obtenidos dentro de cada caja.
import
import
import
import
import
import
import
import
import
import
import
java.awt.image.ImageFilter;
javax.swing.filechooser.FileFilter;
java.awt.BorderLayout;
java.awt.Color;
java.awt.Dimension;
java.awt.Image;
java.awt.event.ActionEvent;
java.awt.event.ActionListener;
java.beans.PropertyVetoException;
java.io.File;
java.io.IOException;
import
import
import
import
import
import
import
import
import
import
import
import
javax.swing.ImageIcon;
javax.swing.JButton;
javax.swing.JDesktopPane;
javax.swing.JFileChooser;
javax.swing.JFrame;
javax.swing.JInternalFrame;
javax.swing.JLabel;
javax.swing.JLayeredPane;
javax.swing.JMenu;
javax.swing.JMenuBar;
javax.swing.JMenuItem;
javax.swing.JOptionPane;
56
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.Label;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.imageio.*;
import java.awt.Graphics;
import java.awt.Canvas;
import java.awt.image.MemoryImageSource;
import java.util.*;
import javax.swing.*;
public class IdentificacionDeMarcas
{
private int[][] matrizOrigen;
private ArrayList cajas;
private ArrayList rectangulos;
private boolean[][] matrizBusqueda;
private int[] histogramaCajas;
private int alturaMaxima=0;
private int picoActual;
private double modUnificacion=2;
private int maxIteracion=10;
int altura;
int anchura;
int numero;
public IdentificacionDeMarcas(int[][] origen)
{
this.matrizOrigen = origen;
this.altura = matrizOrigen.length;
this.anchura = matrizOrigen[0].length;
picoActual = 0;
cajas = new ArrayList();
rectangulos= new ArrayList();
matrizBusqueda = new boolean[altura][anchura];
recorreMatriz();
}
private void recorreMatriz()
{
57
int i,j;
int altura = matrizOrigen.length;
int anchura = matrizOrigen[0].length;
Caja actual;
int suma=0;
int posi=0;
for(i=0;i<altura;i++)
for(j=0;j<anchura;j++)
matrizBusqueda[i][j] = false;
for(i=0;i<altura;i++)
{
for(j=0;j<anchura;j++)
{
if(matrizBusqueda[i][j] == false)
{
matrizBusqueda[i][j] = true;
if(matrizOrigen[i][j] == 1)
{
actual = obtenerComponenteConexa
(i,j);
if
(actual.getAltura()+1>alturaMaxima)
{
alturaMaxima=
actual.getAltura
()+1;
}
//solo aadimos las de tamao por
lo menos 3*3
if (actual.getAltura()>1)
{
cajas.add(actual);
numero++;
actual.relleno();
if(actual.getOrigenX()<suma){
actual.tieneRenglon();
suma=0;
}
if((actual.getOrigenX()-suma)>=5){
actual.tieneEspacio();
58
System.out.println("espacio"+actual.getOrigenX()+" ancho
"+actual.getAnchura()+
"suma="+(actual.getOrigenX()+actual.getAnchura()));
suma=(actual.getOrigenX()+actual.getAnchura());
//
actual.imprimir();
//
actual.impresion();
}
}
}
}
}
}
private Caja obtenerComponenteConexa(int i,int j)
{
int maxI=i,maxJ=j,minI=i,minJ=j;
Stack porRecorrer = new Stack();
//int altura = matrizOrigen.length;
//int anchura = matrizOrigen[0].length;
int[] elem={i,j};
porRecorrer.push(elem);
ArrayList visitados=new ArrayList();
while(!porRecorrer.isEmpty() )
{
elem = (int[])porRecorrer.pop();
porRecorrer.removeElement(elem);
int elem0 = (int)(new
Integer(elem[0]).intValue());
int elem1 = (int)(new
Integer(elem[1]).intValue());
//VERIFICACION NINGUN PIXEL SE TRATA 2 VECES
//System.out.println("Pto: "+elem0+", "+elem1);
/* Iterator it4=visitados.iterator();
int[] elemN=new int[2];
while(it4.hasNext())
{
elem = (int[])it4.next();
int elemN0 = (int)(new
Integer(elemN[0]).intValue());
int elemN1 = (int)(new
59
Integer(elemN[1]).intValue());
if (elem0==elemN0 && elem1==elemN1)
{
System.out.println("VISITAMOS 2 veces
el mismo");
}
}
visitados.add(elem);
*/
//Primero las de arriba
if(elem0-1 > 0)
{
if(!matrizBusqueda[elem0-1][elem1])
{
if(matrizOrigen[elem0-1][elem1] == 1)
{
int[] elemNuevo3 = new int[2];
elemNuevo3[0] = elem0-1;
elemNuevo3[1] = elem1;
porRecorrer.push(elemNuevo3);
}
matrizBusqueda[elem0-1][elem1]=true;
}
}
if(elem0-1 > 0 && elem1-1>0)
{
if(!matrizBusqueda[elem0-1][elem1-1])
{
if(matrizOrigen[elem0-1][elem1-1] ==
1)
{
int[] elemNuevo7 = new int[2];
elemNuevo7[0] = elem0-1;
elemNuevo7[1] = elem1-1;
porRecorrer.push(elemNuevo7);
}
matrizBusqueda[elem0-1][elem1-1]=true;
}
}
elemNuevo6[0] = elem0-1;
elemNuevo6[1] = elem1+1;
porRecorrer.push(elemNuevo6);
}
matrizBusqueda[elem0-1][elem1+1]=true;
}
}
//Acontinuacion los de Abajo
if(elem0+1 < altura)
{
if(!matrizBusqueda[elem0+1][elem1])
{
if(matrizOrigen[elem0+1][elem1] == 1)
{
int[] elemNuevo1 = new int[2];
elemNuevo1[0] = elem0+1;
elemNuevo1[1] = elem1;
porRecorrer.push(elemNuevo1);
}
matrizBusqueda[elem0+1][elem1]=true;
}
}
if(elem0+1 < altura && elem1-1 > 0)
{
if(!matrizBusqueda[elem0+1][elem1-1])
{
if(matrizOrigen[elem0+1][elem1-1] ==
1)
{
int[] elemNuevo8 = new int[2];
elemNuevo8[0] = elem0+1;
elemNuevo8[1] = elem1-1;
porRecorrer.push(elemNuevo8);
}
matrizBusqueda[elem0+1][elem1-1]=
true;
}
}
elemNuevo5[1] = elem1+1;
porRecorrer.push(elemNuevo5);
}
matrizBusqueda[elem0+1][elem1+1]=true;
}
}
//Por ultimo los de su mismo nivel
if(elem1+1 < anchura)
{
if(!matrizBusqueda[elem0][elem1+1])
{
if(matrizOrigen[elem0][elem1+1] ==
1)
{
int[] elemNuevo2 = new int[2];
elemNuevo2[0] = elem0;
elemNuevo2[1] = elem1+1;
porRecorrer.push(elemNuevo2);
}
matrizBusqueda[elem0][elem1+1]=true;
}
}
if(elem1-1 > 0)
{
if(!matrizBusqueda[elem0][elem1-1])
{
if(matrizOrigen[elem0][elem1-1] == 1)
{
int[] elemNuevo4 = new int[2];
elemNuevo4[0] = elem0;
elemNuevo4[1] = elem1-1;
porRecorrer.push(elemNuevo4);
}
matrizBusqueda[elem0][elem1-1]=true;
}
}
if(elem0<minI)
minI = elem0;
if(elem0>maxI)
maxI = elem0;
if(elem1<minJ)
minJ = elem1;
if(elem1>maxJ)
maxJ = elem1;
}
int altoc=(maxI-minI);
int anchoc=(maxJ-minJ);
int variableauxiliar=0;
62
}
// System.out.println("");
}
prueba
while( iteracion <maxIteracion &&
histogramaCajas[picoActual] != 0)
{
//System.out.println("Juntando cajas con pico:
"+picoActual);
histogramaCajas[picoActual] = 0;
Iterator it = cajas.iterator();
while(it.hasNext())
{
cajaActual = (Caja) it.next();
if(!cajaActual.getUnificada() &&
cajaActual.getAltura() == picoActual)
realizaUnificacionCajas(cajaActual);
}
iteracion++;
obtenerPicoMaximo();
}
}
public int[] generarHistogramaCajas()
{
Caja actual;
histogramaCajas=new int[alturaMaxima];
Iterator recorreCajas = cajas.iterator();
while (recorreCajas.hasNext())
{
actual = (Caja) recorreCajas.next();
histogramaCajas[actual.getAltura()] +=1;
}
return histogramaCajas;
}
private void obtenerPicoMaximo()
{
int i;
for(i=0;i<alturaMaxima;i++)
{
if(histogramaCajas[i]>histogramaCajas[picoActual])
{
picoActual = i;
}
}
}
private void realizaUnificacionCajas(Caja cajaInicio)
{
int h1,h2,h3,origenInferior,origenSuperior;
64
}
Iterator enLinea;
while(algunUnificado)
{
algunUnificado = false;
enLinea = cajasEnLinea.iterator();
boolean noUnificado = true;
while(enLinea.hasNext() && noUnificado)
{
Caja cajaProxima = (Caja) enLinea.next();
int cpX = cajaProxima.getOrigenX();
int cpY = cajaProxima.getOrigenY();
int cpan = cajaProxima.getAnchura();
int cpal = cajaProxima.getAltura();
//Condicion de unificacion de cajas
if(((cpX + cpan > inicioX -(
65
}
f.
0.0232,
67
{
dsecn =
matrizBinaria[i+1][j+1]+matrizBinaria[i+1][j]*2+matrizBinaria
[i+1][j-1]*4+
matrizBinaria[i][j+1]*8+matrizBinaria[i][j]*16+matrizBinaria[i]
[j-1]*32+
matrizBinaria[i-1][j+1]*64+matrizBinaria[i1][j]*128+matrizBinaria[i-1][j-1]*256;
if(!(dsecn == 0 || dsecn ==511))
{
histogramaDSE[dsecn]+=1;
numDSE++;
}
}
}
}
private void calculoDistancias()
{
double acumulador,featureValor;
double var,varianza=1;
for(int i=0; i<4; i++)
{
acumulador = 0;
/*
double media=0;
for(int l=0; l<13; l++)
//media
=(double)((double)histogramaDSE[featureToDSECN[l]]/numDSE);
media += CentersClasses[i][l];
media = media / 13;
for(int k=0;k<13;k++)
{
varianza += Math.pow(CentersClasses[i][k]media,2);
}
varianza = varianza / 13;*/
for(int j=0; j<13; j++)
{
featureValor
=(double)((double)histogramaDSE[featureToDSECN[j]]/numDSE);
//System.out.println("VARIANZA:" +varianza + "DSE "+
69
numDSE);
//Veamos que valores pueden ser erroneos:
if (featureValor>1)
{
System.err.println("Posible error frec
elevada:"+featureValor);
}
if (CentersClasses[i][j]>1)
{
var =CentersClasses[i][j];
//System.out.println("Posible error CENTRO
elevada:"+var+ " en " +i+","+j);
}
//System.out.println("Feture: "+j+ " Caso: "+i+"
Esperado:" +CentersClasses[i][j]+" Encontrado: "+ featureValor);
acumulador += Math.pow((featureValorCentersClasses[i][j])/varianza,2);
}
acumulador = Math.sqrt(acumulador);
//System.out.println("D"+i+ "=" + acumulador);
distancias[i] = acumulador;
}
}
private void generaDecision()
{
double minimo = distancias[0];
if(distancias[1]<minimo)
minimo = distancias[1];
if(distancias[2]<minimo)
minimo = distancias[2];
if(distancias[3]<minimo)
minimo = distancias[3];
if( (minimo == distancias[0] || minimo == distancias[1]))
{
texto = true;
System.out.println("ES TEXTO!!!!! " + minimo );
}
else
{
texto = false;
// System.out.println("ES IMAGEN!!!!!
" + minimo);
}
}
public boolean obtenerResultado()
{
return texto;
70
}
public int[][] obtenerMatrizBinaria()
{
return matrizBinaria;
}
}
4.1.4. Control:
Crea la red neuronal y gestiona todo lo relacionado con esta.
import
import
import
import
import
import
import
import
java.util.ArrayList;
java.util.Iterator;
java.util.Vector;
java.awt.Toolkit;
java.awt.Image;
java.awt.*;
jmatlink.*;
java.awt.image.PixelGrabber;
71
//pintarImagen(matrizc,anchoc,altoc,5*(i*10),25);
//matrizcentrada=new int[altoc][anchoc][4];
centrado imagenCentrada=new centrado();
matrizcentrada=imagenCentrada.CentradoImagen(matrizc,
anchoc,altoc);
matrizIntensidades=new int[14][10];
intensidades inten=new intensidades();
matrizIntensidades=inten.intensidad(imagenCentrada.
getMatriz(),imagenCentrada.getAlto(),imagenCentrada.getAncho());
imagen=new Vector();
imagen.add(new Integer(imagenCentrada.getAlto()));
imagen.add(new Integer(imagenCentrada.getAncho()));
imagen.add(imagenCentrada.getMatriz());
imagenes.add(imagen);
}
return imagenes;
}
public void creacion(String entrenamiento,String derecha,
String centro,String izquierda,String neuronas1,String
neuronas2){
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,
1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
73
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,
0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,
0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
74
{1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,
0.0,0.0,0.0,
0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,
0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,
0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,1.0,
1.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,
1.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,
0.0,0.0,0.0,
0.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,
0.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0
1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,
1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,
75
1.0,1.0,1.0,
1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,
0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,
0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
76
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,
0.0,0.0,0.0,
0.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,
0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,
0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,
1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,
0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,
0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,
0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0
,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
77
1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
1.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
78
{0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0},
{0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
79
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.
0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}
};
Image original=Toolkit.getDefaultToolkit().getImage(
"matriculaalfabeto.jpg");
//g.drawImage(original,5,1,ancho,alto,this);
int[] matAlfa = new int[ancho * alto];
PixelGrabber pixels = new PixelGrabber(original,
0, 0, ancho, alto,
matAlfa, 0,
ancho);
try{
pixels.grabPixels();
}catch(Exception e){
}
entera=utilidades.convertToThreeDim(matAlfa,ancho,
alto);
filtro filtrar=new filtro();
enteraFiltrada=filtrar.filtro(entera,ancho,alto,110);
recorte recortado=new recorte(enteraFiltrada,alto,
80
ancho);
imagenes=recortado.recortar(6);
nimagenes=imagenes.size();
centrado centrar=new centrado();
imagenescentradas=centrar.centrar(imagenes);
nimagenescentradas=imagenescentradas.size();
System.out.print("Caracteres entrenamiento: " +
nimagenescentradas);
for (int i = 0; i < nimagenescentradas; i++) {
caracterInfo = (Vector) imagenescentradas.
elementAt(i);
altoc = ((Integer)
caracterInfo.elementAt(0)).intValue();
anchoc = ((Integer)
caracterInfo.elementAt(1)).intValue();
letra = (int[][][]) caracterInfo.elementAt(2);
matrizIntensidades = new int[14][10];
intensidades inten=new intensidades();
matrizIntensidades = inten.intensidad(letra,
altoc, anchoc);
matrizUna=new double[140][1];
matrizUna=utilidades.pasarDeDosAUna(
matrizIntensidades);
for(int j=0;j<140;j++){
alfabeto[j][i] = matrizUna[j][0];
}
}
*/
for(int k=0;k<36;k++){
for(int l=0;l<36;l++){
if(k==l)
objetivo[k][l]=1;
else
objetivo[k][l]=0;
}
}
engine.engPutArray("alphabet",alfabeto);
engine.engPutArray("targets",objetivo);
engine.engEvalString("[R,Q] = size(alphabet);");
engine.engEvalString ("[S2,Q] = size(targets);");
engine.engEvalString("S1 = " + neuronas1 + ";");
engine.engEvalString("S3 = " + neuronas2 + ";");
String red="net = newff(minmax(alphabet),
[S1 S3 S2],{'" + derecha + "' '" + centro + "' '" +
81
}
public void entrenamiento(String goal, String iteraciones,
String lr, String momentum,String biass,String lw){
engine.engEvalString ("net.LW{2,1} = net.LW{2,1}*" +
lw + ";");
engine.engEvalString("net.b{2} = net.b{2}*" + biass +
";");
engine.engEvalString("net.performFcn = 'sse';");
engine.engEvalString("net.trainParam.goal =" + goal +
";");
engine.engEvalString("net.trainParam.show = 10;");
engine.engEvalString ("net.trainParam.epochs = " +
iteraciones + ";");
if(!lr.equalsIgnoreCase(""))
engine.engEvalString ("net.trainParam.lr=" + lr +
";");
if(!momentum.equalsIgnoreCase(""))
engine.engEvalString ("net.trainParam.mc=" + momentum
+ ";");
engine.engEvalString("P = alphabet;");
engine.engEvalString("T = targets;");
engine.engEvalString ("[net,tr] = train(net,P,T);");
}
public void correccion(String matriculareal,ArrayList
porDibujar,int nimagenescentradas){
char caracter;
//int nimagenescentradas;
Vector caracterInfo;
int altoc,anchoc;
int[][][] letra;
int[][] matrizIntensidades;
double[][] matrizUna=new double[140][1];
double[][] matrizAprendizaje;
double[][] matrizObjetivo;
int ascii;
//nimagenescentradas=4;//imagenesCentradas.size();
matrizAprendizaje=new double[140][nimagenescentradas];
matrizObjetivo=new double[36][nimagenescentradas];
82
for(int i=0;i<36;i++)
for(int j=0;j<nimagenescentradas;j++)
matrizObjetivo[i][j]=0;
int i=0;
Iterator it = porDibujar.iterator();
while(it.hasNext())
{
Caja recActual = (Caja) it.next();
if(recActual.getMatriz()!=null){
System.out.println("estoy con las lectras");
for(int j=0;j<140;j++)
matrizAprendizaje[j][i]=(recActual.
getMatriz())[j][0];
ascii=(int)matriculareal.charAt(i);
if(ascii>=65) //es una letra
matrizObjetivo[ascii-65][i]=1;
else
matrizObjetivo[ascii-22][i]=1;
engine.engPutArray("matricula",matrizAprendizaje);
engine.engPutArray("objetivo",matrizObjetivo);
engine.engEvalString("A = matricula;");
engine.engEvalString("O = objetivo;");
engine.engEvalString ("[net,tr] = train(net,A,O);");
i++;
}
}
}
public String reconocimiento(ArrayList porDibujar){
System.out.println("Estoy en reconocimiento de caracteres");
int ancho=201;
Vector imagenes;
Vector caracterInfo;
int nimagenes,nimagenescentradas;
int[][][] letra;
Image centrada;
int altoc,anchoc;
int[][] matrizIntensidades;
double[][] matrizUna=new double[140][1];
double[][] alfabeto=new double[140][36];
double[][] objetivo=new double[36][36];
double[][] retornoMat=new double[36][1];
String salida=new String();
83
try{
Iterator it = porDibujar.iterator();
while(it.hasNext())
{
Caja recActual = (Caja) it.next();
if(recActual.espacio==true)
salida=salida+" ";
if(recActual.renglon==true)
salida=salida+"\n";
if(recActual.getMatriz()!=null){
engine.engPutArray("letra",recActual.getMatriz());
engine.engEvalString("salida=
sim(net,letra)");
retornoMat=engine.engGetArray("salida");
salida=salida.concat(String.valueOf(utilidades.reconocido
(retornoMat)));
System.out.println(salida.trim());
}
}
}catch(Exception e){
}
System.out.println("salgo");
return salida;
}
}
4.1.5. Caja:
Esta clase sirve para guardar la parte de imagen recortada, junto con el carcter y la
posicin donde esta ese carcter.
84
boolean renglon=false;
public Caja(int x,int y,int anchura,int altura,double
matriz[][] )
{
this.x = x;
this.y = y;
this.anchura = anchura;
this.altura = altura;
this.unificada = false;
this.matriz=matriz;
}
public void tieneEspacio(){
this.espacio=true;
}
public void tieneRenglon(){
this.renglon=true;
}
public void relleno(){
int auxiliar=0;
double matriz2[][]=new double[140][1];
for(int i=0;i<14;i++){
for(int j=0;j<10;j++){
if(i<altura && j<anchura){
matriz2[auxiliar++][0]=(double)matriz[i][j];
}else{
matriz2[auxiliar++][0]=0.0;
}
}
}this.matriz=matriz2;
}
public double [][] getMatriz(){
return matriz;
}
public void setOrigen(int x,int y)
{
this.x = x;
this.y = y;
}
public void setX(int x)
{
this.x = x;
}
public void setY(int y)
{
this.y = y;
}
85
87