简介
我做这个项目的动机很简单。我们中的许多人都转到了网上工作。
随着在线工作量的增加,人们经常不得不通过电子邮件或其他方式呈现文档的数字化版本。换句话说,将任何文档转换为类似扫描的外观。
在本文中,我将描述任何人如何使用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/