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 :)