【发布时间】:2020-10-28 22:35:38
【问题描述】:
所以我正在尝试阅读图片中的文字,但遇到了一些问题。
我的代码:
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']
如您所见,这不是我希望的结果。这是我尝试过的;
- 分割图像
我已将图像一分为二,使其更集中在实际文本上:
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) 并增加对比度:
这些方法都不起作用。
- 使用配置选项
我尝试过使用“--psm 6”和“outbase digits”等配置选项,但也没有解决问题。
我在此页面上看到可以使用指定字体进行训练 (https://stackoverflow.com/a/53763425/10503012),但遗憾的是我不知道字体,https://www.myfonts.com/WhatTheFont/ 没有给我确切的字体,所以我假设那不是一个选项。
所以我的问题是;甚至可以从这张图片中提取文本/数字还是这是一个丢失的案例?我还能做些什么来改善 tesseract 给我的结果?我认为具有高对比度的图像应该可以工作,但显然不行。
感谢您的帮助。
【问题讨论】:
-
如果可以减少个位数之间的空格,Tesseract 应该能够检测到它们。我在项目的早期尝试过这种方法,它提高了检测效率。可以通过先做任何类型的阈值来减少空间(我更喜欢 Otsu),然后遍历图像并丢弃被黑色像素包围的像素值。(您可以采取适当的范围)
-
@Beginner 感谢您的回答。我用 cv2 尝试了一些东西,我能够访问单个像素。我的问题是;你怎么能“丢弃”像素?我目前可以更改它们的值,但我还没有找到从图像中实际删除/丢弃它们的方法。
-
图像以 NumPy 数组的形式存储。您可以创建一个所有像素值为 0 的新数组(基本上是黑色图像),尺寸将等于原始图像的尺寸。之后,您可以在原始图像(阈值之后)数组上运行一个循环,对于每个像素,检查它周围是否在一定范围内有一个白色像素(让我们保持范围为 25 像素)。如果在该范围内它周围没有白色像素,您可以简单地丢弃它。对于所有其他情况,您只需将原始像素值(将为 0 或 255)复制到黑色图像。
-
丢弃它意味着不复制它。对于前考虑一个数组 [1, 2, 3, 2, 4, 2, 5] 并且我想丢弃等于 2 的值,现在我们将创建一个新的空白数组 temp = [0, 0, 0, 0, 0, 0, 0]。变量计数被初始化为-1。所以每次我们遇到一个值 !=2 时,我们都会做 temp[++count] = value。否则,我们将根本不复制它,或者换句话说,丢弃它。最终的临时数组将是 temp = [1,3, 4, 5, 0, 0] 变量 count = 3。这样,我们有所需的大小 = 4(count+1),所以我们可以切掉数组获得所需的数组[1,3,4,5]。希望你能理解。
-
很好的解释。非常感谢!
标签: python tesseract cv2 python-tesseract