void DetectEdge() { if (this.pictureBox_clip.Image == null) { return; } Cursor old_cursor = this.Cursor; this.Cursor = Cursors.WaitCursor; try { double angle = 0; Rectangle rect; using (Bitmap bitmap = new Bitmap(this.pictureBox_clip.Image)) { // this.pictureBox1.Image = ImageUtil.AforgeAutoCrop(bitmap); DetectBorderParam param = new DetectBorderParam(bitmap); bool bRet = AForgeImageUtil.GetSkewParam(bitmap, param, out angle, out rect); if (bRet == false) { MessageBox.Show(this, "探测边框失败"); return; } } #if NO using (Bitmap bitmap = new Bitmap(this.pictureBox1.Image)) { this.pictureBox1.Image = ImageUtil.Apply(bitmap, angle, rect); } #endif List <Point> points = this.pictureBox_clip.ToPoints((float)angle, rect); this.pictureBox_clip.SetPoints(points); } finally { this.Cursor = old_cursor; } }
public static System.Drawing.Image AforgeAutoCrop(Bitmap selectedImage, DetectBorderParam param) { // 一些参数的默认值 if (param.MinObjectWidth == 0) param.MinObjectWidth = 500; if (param.MinObjectHeight == 0) param.MinObjectHeight = 500; Bitmap autoCropImage = null; try { autoCropImage = selectedImage; // create grayscale filter (BT709) Grayscale filter = new Grayscale(0.2125, 0.7154, 0.0721); Bitmap grayImage = filter.Apply(autoCropImage); // create instance of skew checker DocumentSkewChecker skewChecker = new DocumentSkewChecker(); // get documents skew angle double angle = skewChecker.GetSkewAngle(grayImage); // create rotation filter RotateBilinear rotationFilter = new RotateBilinear(-angle); rotationFilter.FillColor = Color.White; // rotate image applying the filter Bitmap rotatedImage = rotationFilter.Apply(grayImage); new ContrastStretch().ApplyInPlace(rotatedImage); new Threshold(100).ApplyInPlace(rotatedImage); BlobCounter bc = new BlobCounter(); bc.FilterBlobs = true; bc.MinWidth = param.MinObjectWidth; // 500; bc.MinHeight = param.MinObjectHeight; // 500; bc.ProcessImage(rotatedImage); Rectangle[] rects = bc.GetObjectsRectangles(); if (rects.Length == 0) { System.Windows.Forms.MessageBox.Show("No rectangle found in image "); } else if (rects.Length == 1) { autoCropImage = rotatedImage.Clone(rects[0], rotatedImage.PixelFormat); } else if (rects.Length > 1) { // get largets rect Console.WriteLine("Using largest rectangle found in image "); var r2 = rects.OrderByDescending(r => r.Height * r.Width).ToList(); autoCropImage = rotatedImage.Clone(r2[1], rotatedImage.PixelFormat); } else { Console.WriteLine("Huh? on image "); } } catch (Exception ex) { // MessageBox.Show(ex.Message); throw ex; } return autoCropImage; }
public static bool GetSkewParam(Bitmap selectedImage, DetectBorderParam param, out double angle, out Rectangle rect) { // 一些参数的默认值 if (param.MinObjectWidth == 0) param.MinObjectWidth = 500; if (param.MinObjectHeight == 0) param.MinObjectHeight = 500; Bitmap autoCropImage = null; try { autoCropImage = selectedImage; #if NO // create grayscale filter (BT709) Grayscale filter = new Grayscale(0.2125, 0.7154, 0.0721); Bitmap grayImage = filter.Apply(autoCropImage); #endif Bitmap grayImage = selectedImage.Clone(new Rectangle(0, 0, selectedImage.Width, selectedImage.Height), System.Drawing.Imaging.PixelFormat.Format8bppIndexed); // create instance of skew checker DocumentSkewChecker skewChecker = new DocumentSkewChecker(); // get documents skew angle angle = skewChecker.GetSkewAngle(grayImage); // create rotation filter RotateBilinear rotationFilter = new RotateBilinear(-angle); rotationFilter.FillColor = Color.Black; // .White; rotationFilter.KeepSize = true; // rotate image applying the filter Bitmap rotatedImage = rotationFilter.Apply(grayImage); new ContrastStretch().ApplyInPlace(rotatedImage); new Threshold(100).ApplyInPlace(rotatedImage); BlobCounter bc = new BlobCounter(); bc.FilterBlobs = true; bc.MinWidth = param.MinObjectWidth; // 500; bc.MinHeight = param.MinObjectHeight; // 500; #if NO bc.MinWidth = 500;// grayImage.Width / 10; // 500 bc.MinHeight = 500;// grayImage.Height / 10; // 500 #endif bc.ProcessImage(rotatedImage); Rectangle[] rects = bc.GetObjectsRectangles(); if (rects.Length == 0) { // System.Windows.Forms.MessageBox.Show("No rectangle found in image "); rect = new Rectangle(0, 0, 0, 0); return false; } else if (rects.Length == 1) { rect = rects[0]; // autoCropImage = rotatedImage.Clone(rects[0], rotatedImage.PixelFormat); } else if (rects.Length > 1) { // TODO: 应该把这些矩形合并在一起 Rectangle first = new Rectangle(0, 0, 0, 0); int i = 0; foreach (Rectangle one in rects) { Debug.WriteLine("one=" + one.ToString()); if (i == 0) first = one; else first = Merge(first, one); i++; } rect = first; Debug.WriteLine("result=" + rect.ToString()); #if NO // get largets rect Console.WriteLine("Using largest rectangle found in image "); var r2 = rects.OrderByDescending(r => r.Height * r.Width).ToList(); rect = r2[1]; // autoCropImage = rotatedImage.Clone(r2[1], rotatedImage.PixelFormat); #endif } else { // Console.WriteLine("Huh? on image "); rect = new Rectangle(0, 0, 0, 0); return false; } #if NO Blob[] blobs = bc.GetObjectsInformation(); foreach (var blob in blobs) { List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blob); List<IntPoint> cornerPoints; // use the shape checker to extract the corner points if (shapeChecker.IsQuadrilateral(edgePoints, out cornerPoints)) { // only do things if the corners form a rectangle if (shapeChecker.CheckPolygonSubType(cornerPoints) == PolygonSubType.Rectangle) { // here i use the graphics class to draw an overlay, but you // could also just use the cornerPoints list to calculate your // x, y, width, height values. List<Point> Points = new List<Point>(); foreach (var point in cornerPoints) { Points.Add(new Point(point.X, point.Y)); } Graphics g = Graphics.FromImage(image); g.DrawPolygon(new Pen(Color.Red, 5.0f), Points.ToArray()); image.Save("result.png"); } } } #endif } catch (Exception ex) { // MessageBox.Show(ex.Message); throw ex; } finally { if (autoCropImage != null) autoCropImage.Dispose(); } return true; }
public static System.Drawing.Image AforgeAutoCrop(Bitmap selectedImage, DetectBorderParam param) { // 一些参数的默认值 if (param.MinObjectWidth == 0) { param.MinObjectWidth = 500; } if (param.MinObjectHeight == 0) { param.MinObjectHeight = 500; } Bitmap autoCropImage = null; try { autoCropImage = selectedImage; // create grayscale filter (BT709) Grayscale filter = new Grayscale(0.2125, 0.7154, 0.0721); Bitmap grayImage = filter.Apply(autoCropImage); // create instance of skew checker DocumentSkewChecker skewChecker = new DocumentSkewChecker(); // get documents skew angle double angle = skewChecker.GetSkewAngle(grayImage); // create rotation filter RotateBilinear rotationFilter = new RotateBilinear(-angle); rotationFilter.FillColor = Color.White; // rotate image applying the filter Bitmap rotatedImage = rotationFilter.Apply(grayImage); new ContrastStretch().ApplyInPlace(rotatedImage); new Threshold(100).ApplyInPlace(rotatedImage); BlobCounter bc = new BlobCounter(); bc.FilterBlobs = true; bc.MinWidth = param.MinObjectWidth; // 500; bc.MinHeight = param.MinObjectHeight; // 500; bc.ProcessImage(rotatedImage); Rectangle[] rects = bc.GetObjectsRectangles(); if (rects.Length == 0) { System.Windows.Forms.MessageBox.Show("No rectangle found in image "); } else if (rects.Length == 1) { autoCropImage = rotatedImage.Clone(rects[0], rotatedImage.PixelFormat); } else if (rects.Length > 1) { // get largets rect Console.WriteLine("Using largest rectangle found in image "); var r2 = rects.OrderByDescending(r => r.Height * r.Width).ToList(); autoCropImage = rotatedImage.Clone(r2[1], rotatedImage.PixelFormat); } else { Console.WriteLine("Huh? on image "); } } catch (Exception ex) { // MessageBox.Show(ex.Message); throw ex; } return(autoCropImage); }
public static bool GetSkewParam(Bitmap selectedImage, DetectBorderParam param, out double angle, out Rectangle rect) { // 一些参数的默认值 if (param.MinObjectWidth == 0) { param.MinObjectWidth = 500; } if (param.MinObjectHeight == 0) { param.MinObjectHeight = 500; } Bitmap autoCropImage = null; Bitmap grayImage = null; Bitmap rotatedImage = null; try { autoCropImage = selectedImage; #if NO // create grayscale filter (BT709) Grayscale filter = new Grayscale(0.2125, 0.7154, 0.0721); Bitmap grayImage = filter.Apply(autoCropImage); #endif grayImage = selectedImage.Clone(new Rectangle(0, 0, selectedImage.Width, selectedImage.Height), System.Drawing.Imaging.PixelFormat.Format8bppIndexed); // create instance of skew checker DocumentSkewChecker skewChecker = new DocumentSkewChecker(); // get documents skew angle angle = skewChecker.GetSkewAngle(grayImage); // create rotation filter RotateBilinear rotationFilter = new RotateBilinear(-angle); rotationFilter.FillColor = Color.Black; // .White; rotationFilter.KeepSize = true; // rotate image applying the filter rotatedImage = rotationFilter.Apply(grayImage); new ContrastStretch().ApplyInPlace(rotatedImage); new Threshold(100).ApplyInPlace(rotatedImage); BlobCounter bc = new BlobCounter(); bc.FilterBlobs = true; bc.MinWidth = param.MinObjectWidth; // 500; bc.MinHeight = param.MinObjectHeight; // 500; #if NO bc.MinWidth = 500; // grayImage.Width / 10; // 500 bc.MinHeight = 500; // grayImage.Height / 10; // 500 #endif bc.ProcessImage(rotatedImage); Rectangle[] rects = bc.GetObjectsRectangles(); if (rects.Length == 0) { // System.Windows.Forms.MessageBox.Show("No rectangle found in image "); rect = new Rectangle(0, 0, 0, 0); return(false); } else if (rects.Length == 1) { rect = rects[0]; // autoCropImage = rotatedImage.Clone(rects[0], rotatedImage.PixelFormat); } else if (rects.Length > 1) { // TODO: 应该把这些矩形合并在一起 Rectangle first = new Rectangle(0, 0, 0, 0); int i = 0; foreach (Rectangle one in rects) { Debug.WriteLine("one=" + one.ToString()); if (i == 0) { first = one; } else { first = Merge(first, one); } i++; } rect = first; Debug.WriteLine("result=" + rect.ToString()); #if NO // get largets rect Console.WriteLine("Using largest rectangle found in image "); var r2 = rects.OrderByDescending(r => r.Height * r.Width).ToList(); rect = r2[1]; // autoCropImage = rotatedImage.Clone(r2[1], rotatedImage.PixelFormat); #endif } else { // Console.WriteLine("Huh? on image "); rect = new Rectangle(0, 0, 0, 0); return(false); } #if NO Blob[] blobs = bc.GetObjectsInformation(); foreach (var blob in blobs) { List <IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blob); List <IntPoint> cornerPoints; // use the shape checker to extract the corner points if (shapeChecker.IsQuadrilateral(edgePoints, out cornerPoints)) { // only do things if the corners form a rectangle if (shapeChecker.CheckPolygonSubType(cornerPoints) == PolygonSubType.Rectangle) { // here i use the graphics class to draw an overlay, but you // could also just use the cornerPoints list to calculate your // x, y, width, height values. List <Point> Points = new List <Point>(); foreach (var point in cornerPoints) { Points.Add(new Point(point.X, point.Y)); } Graphics g = Graphics.FromImage(image); g.DrawPolygon(new Pen(Color.Red, 5.0f), Points.ToArray()); image.Save("result.png"); } } } #endif } catch (Exception ex) { // MessageBox.Show(ex.Message); throw ex; } finally { if (autoCropImage != null) { autoCropImage.Dispose(); } // 2018/10/23 if (rotatedImage != null) { rotatedImage.Dispose(); } // 2018/10/23 if (grayImage != null) { grayImage.Dispose(); } } return(true); }
void DetectEdge() { if (this.pictureBox_clip.Image == null) return; double angle = 0; Rectangle rect; using (Bitmap bitmap = new Bitmap(this.pictureBox_clip.Image)) { // this.pictureBox1.Image = ImageUtil.AforgeAutoCrop(bitmap); DetectBorderParam param = new DetectBorderParam(bitmap); bool bRet = AForgeImageUtil.GetSkewParam(bitmap, param, out angle, out rect); if (bRet == false) { MessageBox.Show(this, "fail"); return; } } #if NO using (Bitmap bitmap = new Bitmap(this.pictureBox1.Image)) { this.pictureBox1.Image = ImageUtil.Apply(bitmap, angle, rect); } #endif List<Point> points = this.pictureBox_clip.ToPoints((float)angle, rect); this.pictureBox_clip.SetPoints(points); }