检测纸张边缘并裁剪

时间:2015-05-18 06:48:32

标签: c# image opencv image-processing

我正在使用C#编写一个程序来检测纸张边缘,并从图像中裁剪出纸张的方形边缘。

以下是我想裁剪的图片。论文将始终显示在页面底部。

enter image description here

我读过这些链接,但我仍然不知道该怎么做。

OpenCV C++/Obj-C: Detecting a sheet of paper / Square Detection

编辑:我正在使用EMGU进行此OCR项目

2 个答案:

答案 0 :(得分:3)

你也可以:

  1. 将图片转换为灰度
  2. 按像素强度
  3. 应用ThresholdBinary
  4. 查找轮廓。
    要查看有关查找轮廓的示例,您可以查看this帖子 FundContours方法不关心轮廓大小。在找到轮廓之前要做的唯一事情是通过二值化图像来强调它们(我们在步骤2中执行此操作)。
    有关详细信息,请查看 OpenCV文档findContoursexample

  5. 根据边界框的大小和位置找到合适的轮廓 (在这一步中,我们迭代在轮廓上找到的所有部分,并尝试使用已知的纸张尺寸,它们的比例和相对位置来弄清楚纸张轮廓中的哪一个 em> - 图像左下角。)

  6. 使用纸张的边界框裁剪图像。

    Image<Gray, byte> grayImage = new Image<Gray, byte>(colorImage);
    Image<Bgr, byte> color = new Image<Bgr, byte>(colorImage);
    
    grayImage = grayImage.ThresholdBinary(new Gray(thresholdValue), new Gray(255));
    
    using (MemStorage store = new MemStorage())
    for (Contour<Point> contours= grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_TREE, store); contours != null; contours = contours.HNext)
    {
        Rectangle r = CvInvoke.cvBoundingRect(contours, 1);
    
        // filter contours by position and size of the box
    }
    
    // crop the image using found bounding box
    
  7. UPD:我添加了更多详细信息。

答案 1 :(得分:0)

  • 决定纸张颜色
  • 决定增量以允许颜色变化
  • 确定底部的点进行垂直测试
  • 垂直测试是否上升,收集颜色停止出现的最小y
  • 至少进行10-20次此类测试

结果y应该比你想保留的多1。如果图像太亮,您可能需要插入限制以避免裁剪所有内容。要么改进算法,要么将这样的图像标记为手动处理的例外!

要裁剪,请使用带有源和目标矩形的DrawImage重载!

以下是一些提示:

  • 要找到纸张颜色,您可以从对角线的左下边缘直接向上,直到您点击Color.GetBrightness为&gt;的像素为止。 0.8;然后再走2像素,以清除任何抗锯齿像素。

  • 合理的增量取决于您的图像;从10%开始

  • 沿着底部随意散步;当你完成后,可以在第一遍中找到的最小值附近增加一个额外的通行证。

  • 垂直测试可以使用GetPixel来获取颜色,如果速度太慢,您可能需要查看LockBits。但是先获取搜索算法,然后再考虑优化!

如果您的代码遇到问题,请扩展您的问题!