pytesseract 提高了图像上模糊数字的 OCR 准确性
pytesseract improving OCR accuracy for blurred numbers on an image
数字示例
我正在使用标准的 pytesseract img 来发送文本。我尝试过仅使用数字选项,90% 的情况下它是完美的,但上面是一个非常错误的例子!这个例子根本没有产生任何字符
如您所见,现在有字母,所以语言选项没有用,我尝试在抓取的图像中添加一些文本,但仍然出错。
我使用 CV2 增加了对比度,文本在我捕获的上游变得模糊
关于提高准确性的任何想法?
使用以下建议进行多次测试后。我发现锐度过滤器给出了不可靠的结果。您可以使用的另一个工具是 contrast=cv2.convertScaleAbs(img2,alpha=2.5,beta=-200)
我使用它作为我的黑白文本最终在灰色背景上使用 convertScaleAbs 的浅灰色文本我能够增加对比度以获得几乎黑白图像
OCR 的基本步骤
- 转换为单色
- 将图片裁剪为目标文本
- 将图像过滤成黑白图像
- 执行 OCR
这是使用 OpenCV 和 Pytesseract OCR 的简单方法。要对图像执行 OCR,对图像进行预处理很重要。这个想法是获得一个处理过的图像,其中要提取的文本是黑色的,背景是白色的。为此,我们可以转换为 grayscale, then apply a sharpening kernel using cv2.filter2D()
以增强模糊部分。一般锐化内核如下所示:
[[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]
可以找到其他内核变体 here. Depending on the image, you can adjust the strength of the filter. From here we Otsu's threshold to obtain a binary image then perform text extraction using the --psm 6
configuration option to assume a single uniform block of text. Take a look 以获得更多 OCR 配置选项。
这是图像处理管道的可视化:
输入图片
转换为灰度->
应用锐化滤镜
大津的门槛
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()
数字示例
我正在使用标准的 pytesseract img 来发送文本。我尝试过仅使用数字选项,90% 的情况下它是完美的,但上面是一个非常错误的例子!这个例子根本没有产生任何字符
如您所见,现在有字母,所以语言选项没有用,我尝试在抓取的图像中添加一些文本,但仍然出错。
我使用 CV2 增加了对比度,文本在我捕获的上游变得模糊
关于提高准确性的任何想法?
使用以下建议进行多次测试后。我发现锐度过滤器给出了不可靠的结果。您可以使用的另一个工具是 contrast=cv2.convertScaleAbs(img2,alpha=2.5,beta=-200) 我使用它作为我的黑白文本最终在灰色背景上使用 convertScaleAbs 的浅灰色文本我能够增加对比度以获得几乎黑白图像
OCR 的基本步骤
- 转换为单色
- 将图片裁剪为目标文本
- 将图像过滤成黑白图像
- 执行 OCR
这是使用 OpenCV 和 Pytesseract OCR 的简单方法。要对图像执行 OCR,对图像进行预处理很重要。这个想法是获得一个处理过的图像,其中要提取的文本是黑色的,背景是白色的。为此,我们可以转换为 grayscale, then apply a sharpening kernel using cv2.filter2D()
以增强模糊部分。一般锐化内核如下所示:
[[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]
可以找到其他内核变体 here. Depending on the image, you can adjust the strength of the filter. From here we Otsu's threshold to obtain a binary image then perform text extraction using the --psm 6
configuration option to assume a single uniform block of text. Take a look
这是图像处理管道的可视化:
输入图片
转换为灰度->
应用锐化滤镜
大津的门槛
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()