【问题标题】:Using pytesseract to get text from an image使用 pytesseract 从图像中获取文本
【发布时间】:2021-09-16 19:35:12
【问题描述】:

我正在尝试使用 pytesseract 将一些图像转换为文本。这些图像非常基本,我尝试使用一些预处理:

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.bitwise_not(gray)
gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

原图如下:

生成的图像如下所示:

我在同一位置对一堆具有相同字体的数字执行此操作,结果如下:

它仍然没有在输出中给出任何文本。对于一些图像,它确实如此,但不是所有图像看起来几乎相同。

这是我正在使用的代码的 sn-p:

def checkCurrentState():
    """image = pyautogui.screenshot()
    image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
    cv2.imwrite("screenshot.png", image)"""

    image = cv2.imread("screenshot.png")

    checkNumbers(image)



def checkNumbers(image):
    numbers = []
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    gray = cv2.bitwise_not(gray)
    gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]


    for i in storeLocations:
        cropped = gray[i[1]:i[1]+storeHeight, i[0]:i[0]+storeWidth]
        number = pytesseract.image_to_string(cropped)
        numbers.append(number)
        print(number)
        cv2.imshow("Screenshot", cropped)
        cv2.waitKey(0)

【问题讨论】:

  • 试试THRESH_BINARY_INV。报告结果。
  • 涉及图片处理的问题,还应提供原图。
  • @ChristophRackwitz 我试过它给出了相同数量的正确结果(见编辑)。
  • @bfris 查看编辑
  • 删除bitwise_not。那是在那里使用的错误。此时您的数据是灰度的,而不是二进制的。 bitwise_notmangle 值,而不是反转它们。删除它。

标签: python image opencv image-processing python-tesseract


【解决方案1】:

要对图像执行 OCR,对图像进行预处理很重要。这个想法是获得一个处理过的图像,其中要提取的文本是黑色的,背景是白色的。这是一个使用 OpenCV 和 Pytesseract OCR 的简单方法。

为此,我们转换为灰度,应用轻微的Gaussian blur,然后Otsu's threshold 以获得二值图像。从这里,我们可以应用morphological operations 来消除噪音。我们使用--psm 6 配置选项执行文本提取,以假设单个统一的文本块。查看here 了解更多选项。


这是每个步骤的可视化:

输入图像

转为灰度->高斯模糊

Otsu 的阈值-> Morph 打开以去除噪音

Pytesseract OCR 的结果

1100

代码

import cv2
import pytesseract

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

# Grayscale, Gaussian blur, Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Morph open to remove noise
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)

# Perform text extraction
data = pytesseract.image_to_string(opening, lang='eng', config='--psm 6')
print(data)

cv2.imshow('blur', blur)
cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.waitKey()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多