【问题标题】:Detecting Paper Edge and Crop it检测纸张边缘并裁剪
【发布时间】:2015-07-29 13:47:09
【问题描述】:

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

下面是我要裁剪的图像。论文将始终出现在页面底部。

我已经阅读了这些链接,但我仍然不知道该怎么做。

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

编辑:我在这个 OCR 项目中使用 EMGU

【问题讨论】:

  • 能否请您向我们展示您到目前为止所做的尝试(源代码)?还是您要教程?
  • 您的问题解决了吗?

标签: c# image opencv image-processing


【解决方案1】:
  • 决定纸张颜色
  • 决定一个增量以允许颜色变化
  • 决定沿底部的点进行垂直测试
  • 向上做垂直测试,收集颜色停止出现的最小 y
  • 至少进行 10-20 次这样的测试

得到的 y 应该比您想要保留的值大 1。如果图像太亮,您可能需要插入限制以避免裁剪所有内容。要么优化算法,要么将这样的图像标记为人工处理的例外!

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

这里还有一些提示:

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

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

  • 沿底部随机游走;完成后,您可以在靠近第一个通道中找到的最小值附近添加一个额外通道。

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

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

【讨论】:

    【解决方案2】:

    您还可以:

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

    4. 通过边界框的大小和位置找到合适的轮廓。
      (在这一步中,我们遍历所有找到的轮廓并尝试找出哪一个是纸张的轮廓,使用已知的纸张尺寸、它们的比例和相对位置 em> - 图片的左下角)。

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

      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
      

    UPD:我添加了更多细节。

    【讨论】:

    • **忽略前面的评论。代码会裁剪出纸张吗?你能解释一下 3.Find 轮廓吗?纸张尺寸和图像尺寸可能不同。我有大约 100 多张图像,纸张位于图像的左下方。谢谢淡马克
    • 很棒的指南!我会试试看,让你更新!非常感谢 Temak
    • 我希望它有所帮助。如果对我的回答有用,请投票,这就是网站的运作方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2019-09-21
    • 2016-03-04
    • 2019-02-09
    • 2020-07-09
    • 2021-12-24
    • 2016-07-18
    相关资源
    最近更新 更多