private void btnTestImage_Click(object sender, EventArgs e)
        {
            Bitmap temp = OpenDialogLoadImage.OpenDialog(picboxImageSource);
            if (temp != null)
            {
                try
                {
                    BitmapHelper bmHelp = new BitmapHelper(temp);

                    bmHelp.Binarization(160, true); // giống vs ngưỡng trong file ImageData.cs -- đặt cùng ngưỡng để chuyển thành ảnh nhị phân
                    MyDrawing.DrawBinarization(bmHelp.ToBinaryArray(),picBinary,temp.Width,temp.Height);
                    lbResult.Text = "Result: " + Cal(bmHelp.ToBinaryArray());
                }
                catch (Exception ex) { };
            }
        }
        public List<TrainingData> ReadFolder(string path)
        {
            List<TrainingData> data = new List<TrainingData>();

            string[] Files = Directory.GetFiles(path);
            BitmapHelper temp = null;
            foreach (string s in Files)
            {
                //TrainingData trainData = new TrainingData();
                string fileName = Path.GetFileNameWithoutExtension(s);
                string Character = fileName.Split('-')[0];
                string Font = fileName.Split('-')[2];
                byte[] bytes = Encoding.Unicode.GetBytes(Character);

                double[] t = new double[16];
                for (int i = 0; i < 16; i++)
                {
                    t[i] = BitHelper.GetBit(bytes[(int)i / 8], (byte)(i % 8)) ? 1 : 0;
                }
                //byte[] b = new byte[2];
                //for (int i = 0; i < t.Length; i++)
                //{
                //    b[(int)i/8] = BitHelper.SetBit(b[(int)i / 8], (byte)(i % 8), t[i] == 1.0);
                //}
                //string a = Encoding.Unicode.GetString(b);
                Bitmap bm = new Bitmap(Image.FromFile(s));

                temp = new BitmapHelper(bm);

                // threshold = 160 default
                temp.Binarization(160, true); //
                TrainingData td = new TrainingData(temp.ToBinaryArray(), t);
                td.C = Character + Font;
                td.fileName = fileName;
                data.Add(td);

            }

            return data;
        }
 //private Bitmap Normalize(Bitmap bm)
 //{
 //    Bitmap ret;
 //    BitmapData bmDt = bm.LockBits(new Rectangle(0, 0, bm.Width, bm.Height),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);
 //    int offset = bmDt.Stride - bm.Width * 3;
 //    int top_left_X=0;
 //    int top_left_Y = 0;
 //    int bottom_right_X = bm.Width;
 //    int bottom_right_Y = bm.Height;
 //    unsafe
 //    {
 //        byte* p = (byte*)bmDt.Scan0;
 //        for (int i = 0; i < bm.Height; i++)
 //        {
 //            for (int j = 0; j < bm.Width; j++)
 //            {
 //                byte grayscale = (byte)(0.11 * p[0] + 0.59 * p[1] + 0.3 * p[2]);
 //                if (grayscale >= 127)
 //                {
 //                    top_left_X = j;
 //                    top_left_Y = i;
 //                }
 //                p+=3;
 //            }
 //            p+=offset;
 //        }
 //        for (int i = bm.Height - 1; i >= 0; i--)
 //        {
 //            for (int j = bm.Width; j >= 0; j--)
 //            {
 //                p = (byte*)bmDt.Scan0;
 //                p += (i * (bm.Width * 3 + offset) + j * 3);
 //                byte grayscale = (byte)(0.11 * p[0] + 0.59 * p[1] + 0.3 * p[2]);
 //                if (grayscale >= 127)
 //                {
 //                    bottom_right_X = j;
 //                    bottom_right_Y = i;
 //                }
 //            }
 //        }
 //    }
 //}
 private void DrawBinarization(Bitmap bm)
 {
     //Graphics g = pictureBox1.CreateGraphics();
     Bitmap nBM = new Bitmap(pictureBox1.Width, pictureBox1.Height);
     Graphics g = Graphics.FromImage(nBM);
     g.FillRectangle(Brushes.White, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));
     int W = (int)Configuration["Width"];
     int H = (int)Configuration["Height"];
     BitmapHelper bmh = new BitmapHelper(bm);
     bmh.Binarization((byte)Configuration["Threshold"], true);
     double[] binaryArray = bmh.ToBinaryArray();
     int j = 0;
     double ratioX = pictureBox1.Width / W;
     double ratioY = pictureBox1.Height / H;
     Pen p = new Pen(Brushes.Blue,2.0f);
     Font f = new Font("Tahoma",1.0f);
     for (int i = 0; i < binaryArray.Length; i++)
     {
         if (i%W == 0&&i!=0)
         {
             j++;
         }
         int RealW = i - j * W;
         if (binaryArray[i] > 0)
         {
             g.FillRectangle(Brushes.Gray, new Rectangle((int)(RealW * ratioX), (int)(j * ratioY), (int)ratioX, (int)ratioY));
             g.DrawString("1", f, Brushes.Blue, (int)(RealW * ratioX), (int)(j * ratioY));
             //g.DrawRectangle(p, new Rectangle((int)(RealW * ratioX), (int)(j * ratioY), (int)ratioX, (int)ratioY));
         }else
         {
             g.DrawString("0", f, Brushes.Blue, (int)(RealW * ratioX), (int)(j * ratioY));
         }
     }
     pictureBox1.Image = nBM;
 }