我尝试用Python阅读各种来源的文档。因此,我使用OpenCV和Tesseract。为了优化Tesseract的性能,我做了一些预处理,但遗憾的是,文档的质量也有很大差异。我目前的问题是,由于扫描不好,文档只有部分模糊或阴影。
我对文档质量没有影响,手动特征检测是不适用的,因为代码最终应该运行超过数十万个文档,甚至在文档内部,质量可能会有很大的差异。

为了消除阴影,我找到了一种技术,删除和模糊图像,并将原始图像与放大的版本分开。
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应用。
发布于 2021-06-30 22:02:25
这让我想起了几年前读到的这篇文章:https://medium.com/illuin/cleaning-up-dirty-scanned-documents-with-deep-learning-2e8e6de6cfa6
与标题相反,它包含了各种经典的计算机视觉算法,供您启发。
直观地说,如果你提前知道字体类型和大小,这也会有帮助。
发布于 2021-07-05 21:28:04
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)方法: unsharp_mask滤波器,Otsu方法(1979)
参考:OpenCV: Contour detection of shadowed image before OCR (2020堆栈溢出)
如果我是你,我会试试GAN。虽然原始数据是模糊和阴影的,但您需要清晰的数据来进行tesseract。所以你需要从模糊的原始数据中生成清晰的字符。
https://stackoverflow.com/questions/68195847
复制相似问题