python - 对低质量数字图像进行 OCR 的预处理方法?
问题描述
我目前正在从事一个项目,该项目将读取数独网格的图像,检测网格,识别数字,解决难题,并在图像上叠加解决方案。为了识别数字,我将网格划分为 n*2 图像,其中每个图像都是一个单独的网格(例如:ex2 ex9),并将它们运行到 pytesseract 中。然而,我的所有图像都没有检测到任何文本,即使它只是一个数字图像,没有噪音/边框/等。
我尝试了平滑图像的常用方法、各种阈值方法、调整图像大小、反转图像以及将数字裁剪到边界框,但这些方法似乎都不起作用。我已经在其他图像上测试了我为 pytesseract 编写的代码,这些代码似乎都可以正常工作,只是我的图像无法正常工作。
任何人都可以就我可以尝试的方法和/或为什么我的图像似乎不容易处理提供建议吗?
作为参考,这是我一直在使用的 pytesseract 的 image_to_string 的设置:
text = image_to_string(im, config='--psm 10 --oem 3' + '-c tessedit_char_whitelist=123456789')
解决方案
我找到了一个解决方案,但它绝对不漂亮。我发现 pytesseract 在捕获数字很少的数字方面很糟糕。我从一个在进行图像识别时使用“零填充”的 CNN 中获得灵感。现在请注意,我唯一从中获得灵感的是它的实际名称,而不是方法(这比这篇文章将要接近的任何东西都复杂得多)。
我找到了一个包含 0 的图像,并创建了一个带有三个零(任意选择的数字和数量)的“零填充图像”。无论如何,我发现 pytesseract 能够完美地扫描数字图像!15/15 例,而不是 3/15 例。请记住将 OCR 扫描的数字除以 1000(如果您使用三个 0)。
我使用了这篇文章中显示的水平图像堆叠技术: 图像堆叠帖子
import numpy as np
from PIL import Image
def concat_images(imga, imgb):
"""
type(imga): string of filename
type(imgb): string of filename
type(new_img): PIL.Image.Image
"""
imga = np.asarray(Image.open(imga).convert('LA') )
imgb = np.asarray(Image.open(imgb).convert('LA') )
ha,wa = imga.shape[:2]
hb,wb = imgb.shape[:2]
max_height = np.max([ha, hb])
total_width = wa+wb
new_img = np.zeros(shape=(max_height, total_width, 2) , dtype = 'uint8')
new_img[:ha,:wa]=imga
new_img[:hb,wa:wa+wb]=imgb
new_img = Image.fromarray(new_img)
return new_img
推荐阅读
- java - 通过替换隐藏的“#”数字符号生成所有可能的字符串组合
- php - jsonb字段内的postgres更新键
- html - 修复表格标题并使表格主体在 React 中滚动
- python - 在使用 django 的 posgresql 中遇到错误,当我修复错误并重新迁移时没有任何反应
- html - 我如何将我的物品左对齐并缩小它们
- javascript - 使用图像的 SRC 将子级传递给父级时出现问题。反应 JS
- flutter - 如何将数据从有状态小部件传递到状态以确保小部件数据可用?
- cron - 在 CentOS 8 和 php remi 包中使用 crontab 运行作业
- c# - 根据百分比设置按钮的背景颜色
- python - Python3多次使用相同的输入运行相同的函数,但每次产生不同的输出