从图像pyteseract读取数字

2024-05-14 18:01:31 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试着在图像中阅读文本,我遇到了一些问题

图像: original image i'm trying to read

我的代码:

import cv2
import pytesseract


def read_img():
    pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe'
    return cv2.imread('Images/Image2.png')


def process_text(img):
    names = []
    data = pytesseract.image_to_data(img)
    for x, d in enumerate(data.splitlines()):
        if x != 0:
            d = d.split()
            if len(d) == 12:
                names.append(d[11])

    return names


img = read_img()
print(process_text(img))

结果:

['-', '©', '-', 'AceeZ.Rogue', 'a', '5540', 't', '3', '8', '&', '©', 'LeonGids.Rogue', 'a', 'seas', '8', '3', '8', 'e', 'fl', 'karzheka.Rogue', 'a', '5151', '8', '2', '7', '48', '7', 'Q', 'ripz.Rogue', 'a', '5105', '8', '[', '5s', '27', 'm', 'korey.Rogue', 'a', '5105', '7', '2', '6', '36', '-', '[ZH]', 'Shaiiko.BDS', 'C', '3520', 'a', 'B', 's', '22', 'Cps', 'a', '2012', '8', 'i', '8', '21', 'ypc', 'Chee', 'e', '8', '-_', '22', '3', '(2)', 'Flemzje.BDS', 'a', '2420', 'a', '3', '10', '26', '(SF)', 'Renshiro.BDS', 'C', '2410', '6', '1', '8', 'Fo']

正如你所看到的,这不是我所希望的结果。这是我尝试过的

  1. 分割图像

我将图像分成两部分,使其更集中于实际文本:

img1

img2

img1的结果实际上是完美的:

['AceeZ.Rogue', 'LeonGids.Rogue', 'karzheka.Rogue', 'ripz.Rogue', 'korey.Rogue', 'Shaiiko.BDS', 'BriD.BDS', 'RaFaLe.BDS', 'Elemzje.BDS', 'Renshiro.BDS']

但img2问题再次出现:

['5540', '5343', '5151', '5105', '5105', '3520', '29012', '2695', '2420', '2410', '11', '10']

看起来tesseract在读取数字时遇到了问题,因为只有文本的img1正常吗?我尝试过提高文本的质量(letsenhance.io),同时提高对比度:

img2 with higher contrast

这两种方法都不起作用

  1. 使用配置选项

我尝试过使用诸如“--psm 6”和“outbase digits”之类的配置选项,但也没有解决问题

我在这一页上看到,使用指定字体进行培训是一种可能性(https://stackoverflow.com/a/53763425/10503012),但遗憾的是,我不知道该字体,并且https://www.myfonts.com/WhatTheFont/没有给出确切的字体,所以我假设这也不是一种选择

所以我的问题是,;是否有可能从该图像中提取文本/数字,或者这是一个丢失的案例?我还能做些什么来改善tesseract给我的结果?我的想法是,高对比度的图像应该可以工作,但显然不行

谢谢你的帮助


Tags: 图像文本importimgreaddatareturnnames
1条回答
网友
1楼 · 发布于 2024-05-14 18:01:31

通常,Tesseract喜欢白色背景上的黑色文本。所以你应该反转你的输入图像。你也应该考虑对图像进行阈值化以使其变为黑白。最后,Tesseract可以对每个字符的大小敏感。我发现在提供的比例下,用户名可以识别,但是我必须将图像缩放1.25才能得到数字

import cv2
import pytesseract

img = cv2.imread('acerogue.png', cv2.IMREAD_GRAYSCALE)  

thresh = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]
thresh = cv2.resize(thresh, (0,0), fx=1.25, fy=1.25)  # scale image 1.25X

detected_text = pytesseract.image_to_string(thresh, config = ' psm 6')
print(detected_text)

| ® AceeZ.Rogue 8 5540 11 2 8 -
© LeonGids.Rogue 8 5343 8 3 8 -

Ww karzheka.Rogue a 5151 8 2 7 48

7 tipz.Rogue a 5105 8 0 5 27
& korey.Rogue a 5105 7 2 6 36

| #4 Shaiiko.BDS B 3520 9 3 8 22
BriD.BDS mH 2912 8 1 8 21

S RaFaLe.BDS BH  —_2605 a 2 8 2

3 BS Elemzje.Bos H 2420 3 3 10 26
Se) Renshiro.BDS m 2410 6 1 8 45

也许,您应该预先裁剪图像以去除图标

相关问题 更多 >

    热门问题