首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对OCR的错误扫描(部分模糊、阴影和轻微倾斜)进行预处理

对OCR的错误扫描(部分模糊、阴影和轻微倾斜)进行预处理
EN

Stack Overflow用户
提问于 2021-06-30 21:35:26
回答 2查看 115关注 0票数 1

我尝试用Python阅读各种来源的文档。因此,我使用OpenCV和Tesseract。为了优化Tesseract的性能,我做了一些预处理,但遗憾的是,文档的质量也有很大差异。我目前的问题是,由于扫描不好,文档只有部分模糊或阴影。

我对文档质量没有影响,手动特征检测是不适用的,因为代码最终应该运行超过数十万个文档,甚至在文档内部,质量可能会有很大的差异。

为了消除阴影,我找到了一种技术,删除和模糊图像,并将原始图像与放大的版本分开。

代码语言:javascript
复制
h, w = img.shape
kernel = np.ones((7, 7), np.uint8)
dilation = cv2.dilate(img, kernel, iterations=1)
blurred_dilation = cv2.GaussianBlur(dilation, (13, 13), 0)
resized = cv2.resize(blurred_dilation, (w, h))
corrected = img / resized * 255

这样做效果很好。

但是我仍然有模糊的感觉,从视觉上看,它变得更糟糕了。接下来我想做一个二值化,但是模糊的部分将不会留下任何有价值的东西。

我找到了一个适用于运动模糊的example of a deconvolution,但我只能将它应用于整个图像,这会使文本的其余部分变得模糊,我需要知道运动模糊的方向。因此,我希望得到一些关于如何优化这种图像的帮助,以便tesseract能够正确地读取它。

我知道除了锐化模糊的文本之外,还应该有进一步的优化。去掉另一个页面的碎片。这些我不确定正确的顺序如何执行这些额外的步骤。

我几乎找不到用于OCR过程的纯文档优化的源代码或教程。通常,这些过程全局地应用于整个图像,或者用于非OCR应用。

EN

回答 2

Stack Overflow用户

发布于 2021-06-30 22:02:25

这让我想起了几年前读到的这篇文章:https://medium.com/illuin/cleaning-up-dirty-scanned-documents-with-deep-learning-2e8e6de6cfa6

与标题相反,它包含了各种经典的计算机视觉算法,供您启发。

  • To remove shadow,我个人的中值滤波(去除中值滤波背景)比您在此处显示的更有效。
  • To deskew,我已经使用霍夫变换进行了试验,并获得了良好的结果。

直观地说,如果你提前知道字体类型和大小,这也会有帮助。

票数 0
EN

Stack Overflow用户

发布于 2021-07-05 21:28:04

代码语言:javascript
复制
import cv2
import numpy as np
import skimage.filters as filters

# read the image
img = cv2.imread("input/ocr.png", 0)

# blur
blurred_dilation = cv2.GaussianBlur(img, (91, 91), 0)

# divide gray by morphology image
division = cv2.divide(img, blurred_dilation, scale=255)

# sharpen using unsharp masking
sharp = filters.unsharp_mask(division, radius=11, amount=11, multichannel=False, preserve_range=False)
sharp = (255 * sharp).clip(0, 255).astype(np.uint8)

# threshold
thresh = cv2.threshold(sharp, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# save results
cv2.imwrite('receipt_division_sharp.png', sharp)
cv2.imwrite('receipt_division_thresh.png', thresh)

result, result with threshold

方法: unsharp_mask滤波器,Otsu方法(1979)

参考:OpenCV: Contour detection of shadowed image before OCR (2020堆栈溢出)

如果我是你,我会试试GAN。虽然原始数据是模糊和阴影的,但您需要清晰的数据来进行tesseract。所以你需要从模糊的原始数据中生成清晰的字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68195847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档