如何提高模糊图像上数字的OCR准确性的Pytesseract实现

4

数字示例

数字示例

我正在使用标准的pytesseract img to text。我尝试了仅选用数字的选项,90% 的情况下都是完美的,但以上是一个例子,它出现了严重的错误!这个例子没有产生任何字符。

正如你所看到的,现在没有字母,所以语言选项无用,我尝试在截取的图像中添加一些文本,但仍然出错。

我使用 CV2 增加了对比度,文本已经被模糊了,在我捕获之前。

有关提高准确性的任何想法?

经过多次测试,使用以下建议后,我发现锐化滤镜结果不稳定。你可以使用另一个工具:contrast=cv2.convertScaleAbs(img2,alpha=2.5,beta=-200)。我将其用作黑白文本最终成为灰色背景上的浅灰色文本,使用 convertScaleAbs 可以增加对比度,得到几乎黑白的图像。

OCR 的基本步骤:

  1. 转换为单色
  2. 将图像裁剪到目标文本
  3. 过滤图像以获得黑白图像
  4. 执行OCR操作
1个回答

5

这里提供了一个使用OpenCV和Pytesseract OCR的简单方法。在对图像进行OCR之前,重要的是对图像进行预处理。我们的想法是获取一个处理后的图像,其中要提取的文本为黑色,背景为白色。为此,我们可以将其转换为灰度,然后使用cv2.filter2D() 应用锐化核来增强模糊部分。一个通用的锐化核如下所示:

[[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]

你可以在这里找到其他的内核变化。根据图片,你可以调整过滤器的强度。从这里我们使用Otsu's threshold获取一个二进制图像,然后使用--psm 6配置选项进行文本提取以假设单一均匀文本块。查看这里获取更多OCR配置选项。


下面是图像处理管道的可视化:

输入图像

enter image description here

转换为灰度图->应用锐化滤波器

enter image description here

Otsu's threshold

enter image description here

Pytesseract OCR的结果

124,685

代码

import cv2
import numpy as np
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Load image, grayscale, apply sharpening filter, Otsu's threshold 
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen = cv2.filter2D(gray, -1, sharpen_kernel)
thresh = cv2.threshold(sharpen, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# OCR
data = pytesseract.image_to_string(thresh, lang='eng', config='--psm 6')
print(data)

cv2.imshow('sharpen', sharpen)
cv2.imshow('thresh', thresh)
cv2.waitKey()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接