【问题标题】:Find Black Squares/Rectangles in Image with C#使用 C# 在图像中查找黑色正方形/矩形
【发布时间】:2015-09-05 16:16:41
【问题描述】:

我想在扫描的表格中找到黑色的小方块/矩形:

  1. 如果需要,可以校正图像。
  2. 删除白色页边距。

输入图片: sample image 1 http://us.cdn.persiangig.com/preview/ii2jf6/2.jpg

输出图片: sample image 2 http://us.cdn.persiangig.com/preview/9ntpnc/1.jpg

我找到正方形的代码是:

Bitmap pic =(Bitmap) pictureBox1.Image;

// create filter
AForge.Imaging.Filters.Median Medianfilter = new AForge.Imaging.Filters.Median();
// apply the filter
Medianfilter.ApplyInPlace(pic);

Bitmap grayImage;

if (pic.PixelFormat != PixelFormat.Format16bppGrayScale && pic.PixelFormat != PixelFormat.Format8bppIndexed)
{
    AForge.Imaging.Filters.Grayscale grayscalefilter = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721);
    grayImage = grayscalefilter.Apply((Bitmap)pictureBox1.Image);
}
else
{
    grayImage = pic;
}

// black & white:
Threshold(ref grayImage, Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox1.Text));

// invert filter
Invert invertfilter = new Invert();
// apply the filter
invertfilter.ApplyInPlace(grayImage);

// Edge Detector  filter
DifferenceEdgeDetector EdgeDetectorfilter = new DifferenceEdgeDetector();
// apply the filter
EdgeDetectorfilter.ApplyInPlace(grayImage);

// create filter
Dilatation Dilatationfilter = new Dilatation();
// apply the filter
Dilatationfilter.ApplyInPlace(grayImage);

在图像中查找对象(正方形/矩形):

        // lock image
        BitmapData bitmapData = grayImage.LockBits(new Rectangle(0, 0, grayImage.Width, grayImage.Height),
        ImageLockMode.ReadWrite, grayImage.PixelFormat);

        // step 2 - locating objects
        BlobCounter blobCounter = new BlobCounter();

        blobCounter.FilterBlobs = true;
        blobCounter.MinHeight = 10;          //*-*-*-*-
        blobCounter.MinWidth = 10;
        blobCounter.MaxHeight = 50;
        blobCounter.MaxWidth = 50;

        blobCounter.ProcessImage(bitmapData);
        Blob[] blobs = blobCounter.GetObjectsInformation();
        grayImage.UnlockBits(bitmapData);

        // step 3 - check objects' type and highlight
        SimpleShapeChecker shapeChecker = new SimpleShapeChecker();

        Graphics g = Graphics.FromImage(pic);
        Pen redPen = new Pen(Color.Red, 2);       // quadrilateral
        Pen bluePen = new Pen(Color.Blue, 2);     // triangle

        for (int i = 0, n = blobs.Length; i < n; i++)
        {
            List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]);

            List<IntPoint> corners;

            // is triangle or quadrilateral
            if (shapeChecker.IsQuadrilateral(edgePoints, out corners))
            {
                // get sub-type
                PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners);

                Pen pen;

                if (subType == PolygonSubType.Square)
                {
                    pen = (corners.Count == 4) ? bluePen : redPen;
                    g.DrawPolygon(pen, ToPointsArray(corners));
                }
            }
        }
        redPen.Dispose();
        bluePen.Dispose();
        g.Dispose();
        pictureBox1.Image = pic;

问题是检测正方形和矩形的准确性低!!!

我该如何解决这个问题?

【问题讨论】:

标签: c# image-processing aforge


【解决方案1】:

如果您可以使用 OpenCV,这很容易。使用霍夫变换并在输出中找到峰值。这些对应于您输入中的直线。

如果您不能使用 OpenCV,则需要自己实现。这里有一些东西可以帮助您入门。

https://en.wikipedia.org/?title=Hough_transform

编辑

正如 Anders Gustafsson 在下面的评论中指出的那样,Hough 变换在 AForge for .NET 中可用,因此不必自己实现它。

http://www.aforgenet.com/framework/features/hough_transformation.html

【讨论】:

  • 不需要涉及 OpenCV 吗? 霍夫变换 AForge中可用。
  • 我对 .NET 软件生态系统不是很熟悉。感谢您纠正我。
猜你喜欢
  • 2014-01-01
  • 2012-09-26
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多