/// <summary> /// Save and read Image Deskew /// </summary> /// <param name="filename"></param> /// <returns></returns> //public static string SaveAndRead(string filename) //{ // const double MINIMUM_DESKEW_THRESHOLD = 0.05d; // //string bmstr = @"C:\Users\admin\source\repos\RGB2Gray\japan3.png"; // var bmstr = filename; // var temFile = bmstr.Substring(bmstr.LastIndexOf('\\') + 1); // var temFile2 = temFile.Substring(0, temFile.LastIndexOf('.')); // string graystr = bmstr.Substring(0, bmstr.LastIndexOf('\\') + 1) + temFile2 + "Deskew2.png"; // Console.WriteLine(graystr); // Bitmap sourcebm = null; // Bitmap graybm = null; // if (!File.Exists(graystr)) // { // try // { // Stopwatch stpWatch = Stopwatch.StartNew(); // sourcebm = new Bitmap(bmstr); // //Using deskew algorithm here // gmseDeskew skew= new gmseDeskew(sourcebm); // double imageSkewAngle = skew.GetSkewAngle(); // if (imageSkewAngle > MINIMUM_DESKEW_THRESHOLD || imageSkewAngle <-(MINIMUM_DESKEW_THRESHOLD)) // { // Console.WriteLine("imageSkewAngle: " + imageSkewAngle); // graybm = RotateImage2((Bitmap)skew.cBmp, -imageSkewAngle); // graybm.Save(graystr); // stpWatch.Stop(); // var t = stpWatch.Elapsed.TotalMilliseconds.ToString(); // Console.WriteLine("Convert RGB to Gray sucessfully within {0} ms", t); // return graystr; // } // return null; // } // catch (Exception e) // { // Console.WriteLine("Error message" + e.Message); // return null; // } // finally // { // if (sourcebm != null) // { // sourcebm.Dispose(); // } // if (graybm != null) // { // graybm.Dispose(); // } // } // } // return graystr; //} // Return deskewedImage public static Bitmap DeskewImage(Image currentImg) { const double MINIMUM_DESKEW_THRESHOLD = 0.05d; //string bmstr = @"C:\Users\admin\source\repos\RGB2Gray\japan3.png"; //var bmstr = filename; //var temFile = bmstr.Substring(bmstr.LastIndexOf('\\') + 1); //var temFile2 = temFile.Substring(0, temFile.LastIndexOf('.')); //string graystr = bmstr.Substring(0, bmstr.LastIndexOf('\\') + 1) + temFile2 + "Deskew2.png"; //Console.WriteLine(graystr); Bitmap sourcebm = null; Bitmap graybm = null; sourcebm = new Bitmap(currentImg); //Using deskew algorithm here gmseDeskew skew = new gmseDeskew(sourcebm); double imageSkewAngle = skew.GetSkewAngle(); if (imageSkewAngle > MINIMUM_DESKEW_THRESHOLD || imageSkewAngle < -(MINIMUM_DESKEW_THRESHOLD)) { Console.WriteLine("imageSkewAngle: " + imageSkewAngle); graybm = RotateImage2((Bitmap)skew.cBmp, -imageSkewAngle); //graybm = gmseDeskew.CropRotationRect((Bitmap)skew.cBmp, new Rectangle(26,146, 676, 109), (float)-imageSkewAngle, true); return(graybm); } else { return(sourcebm); } }
public static string SaveAndRead(string filename) { const double MINIMUM_DESKEW_THRESHOLD = 0.05d; //string bmstr = @"C:\Users\admin\source\repos\RGB2Gray\japan3.png"; var bmstr = filename; var temFile = bmstr.Substring(bmstr.LastIndexOf('\\') + 1); var temFile2 = temFile.Substring(0, temFile.LastIndexOf('.')); string graystr = bmstr.Substring(0, bmstr.LastIndexOf('\\') + 1) + temFile2 + "Deskew2.png"; Console.WriteLine(graystr); Bitmap sourcebm = null; Bitmap graybm = null; if (!File.Exists(graystr)) { try { Stopwatch stpWatch = Stopwatch.StartNew(); sourcebm = new Bitmap(bmstr); //Using deskew algorithm here gmseDeskew skew = new gmseDeskew(sourcebm); double imageSkewAngle = skew.GetSkewAngle(); if (imageSkewAngle > MINIMUM_DESKEW_THRESHOLD || imageSkewAngle < -(MINIMUM_DESKEW_THRESHOLD)) { Console.WriteLine("imageSkewAngle: " + imageSkewAngle); graybm = RotateImage2((Bitmap)skew.cBmp, -imageSkewAngle); graybm.Save(graystr); stpWatch.Stop(); var t = stpWatch.Elapsed.TotalMilliseconds.ToString(); Console.WriteLine("Convert RGB to Gray sucessfully within {0} ms", t); return(graystr); } return(null); } catch (Exception e) { Console.WriteLine("Error message" + e.Message); return(null); } finally { if (sourcebm != null) { sourcebm.Dispose(); } if (graybm != null) { graybm.Dispose(); } } } return(graystr); }
/// <summary> /// This is used to automatically find skewAngle and skew /// </summary> /// <param name="source"></param> /// <param name="rect"></param> /// <param name="HighQuality"></param> /// <returns></returns> public static Bitmap CropRotationRect2(Bitmap source, Rectangle rect, bool HighQuality) { int addition = (int)Math.Sqrt(rect.Width * rect.Width + rect.Height * rect.Height) - rect.Width; rect = new Rectangle(rect.X - (int)addition / 2, rect.Y, (int)Math.Sqrt(rect.Width * rect.Width + rect.Height * rect.Height), rect.Height); //Crop function first Image img = CropImage.Crop(source, rect); //Get skewAngle first time double imageSkewAngle_temp = 100; //initial skew angle double imageSkewAngle = 0; //not skew int iter = 0; //iteration while (Math.Abs(imageSkewAngle_temp) > 0.1 && iter < 5) { var skew = new gmseDeskew(ImageConverter.BitmapImage2Bitmap(ImageConverter.Image2BitmapImage(img))); imageSkewAngle_temp = skew.GetSkewAngle(); imageSkewAngle = imageSkewAngle + imageSkewAngle_temp; img = gmseDeskew.DeskewImage(img); iter = iter + 1; } Debug.WriteLine("Goc skew tich luy sau loop: " + imageSkewAngle.ToString()); Bitmap result = new Bitmap(rect.Width, rect.Height); using (Graphics g = Graphics.FromImage(result)) { g.InterpolationMode = HighQuality ? InterpolationMode.HighQualityBicubic : InterpolationMode.Default; using (Matrix mat = new Matrix()) { mat.Translate(-rect.X, -rect.Y); mat.RotateAt(-(float)imageSkewAngle, new Point(rect.X + (int)rect.Width / 2, rect.Y + (int)rect.Height / 2)); g.Transform = mat; g.DrawImage(source, new Point(0, 0)); } } return(result); }
//perform use skew angle from Deskew algorithm /// <summary> /// This method is used to find skewAngle with specificed time and skew /// </summary> /// <param name="source"></param> /// <param name="rect"></param> /// <param name="HighQuality"></param> /// <returns></returns> public static Bitmap CropRotationRect(Bitmap source, Rectangle rect, bool HighQuality) { //Crop function first Image img = CropImage.Crop(source, rect); //Get skewAngle first time gmseDeskew skew = new gmseDeskew(ImageConverter.BitmapImage2Bitmap(ImageConverter.Image2BitmapImage(img))); double imageSkewAngle = skew.GetSkewAngle(); //Accumulate skewAngle second time Bitmap img2 = gmseDeskew.DeskewImage(ImageConverter.BitmapImage2Bitmap(ImageConverter.Image2BitmapImage(img))); skew = new gmseDeskew(img2); imageSkewAngle = imageSkewAngle + skew.GetSkewAngle(); //Accumulate skewAngle third time //Bitmap img3 = gmseDeskew.DeskewImage(img2); //gmseDeskew skew3 = new gmseDeskew(img3); //imageSkewAngle = imageSkewAngle + skew3.GetSkewAngle(); Debug.WriteLine("Goc skew sau 2 lan tim: " + imageSkewAngle.ToString()); Bitmap result = new Bitmap(rect.Width, rect.Height); using (Graphics g = Graphics.FromImage(result)) { g.InterpolationMode = HighQuality ? InterpolationMode.HighQualityBicubic : InterpolationMode.Default; using (Matrix mat = new Matrix()) { mat.Translate(-rect.X, -rect.Y); mat.RotateAt(-(float)imageSkewAngle, new Point(rect.X + (int)rect.Width / 2, rect.Y + (int)rect.Height / 2)); g.Transform = mat; g.DrawImage(source, new Point(0, 0)); } } return(result); }