Co robi ten kod?

0

Rozpracowuję program OCR działający na sieci neuronowej. Jego działanie ogranicza się do zrobienia wzorców ze znakami jakiejś czcionki, utworzeniu sieci neuronowej, nauczeniu jej rozpoznawania znaków według tych wzorców i zgadywaniu znaków jakie wpisze z klawiatury użytkownik (które są przekształcane z Charu na image z dodaniem szumu od 0 do 100%). Oto kod:

public double[] CharToDoubleArray(char aChar, Font aFont, int aArrayDim, int aAddNoisePercent)
		{
			double[] result = new double[aArrayDim*aArrayDim];
			Graphics gr = label5.CreateGraphics();
			Size size =Size.Round(gr.MeasureString(aChar.ToString(),aFont));
			Bitmap aSrc = new Bitmap(size.Width,size.Height);
			Graphics bmp = Graphics.FromImage(aSrc);
			bmp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
			bmp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
			bmp.Clear(Color.White);
			bmp.DrawString(aChar.ToString(),aFont,new SolidBrush(Color.Black),new Point(0,0),new StringFormat());
			ShowNoise(size,bmp,aAddNoisePercent);
			pictureBox1.Image = aSrc;
			Application.DoEvents();
			double xStep = (double)aSrc.Width/(double)aArrayDim;
			double yStep = (double)aSrc.Height/(double)aArrayDim;
			for (int i=0; i<aSrc.Width; i++)
				for (int j=0;j<aSrc.Height;j++)
				{
					int x = (int)((i/xStep));
					int y = (int)(j/yStep);
					Color c = aSrc.GetPixel(i,j);
					result[y*x+y]+=Math.Sqrt(c.R*c.R+c.B*c.B+c.G*c.G); //Convert to BW, I guess I can use B component of Alpha color space too...
				}
			return  Scale(result);
            
		}
		private double MaxOf(double[] src)
		{
			double res=double.NegativeInfinity;
			foreach (double d in src)
				if (d>res) res = d;
			return res;
		}

		private double[] Scale(double[] src)
		{
			double max = MaxOf(src);
			if (max!=0)
			{
				for(int i=0; i<src.Length; i++)
					src[i] = src[i]/max;
			}
			return src;					
		}
			  

Nie rozumiem fragmentu, który przekształca znak na obraz. Niestety nie tworzy on typowego obrazu, tylko jakąś tablicę. Najbardziej obcy zdaje się być

 result[y*x+y]+=Math.Sqrt(c.R*c.R+c.B*c.B+c.G*c.G);

fragment Czemu y*x+y?? Prosiłbym o w miarę dokładne wytłumaczenie :)

0

Bierzesz się za sieci neuronowe, a nie rozumiesz poruszania się w pętli po tablicy?

0

Jak dla mnie to ten kod jest wadliwy. y*x+y = y * (x + 1) - dziwny wzór na liczenie pozycji. Wzór na konwersję kolor => skala szarości też jest z d**y wzięty. Jesteś pewien, że to chociaż w miarę dobrze działa?

0

No po paru przejściach nauczania dokładność rozpoznawania jest niezła. Ale jest to rozpoznawanie czcionki komputerowej - nie wiem jak radzi sobie z czcionką ludzką - właśnie dlatego grzebię w tym programie, to mój cel. Czyli żeby zamiast tej dziwnej tablicy dały mu się przekazać po prostu zwykły Image. Wtedy byłby on rysowany przez użytkownika.

0

Coś mi się wydaje, że ten kod rysuje tekst na czarno-biało (tzn nie skali szarości) dlatego konwersja color => bw nie ma tutaj znaczenia.

Ponadto korzystanie z dziwacznego wzoru na emulowanie dwuindeksowej tablicy czyli: y * (x + 1), podczas gdy powinno być coś w rodzaju: y * szerokość (tutaj aArrayDim) + x jest wg mnie błędem, ale niekoniecznie musi spowodować bezużyteczność algorytmu, bo i tak wynik jest powtarzalny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1