Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using OcrTemplate.Utilities;
- using DigitalImage.util;
- using AGisCore;
- using AGisCore.Entity;
- using System.IO;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.Data.Common;
- namespace DigitalImage
- {
- public partial class MainForm : Form
- {
- BackPropagation.BackPropagation bp = null;
- public MainForm()
- {
- InitializeComponent();
- }
- Bitmap prevImage = null;
- private void btnLoadBitmap_Click(object sender, EventArgs e)
- {
- OpenFileDialog ofd = new OpenFileDialog();
- if (ofd.ShowDialog() == DialogResult.OK)
- {
- String imageFileName = ofd.FileName;
- Bitmap bmp = new Bitmap(imageFileName);
- prevImage = imageEditorDisplay1.mapa.bmp;
- imageEditorDisplay1.mapa.bmp = bmp;
- btnClear_Click(null, null);
- imageEditorDisplay1.FitImage();
- imageEditorDisplay1.Refresh();
- Properties.Settings.Default.imagePath = imageFileName;
- Properties.Settings.Default.Save();
- }
- }
- private void btnSave_Click(object sender, EventArgs e)
- {
- SaveFileDialog ofd = new SaveFileDialog();
- string fileName = DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + ".bmp";
- ofd.FileName = fileName;
- if (ofd.ShowDialog() == DialogResult.OK)
- {
- String imageFileName = ofd.FileName;
- imageEditorDisplay1.mapa.bmp.Save(imageFileName);
- }
- }
- private void btnReload_Click(object sender, EventArgs e)
- {
- String str = Properties.Settings.Default.imagePath;
- if (!String.IsNullOrEmpty(str))
- {
- Bitmap bmp = new Bitmap(str);
- imageEditorDisplay1.mapa.bmp = bmp;
- imageEditorDisplay1.FitImage();
- imageEditorDisplay1.Refresh();
- }
- }
- private void btnBinaryTiles_Click(object sender, EventArgs e)
- {
- Bitmap bmp = imageEditorDisplay1.mapa.bmp;
- byte[,] slika = ImageUtil.bitmapToByteMatrix(bmp);
- byte[,] bSlika = ImageUtil.matrixToBinaryTiles(slika, 15, 15);
- Bitmap temp = ImageUtil.matrixToBitmap(bSlika);
- imageEditorDisplay1.mapa.bmp = temp;
- imageEditorDisplay1.FitImage();
- imageEditorDisplay1.Refresh();
- }
- private void MainForm_Load(object sender, EventArgs e)
- {
- String str = Properties.Settings.Default.imagePath;
- if (!String.IsNullOrEmpty(str))
- {
- Bitmap bmp = new Bitmap(str);
- imageEditorDisplay1.mapa.bmp = bmp;
- imageEditorDisplay1.FitImage();
- imageEditorDisplay1.Refresh();
- }
- }
- private void btnCopy_Click(object sender, EventArgs e)
- {
- imageEditorDisplay1.CopyToClipboard();
- }
- List<RasterRegion> kandidati = null;
- Dictionary<String, int> alfabet = new Dictionary<string, int>();
- Dictionary<int, String> alfabetInv = new Dictionary<int, string>();
- private void btnRegionLabeling_Click(object sender, EventArgs e)
- {
- Bitmap bmp = imageEditorDisplay1.mapa.bmp;
- byte[,] oSlika = ImageUtil.bitmapToByteMatrix(bmp);
- byte[,] slika = ImageUtil.matrixToBinaryTiles(oSlika, 15, 15);
- int w = slika.GetLength(1);
- int h = slika.GetLength(0);
- kandidati = ImageUtil.regionLabeling(slika);
- foreach (RasterRegion reg in kandidati)
- {
- reg.odrediMomente();
- }
- List<RasterRegion> aKandidati = new List<RasterRegion>();
- foreach (RasterRegion reg in kandidati)
- {
- if (reg.points.Count > 10) {
- aKandidati.Add(reg);
- }
- }
- kandidati = aKandidati;
- // ovde sloziti slova u redove i kolone :)))
- String[] linije = tbTrenningSet.Text.Replace("\r", "").Split('\n');
- String slova = tbTrenningSet.Text.Replace("\n", "").Replace("\r", "");
- int rr = 0;
- List<RasterRegion> slozeniKandidati = new List<RasterRegion>();
- for (int i = 0; i < linije.Length; i++)
- {
- String linija = linije[i];
- int N = linija.Length;
- List<RasterRegion> red = new List<RasterRegion>();
- for (int j = 0; j < N; j++)
- {
- red.Add(kandidati[rr]);
- rr++;
- }
- red.Sort(new DigitalImage.util.RasterRegion.RComparer());
- foreach (RasterRegion regS in red)
- slozeniKandidati.Add(regS);
- }
- kandidati = slozeniKandidati;
- int regId = 0;
- int redBr = 0;
- foreach (RasterRegion reg in kandidati)
- {
- List<Tacka> tacke = new List<Tacka>();
- tacke.Add(new Tacka(reg.minX - 1, reg.minY - 1));
- tacke.Add(new Tacka(reg.maxX + 1, reg.minY - 1));
- tacke.Add(new Tacka(reg.maxX + 1, reg.maxY + 1));
- tacke.Add(new Tacka(reg.minX - 1, reg.maxY + 1));
- Poligon rec = new Poligon(tacke, Color.FromArgb(10, Color.Green));
- imageEditorDisplay1.selectedIndexer.add(rec);
- reg.Tag = "" + slova[regId];
- if (!alfabet.ContainsKey(reg.Tag)) {
- alfabet.Add(reg.Tag, redBr);
- alfabetInv.Add(redBr, reg.Tag);
- redBr++;
- }
- Labela lbl = new Labela(reg.minX - 1, reg.minY - 1);
- lbl.boja = Color.Red;
- lbl.labela = reg.Tag;
- imageEditorDisplay1.selectedIndexer.add(lbl);
- regId++;
- }
- imageEditorDisplay1.FitImage();
- imageEditorDisplay1.Refresh();
- }
- double[, ,] obucavajuciSkup = null;
- int brojUzoraka = 0;
- private void btnTrainingSet_Click(object sender, EventArgs e)
- {
- brojUzoraka = kandidati.Count;
- obucavajuciSkup = new double[brojUzoraka, 2, 64];
- Size size = new Size(64, 64);
- for (int uzorak = 0; uzorak < brojUzoraka; uzorak++)
- {
- RasterRegion reg = kandidati[uzorak];
- byte[,] regSlika = reg.odrediNSliku(); // ispravi region da stoji uspravno
- byte[,] nSlika = ImageUtil.resizeImage(regSlika, size); // resize na 64x64
- double[] ulaz = pripremiSlikuZaVNM(nSlika); // kreiraj vektor od 64 elementa na osnovu 64x64 slike
- int cifra = alfabet[reg.Tag]; // nadji koja je cifra obelezeni region
- for (int i = 0; i < 64; i++)
- {
- obucavajuciSkup[uzorak, 0, i] = ulaz[i];
- }
- for (int i = 0; i < 10; i++)
- obucavajuciSkup[uzorak, 1, i] = 0;
- obucavajuciSkup[uzorak, 1, cifra] = 1;
- // TODO 2
- // formiranje obucavajuceg skupa
- // - na ulaze neuronske mreze dovodi se kreirani vektor od 64 elementa
- // - na izlaz koji odgovara indeksu cifre postaviti 1, na ostale 0
- }
- MessageBox.Show("Obucavajuci skup formiran! ");
- }
- private void btnTraining_Click(object sender, EventArgs e)
- {
- if (bp != null)
- {
- brojUzoraka = obucavajuciSkup.GetLength(0) + bp.obucavajuciSkup.GetLength(0);
- double[, ,] novi = new double[brojUzoraka, 2, 64];
- for (int i = 0; i < brojUzoraka; i++)
- {
- if (i < obucavajuciSkup.GetLength(0))
- {
- for (int j = 0; j < obucavajuciSkup.GetLength(1); j++)
- {
- for (int k = 0; k < obucavajuciSkup.GetLength(2); k++)
- {
- novi[i, j, k] = obucavajuciSkup[i, j, k];
- }
- }
- }
- else
- {
- for (int j = 0; j < bp.obucavajuciSkup.GetLength(1); j++)
- {
- for (int k = 0; k < bp.obucavajuciSkup.GetLength(2); k++)
- {
- novi[i, j, k] = bp.obucavajuciSkup[i - obucavajuciSkup.GetLength(0), j, k];
- }
- }
- }
- }
- obucavajuciSkup = novi;
- }
- bp = new BackPropagation.BackPropagation(brojUzoraka, obucavajuciSkup);
- bp.obuci();
- Function f1 = new Function(Color.Red, bp.greske, Function.VBAR);
- List<Function> ff = new List<Function>();
- ff.Add(f1);
- FrmChart chart = new FrmChart(ff);
- chart.Show();
- }
- private double[] pripremiSlikuZaVNM(byte[,] slika)
- {
- // TODO 1
- // na osnovu slike koja je dimenzija 64x64 napraviti vektor od 64 elementa
- int[] temp1 = new int[64];
- double mean = ImageUtil.mean(slika);
- slika = ImageUtil.matrixToBinary(slika,125);
- int k = 0; // index of temp1;
- byte[,] slikaArg;
- for (int i = 0; i < 8; i++)
- {
- for (int j = 0; j<8;j++)
- {
- slikaArg = retOsamPutaOsam(slika, i, j);
- temp1[k++] = countBlackinPic(slikaArg);
- }
- }
- double[] temp2 = new double[64];
- for (int k1 = 0; k1 < k; k1++)
- {
- temp2[k1] = ((double)temp1[k1] - 32) / 32;
- }
- Console.WriteLine("jedna vrednost temp2: "+ temp2[2]);
- return temp2;
- }
- private byte[,] retOsamPutaOsam(byte[,] slika, int i, int j)
- {
- byte[,] retVal= new byte[8,8];
- i = i * 8;
- j = j * 8;
- for (int ii = i; ii < i + 8; ii++)
- {
- for (int jj = j; jj < j + 8; jj++)
- {
- retVal[ii-i,jj-j] = slika[ii, jj];
- }
- }
- return retVal;
- }
- private int countBlackinPic(byte[,] slika)
- {
- int temp = 0;
- for (int i = 0; i < 8; i++)
- {
- for (int j = 0; j < 8; j++)
- {
- if (slika[i, j] == 0)
- temp++;
- }
- }
- return temp;
- }
- private void btnRecognizeAll_Click(object sender, EventArgs e)
- {
- ClearImageEditor();
- Bitmap bmp = imageEditorDisplay1.mapa.bmp;
- byte[,] slika = ImageUtil.bitmapToByteMatrix(bmp);
- byte[,] bSlika = ImageUtil.matrixToBinaryTiles(slika, 15, 15);
- //imageEditorDisplay1.mapa.bmp = ImageUtil.matrixToBitmap(bSlika);
- List<RasterRegion> regions = ImageUtil.regionLabeling(bSlika);
- foreach (RasterRegion reg in regions)
- {
- reg.odrediMomente();
- }
- List<RasterRegion> aKandidati = new List<RasterRegion>();
- foreach (RasterRegion reg in regions)
- {
- if (reg.points.Count > 10)
- {
- aKandidati.Add(reg);
- }
- }
- regions = aKandidati;
- regions.Sort((a, b) =>
- {
- return a.minX.CompareTo(b.minX);
- });
- string rez = "";
- foreach (RasterRegion reg in regions)
- {
- reg.odrediMomente();
- byte[,] regSlika = reg.odrediNSliku();
- regSlika = ImageUtil.resizeImage(regSlika, new Size(64, 64));
- double[] ulaz = pripremiSlikuZaVNM(regSlika);
- int cifra = bp.izracunajCifru(ulaz);
- rez += alfabetInv[cifra]; // cifra + ", "
- List<Tacka> tacke = new List<Tacka>();
- tacke.Add(new Tacka(reg.minX - 1, reg.minY - 1));
- tacke.Add(new Tacka(reg.maxX + 1, reg.minY - 1));
- tacke.Add(new Tacka(reg.maxX + 1, reg.maxY + 1));
- tacke.Add(new Tacka(reg.minX - 1, reg.maxY + 1));
- Labela lbl = new Labela(reg.minX - 1, reg.minY - 1);
- lbl.boja = Color.Red;
- lbl.size = 10;
- lbl.labela = alfabetInv[cifra];// cifra.ToString();
- imageEditorDisplay1.selectedIndexer.add(lbl);
- Poligon rec = new Poligon(tacke, Color.FromArgb(10, Color.Green));
- imageEditorDisplay1.selectedIndexer.add(rec);
- }
- tbText.Text = rez;
- }
- private int compare(int a, int b)
- {
- if (a > b)
- return a;
- return b;
- }
- private void btnClear_Click(object sender, EventArgs e)
- {
- ClearImageEditor();
- }
- private void ClearImageEditor()
- {
- imageEditorDisplay1.mapa.poligoni.Clear();
- imageEditorDisplay1.mapa.tacke.Clear();
- imageEditorDisplay1.mapa.linije.Clear();
- imageEditorDisplay1.mapa.labele.Clear();
- imageEditorDisplay1.selectedIndexer.clear();
- imageEditorDisplay1.Refresh();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement