Advertisement
nex036ara

vezba5

Nov 21st, 2013
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.17 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using OcrTemplate.Utilities;
  9. using DigitalImage.util;
  10. using AGisCore;
  11. using AGisCore.Entity;
  12. using System.IO;
  13. using System.Runtime.Serialization.Formatters.Binary;
  14. using System.Data.Common;
  15.  
  16. namespace DigitalImage
  17. {
  18.     public partial class MainForm : Form
  19.     {
  20.         BackPropagation.BackPropagation bp = null;
  21.  
  22.         public MainForm()
  23.         {
  24.             InitializeComponent();
  25.         }
  26.  
  27.         Bitmap prevImage = null;
  28.         private void btnLoadBitmap_Click(object sender, EventArgs e)
  29.         {
  30.             OpenFileDialog ofd = new OpenFileDialog();
  31.             if (ofd.ShowDialog() == DialogResult.OK)
  32.             {
  33.                 String imageFileName = ofd.FileName;
  34.                 Bitmap bmp = new Bitmap(imageFileName);
  35.                 prevImage = imageEditorDisplay1.mapa.bmp;
  36.  
  37.                 imageEditorDisplay1.mapa.bmp = bmp;
  38.                 btnClear_Click(null, null);
  39.                 imageEditorDisplay1.FitImage();
  40.                 imageEditorDisplay1.Refresh();
  41.  
  42.                 Properties.Settings.Default.imagePath = imageFileName;
  43.                 Properties.Settings.Default.Save();
  44.  
  45.             }
  46.         }
  47.  
  48.         private void btnSave_Click(object sender, EventArgs e)
  49.         {
  50.             SaveFileDialog ofd = new SaveFileDialog();
  51.             string fileName = DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + ".bmp";
  52.             ofd.FileName = fileName;
  53.             if (ofd.ShowDialog() == DialogResult.OK)
  54.             {
  55.                 String imageFileName = ofd.FileName;
  56.                 imageEditorDisplay1.mapa.bmp.Save(imageFileName);
  57.             }
  58.         }
  59.  
  60.         private void btnReload_Click(object sender, EventArgs e)
  61.         {
  62.             String str = Properties.Settings.Default.imagePath;
  63.             if (!String.IsNullOrEmpty(str))
  64.             {
  65.                 Bitmap bmp = new Bitmap(str);
  66.  
  67.                 imageEditorDisplay1.mapa.bmp = bmp;
  68.                 imageEditorDisplay1.FitImage();
  69.                 imageEditorDisplay1.Refresh();
  70.             }
  71.         }
  72.  
  73.         private void btnBinaryTiles_Click(object sender, EventArgs e)
  74.         {
  75.             Bitmap bmp = imageEditorDisplay1.mapa.bmp;
  76.             byte[,] slika = ImageUtil.bitmapToByteMatrix(bmp);
  77.             byte[,] bSlika = ImageUtil.matrixToBinaryTiles(slika, 15, 15);
  78.             Bitmap temp = ImageUtil.matrixToBitmap(bSlika);
  79.             imageEditorDisplay1.mapa.bmp = temp;
  80.             imageEditorDisplay1.FitImage();
  81.             imageEditorDisplay1.Refresh();
  82.         }
  83.  
  84.         private void MainForm_Load(object sender, EventArgs e)
  85.         {
  86.             String str = Properties.Settings.Default.imagePath;
  87.             if (!String.IsNullOrEmpty(str))
  88.             {
  89.                 Bitmap bmp = new Bitmap(str);
  90.  
  91.                 imageEditorDisplay1.mapa.bmp = bmp;
  92.                 imageEditorDisplay1.FitImage();
  93.                 imageEditorDisplay1.Refresh();
  94.             }
  95.         }
  96.  
  97.         private void btnCopy_Click(object sender, EventArgs e)
  98.         {
  99.             imageEditorDisplay1.CopyToClipboard();
  100.         }
  101.  
  102.         List<RasterRegion> kandidati = null;
  103.         Dictionary<String, int> alfabet = new Dictionary<string, int>();
  104.         Dictionary<int, String> alfabetInv = new Dictionary<int, string>();
  105.  
  106.         private void btnRegionLabeling_Click(object sender, EventArgs e)
  107.         {
  108.             Bitmap bmp = imageEditorDisplay1.mapa.bmp;
  109.             byte[,] oSlika = ImageUtil.bitmapToByteMatrix(bmp);
  110.             byte[,] slika = ImageUtil.matrixToBinaryTiles(oSlika, 15, 15);
  111.            
  112.            
  113.             int w = slika.GetLength(1);
  114.             int h = slika.GetLength(0);
  115.  
  116.             kandidati = ImageUtil.regionLabeling(slika);
  117.             foreach (RasterRegion reg in kandidati)
  118.             {
  119.                 reg.odrediMomente();
  120.             }
  121.  
  122.             List<RasterRegion> aKandidati = new List<RasterRegion>();
  123.             foreach (RasterRegion reg in kandidati)
  124.             {
  125.                 if (reg.points.Count > 10) {
  126.                     aKandidati.Add(reg);
  127.                 }
  128.             }
  129.             kandidati = aKandidati;
  130.            
  131.             // ovde sloziti slova u redove i kolone :)))
  132.             String[] linije = tbTrenningSet.Text.Replace("\r", "").Split('\n');
  133.             String slova = tbTrenningSet.Text.Replace("\n", "").Replace("\r", "");
  134.             int rr = 0;
  135.             List<RasterRegion> slozeniKandidati = new List<RasterRegion>();
  136.             for (int i = 0; i < linije.Length; i++)
  137.             {
  138.                 String linija = linije[i];
  139.                 int N = linija.Length;
  140.                 List<RasterRegion> red = new List<RasterRegion>();
  141.                 for (int j = 0; j < N; j++)
  142.                 {
  143.                     red.Add(kandidati[rr]);
  144.                     rr++;
  145.                 }
  146.                 red.Sort(new DigitalImage.util.RasterRegion.RComparer());
  147.                 foreach (RasterRegion regS in red)
  148.                     slozeniKandidati.Add(regS);
  149.             }
  150.             kandidati = slozeniKandidati;
  151.  
  152.             int regId = 0;
  153.             int redBr = 0;
  154.             foreach (RasterRegion reg in kandidati)
  155.             {
  156.                 List<Tacka> tacke = new List<Tacka>();
  157.                 tacke.Add(new Tacka(reg.minX - 1, reg.minY - 1));
  158.                 tacke.Add(new Tacka(reg.maxX + 1, reg.minY - 1));
  159.                 tacke.Add(new Tacka(reg.maxX + 1, reg.maxY + 1));
  160.                 tacke.Add(new Tacka(reg.minX - 1, reg.maxY + 1));
  161.                 Poligon rec = new Poligon(tacke, Color.FromArgb(10, Color.Green));
  162.                 imageEditorDisplay1.selectedIndexer.add(rec);
  163.                 reg.Tag = "" + slova[regId];
  164.                 if (!alfabet.ContainsKey(reg.Tag)) {
  165.                     alfabet.Add(reg.Tag, redBr);
  166.                     alfabetInv.Add(redBr, reg.Tag);
  167.                     redBr++;
  168.                 }
  169.  
  170.                 Labela lbl = new Labela(reg.minX - 1, reg.minY - 1);
  171.                 lbl.boja = Color.Red;
  172.                 lbl.labela = reg.Tag;
  173.                 imageEditorDisplay1.selectedIndexer.add(lbl);
  174.                 regId++;
  175.             }
  176.             imageEditorDisplay1.FitImage();
  177.             imageEditorDisplay1.Refresh();
  178.         }
  179.  
  180.  
  181.         double[, ,] obucavajuciSkup = null;
  182.         int brojUzoraka = 0;
  183.         private void btnTrainingSet_Click(object sender, EventArgs e)
  184.         {
  185.             brojUzoraka = kandidati.Count;
  186.             obucavajuciSkup = new double[brojUzoraka, 2, 64];
  187.             Size size = new Size(64, 64);
  188.             for (int uzorak = 0; uzorak < brojUzoraka; uzorak++)
  189.             {
  190.                 RasterRegion reg = kandidati[uzorak];
  191.  
  192.                 byte[,] regSlika = reg.odrediNSliku(); // ispravi region da stoji uspravno
  193.                 byte[,] nSlika = ImageUtil.resizeImage(regSlika, size); // resize na 64x64
  194.                 double[] ulaz = pripremiSlikuZaVNM(nSlika); // kreiraj vektor od 64 elementa na osnovu 64x64 slike
  195.                
  196.                 int cifra = alfabet[reg.Tag]; // nadji koja je cifra obelezeni region
  197.                 for (int i = 0; i < 64; i++)
  198.                 {
  199.                     obucavajuciSkup[uzorak, 0, i] = ulaz[i];
  200.                 }
  201.                 for (int i = 0; i < 10; i++)
  202.                     obucavajuciSkup[uzorak, 1, i] = 0;
  203.  
  204.                 obucavajuciSkup[uzorak, 1, cifra] = 1;
  205.                 // TODO 2
  206.                 // formiranje obucavajuceg skupa
  207.                 // - na ulaze neuronske mreze dovodi se kreirani vektor od 64 elementa
  208.                 // - na izlaz koji odgovara indeksu cifre postaviti 1, na ostale 0
  209.             }
  210.  
  211.             MessageBox.Show("Obucavajuci skup formiran! ");
  212.         }
  213.  
  214.         private void btnTraining_Click(object sender, EventArgs e)
  215.         {
  216.             if (bp != null)
  217.             {
  218.                 brojUzoraka = obucavajuciSkup.GetLength(0) + bp.obucavajuciSkup.GetLength(0);
  219.                 double[, ,] novi = new double[brojUzoraka, 2, 64];
  220.                 for (int i = 0; i < brojUzoraka; i++)
  221.                 {
  222.                     if (i < obucavajuciSkup.GetLength(0))
  223.                     {
  224.                         for (int j = 0; j < obucavajuciSkup.GetLength(1); j++)
  225.                         {
  226.                             for (int k = 0; k < obucavajuciSkup.GetLength(2); k++)
  227.                             {
  228.                                 novi[i, j, k] = obucavajuciSkup[i, j, k];
  229.                             }
  230.                         }
  231.                     }
  232.                     else
  233.                     {
  234.                         for (int j = 0; j < bp.obucavajuciSkup.GetLength(1); j++)
  235.                         {
  236.                             for (int k = 0; k < bp.obucavajuciSkup.GetLength(2); k++)
  237.                             {
  238.                                 novi[i, j, k] = bp.obucavajuciSkup[i - obucavajuciSkup.GetLength(0), j, k];
  239.                             }
  240.                         }
  241.                     }
  242.                 }
  243.  
  244.                 obucavajuciSkup = novi;
  245.             }
  246.             bp = new BackPropagation.BackPropagation(brojUzoraka, obucavajuciSkup);
  247.             bp.obuci();
  248.  
  249.             Function f1 = new Function(Color.Red, bp.greske, Function.VBAR);
  250.             List<Function> ff = new List<Function>();
  251.             ff.Add(f1);
  252.             FrmChart chart = new FrmChart(ff);
  253.             chart.Show();
  254.         }
  255.  
  256.         private double[] pripremiSlikuZaVNM(byte[,] slika)
  257.         {
  258.             // TODO 1
  259.             // na osnovu slike koja je dimenzija 64x64 napraviti vektor od 64 elementa
  260.             int[] temp1 = new int[64];
  261.             double mean = ImageUtil.mean(slika);
  262.  
  263.             slika = ImageUtil.matrixToBinary(slika,125);
  264.             int k = 0; // index of temp1;
  265.            
  266.             byte[,] slikaArg;
  267.             for (int i = 0; i < 8; i++)
  268.             {
  269.                 for (int j = 0; j<8;j++)
  270.                 {
  271.                     slikaArg = retOsamPutaOsam(slika, i, j);
  272.                     temp1[k++] = countBlackinPic(slikaArg);
  273.                 }
  274.             }
  275.             double[] temp2 = new double[64];
  276.             for (int k1 = 0; k1 < k; k1++)
  277.             {
  278.                 temp2[k1] = ((double)temp1[k1] - 32) / 32;
  279.                
  280.             }
  281.             Console.WriteLine("jedna vrednost temp2: "+ temp2[2]);
  282.             return temp2;
  283.         }
  284.  
  285.         private byte[,] retOsamPutaOsam(byte[,] slika, int i, int j)
  286.         {
  287.             byte[,] retVal= new byte[8,8];
  288.             i = i * 8;
  289.             j = j * 8;
  290.             for (int ii = i; ii < i + 8; ii++)
  291.             {
  292.                 for (int jj = j; jj < j + 8; jj++)
  293.                 {
  294.                     retVal[ii-i,jj-j] = slika[ii, jj];
  295.                 }
  296.             }
  297.             return retVal;
  298.         }
  299.  
  300.         private int countBlackinPic(byte[,] slika)
  301.         {
  302.             int temp = 0;
  303.             for (int i = 0; i < 8; i++)
  304.             {
  305.                 for (int j = 0; j < 8; j++)
  306.                 {
  307.                     if (slika[i, j] == 0)
  308.                         temp++;
  309.                 }
  310.             }
  311.             return temp;
  312.         }
  313.  
  314.         private void btnRecognizeAll_Click(object sender, EventArgs e)
  315.         {
  316.             ClearImageEditor();
  317.  
  318.             Bitmap bmp = imageEditorDisplay1.mapa.bmp;
  319.  
  320.             byte[,] slika = ImageUtil.bitmapToByteMatrix(bmp);
  321.             byte[,] bSlika = ImageUtil.matrixToBinaryTiles(slika, 15, 15);
  322.  
  323.             //imageEditorDisplay1.mapa.bmp = ImageUtil.matrixToBitmap(bSlika);
  324.             List<RasterRegion> regions = ImageUtil.regionLabeling(bSlika);
  325.             foreach (RasterRegion reg in regions)
  326.             {
  327.                 reg.odrediMomente();
  328.             }
  329.             List<RasterRegion> aKandidati = new List<RasterRegion>();
  330.             foreach (RasterRegion reg in regions)
  331.             {
  332.                 if (reg.points.Count > 10)
  333.                 {
  334.                     aKandidati.Add(reg);
  335.                 }
  336.             }
  337.             regions = aKandidati;
  338.  
  339.             regions.Sort((a, b) =>
  340.             {
  341.                 return a.minX.CompareTo(b.minX);
  342.             });
  343.             string rez = "";
  344.  
  345.             foreach (RasterRegion reg in regions)
  346.             {
  347.                 reg.odrediMomente();
  348.                 byte[,] regSlika = reg.odrediNSliku();
  349.                 regSlika = ImageUtil.resizeImage(regSlika, new Size(64, 64));
  350.                
  351.                 double[] ulaz = pripremiSlikuZaVNM(regSlika);
  352.                 int cifra = bp.izracunajCifru(ulaz);
  353.                 rez += alfabetInv[cifra]; // cifra + ", "
  354.  
  355.                 List<Tacka> tacke = new List<Tacka>();
  356.                 tacke.Add(new Tacka(reg.minX - 1, reg.minY - 1));
  357.                 tacke.Add(new Tacka(reg.maxX + 1, reg.minY - 1));
  358.                 tacke.Add(new Tacka(reg.maxX + 1, reg.maxY + 1));
  359.                 tacke.Add(new Tacka(reg.minX - 1, reg.maxY + 1));
  360.                 Labela lbl = new Labela(reg.minX - 1, reg.minY - 1);
  361.                 lbl.boja = Color.Red;
  362.                 lbl.size = 10;
  363.                 lbl.labela = alfabetInv[cifra];// cifra.ToString();
  364.                 imageEditorDisplay1.selectedIndexer.add(lbl);
  365.                 Poligon rec = new Poligon(tacke, Color.FromArgb(10, Color.Green));
  366.  
  367.                 imageEditorDisplay1.selectedIndexer.add(rec);
  368.             }
  369.  
  370.             tbText.Text = rez;
  371.         }
  372.  
  373.         private int compare(int a, int b)
  374.         {
  375.             if (a > b)
  376.                 return a;
  377.             return b;
  378.         }
  379.  
  380.         private void btnClear_Click(object sender, EventArgs e)
  381.         {
  382.             ClearImageEditor();
  383.         }
  384.  
  385.         private void ClearImageEditor()
  386.         {
  387.             imageEditorDisplay1.mapa.poligoni.Clear();
  388.             imageEditorDisplay1.mapa.tacke.Clear();
  389.             imageEditorDisplay1.mapa.linije.Clear();
  390.             imageEditorDisplay1.mapa.labele.Clear();
  391.             imageEditorDisplay1.selectedIndexer.clear();
  392.             imageEditorDisplay1.Refresh();
  393.         }
  394.  
  395.     }
  396. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement