1. 磐创AI首页
  2. Medium

使用Python从头开始文档扫描仪。

简介

我做这个项目的动机很简单。我们中的许多人都转到了网上工作。

随着在线工作量的增加,人们经常不得不通过电子邮件或其他方式呈现文档的数字化版本。换句话说,将任何文档转换为类似扫描的外观。

在本文中,我将描述任何人如何使用Python从头开始创建文档扫描仪。准确地说,是用于图像/视频处理的OpenCV库。

在前一篇文章中,我为本文和未来的OpenCV实际应用程序奠定了基础。如果您有兴趣了解更多有关OpenCV提供的可能性,请单击此处链接

不要再胡闹了,让我们开始吧。

文档扫描仪

在进入编码部分之前,我们需要了解我们要做什么。

以下是我在开始这个项目之前问自己的一系列问题。

我们要在这里建造什么?

-EURO“文档扫描仪。

好的。但它现在做了什么,或者应该做什么呢?

“欧元”显然是用来扫描文档的。

正确的。那么,扫描的文档应该是什么样子呢?

“欧元”是个好问题,对吧?

在我看来,扫描的文档应该有两个功能:

让我们保持简单,并根据需要增加复杂性。

编码文档扫描仪

让我们首先导入此项目所需的所有库(稍后我们可能会根据需要添加一些内容)

I.第一个属性:扫描(黑白)视图

让我们从产生扫描图像的扫描仪的第一个属性–EURO开始!

在这个例子中,我使用了尤瓦尔·诺亚·哈拉里(Yuval Noah Harari)的“21世纪的21课”一书中的一张照片。

附注:这是一本很棒的书,与本系列的另外两本书(“智人:人类简史”和“人类:明日简史”)一样,都是一本很棒的书。建议阅读!

回到我们的文档扫描仪,我们希望通过更改配色方案使此图像看起来清晰明了。

让我们将此操作称为scanview()。要使其成为一个完整的应用程序项目,让我们创建一个名为Scanner的类,其中scan_view()将是它的方法。

代码的快速解释:

我想创建一个属性为图像的扫描对象。因此,我在__init__()方法中使用self.img=img;

另外,我希望有一个负责更改此属性(即图像/文档)的方法–“更改配色方案、旋转、裁剪、调整大小”等。

因此,Scan_View()对其类属性执行操作(即,对其自身或自身执行操作)。

这也称为自适应阈值。阈值是像素的局部邻域的加权平均值减去一个常数。

找到阈值蒙版后,我们只需将前景像素值选择为image>Threshold。

我们可以保存新的清晰而新鲜的图像,并将其返回以备进一步处理。

要运行代码,我们只需创建一个Scan对象,并为其提供一个文档/照片作为其属性,如下所示:

结果,我们得到了这个图像:

现在,那看起来很脆!

让我们进入项目的下一部分。

二、第二项属性:文件轮换

让我们继续介绍扫描仪的第二个属性–“欧元”文档轮换!

假设我们给一本书拍了一张任意角度的照片。自动旋转它以获得自上而下的面对面视图不是很好吗?

当然,会的!

问题是怎么做?

最初,我在考虑使用主成分分析(PCA)来确定文档方向。然而,对于这个项目来说,这似乎有点过了。

我们想要一些简单但有效的东西。

它将自动确定文本行/边框和水平线之间的旋转角度。

好主意,对吧?

但为了使该方法具有鲁棒性,我们需要确保检测到正确的方向。有些线条可以沿着正文出现,但另一些线条可以沿着书籍/文档边缘–欧元–我们不希望这样。

所以,我们想要平均这些变化。换句话说,就是找出所有线角的中值。

因此,我们将扫描对象的新方法(Rotation())定义如下:

如上所述,应用程序这一部分的核心是找到正确的Hough Lines(HoughLinesP()方法,其中P代表概率,请参阅参考资料以了解有关此方法的更多信息)

我们从每一行获得角度的中间值,并将其用于文档旋转(ndimage.Rotate()方法)。

我们可以对清晰的黑白图像执行此操作,如下所示:

结果,我们得到了旋转后的图像:

奇妙的扫描,清晰,旋转的图像!

完整代码

最后,让我们将所有内容合并到一个类中!

由于空间方面的考虑,我将跳过这一步。

对于感兴趣的读者,这里有一个GitHub存储库,其中包含每种方法的更多详细信息和文档。GitHub repository

摘要

在本文中,我们了解了如何使用著名的用于图像/视频处理的Python库OpenCV从头构建文档扫描仪的工作原型。

这个项目是基于我之前的文章:冠状病毒期间的9个OpenCV要点。9 OpenCV Essentials During COVID-19

未来发展方向

我将这个应用程序称为文档扫描仪(v.1),因为有几个地方可以进一步改进它。

最后但同样重要的是,如果您有任何评论、建议或发现任何错误,请留下评论或通过LinkedIn与我联系。我会很高兴收到你的来信。LinkedIn

希望你喜欢我的文章,学到一些新东西。谢谢你读到最后。

想了解更多吗?

如果您对复习Python知识感兴趣,这里有一个简短的教程:从Hello Wolrd到函数。Hello Wolrd to Functions

另外,我想和大家分享我早期的一些项目。他们中的每一个都致力于解决一个特定的问题。这是挑战自我并磨练一些Python技能的好机会:

  • 用Python从头开始跟踪你的体重;
  • 分析冠状病毒科学论文;
  • 从头开始创建生产力应用程序(Pomodoro)。

联系方式:

看看我的GitHub吧。GitHub

在LinkedIn上与我联系。LinkedIn

参考文献

OpenCV中的霍夫线变换教程(链接)link

THRESHOLD_LOCAL方法的文档(链接)link

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/06/25/%e4%bd%bf%e7%94%a8python%e4%bb%8e%e5%a4%b4%e5%bc%80%e5%a7%8b%e6%96%87%e6%a1%a3%e6%89%ab%e6%8f%8f%e4%bb%aa%e3%80%82/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息