我已经成功设置了 Tesseract ,并且可以将图像转换为文本...
text = pytesseract.image_to_string(Image.open(image))
但是,我需要获得每一行的置信度值。我找不到使用 pytesseract 做到这一点的方法。有人知道该怎么做吗?
我知道可以使用 PyTessBaseAPI 来做到这一点,但是我不能使用它,我花了很多时间尝试设置它,但是没有运气,所以我需要一种使用来做到这一点的方法。 pytesseract 。
答案 0 :(得分:2)
@Srikar Appalaraju 是对的。以以下示例图片为例:
现在使用以下代码:
text = pytesseract.image_to_data(gray, output_type='data.frame')
text = text[text.conf != -1]
text.head()
请注意,所有五行都具有相同的 block_num
,因此如果我们使用该列进行分组,则所有 5 个单词(文本)将被分组在一起。但这不是我们想要的,我们只想对属于第一行的前 3 个单词进行分组,为了正确地(以通用方式)对足够大的图像进行分组,我们需要按所有 4 列进行分组 { {1}}、page_num
、block_num
和 par_num
是同时进行的,以计算第一行的置信度,如以下代码片段所示:
line_num
具有以下所需的输出:
lines = text.groupby(['page_num', 'block_num', 'par_num', 'line_num'])['text'] \
.apply(lambda x: ' '.join(list(x))).tolist()
confs = text.groupby(['page_num', 'block_num', 'par_num', 'line_num'])['conf'].mean().tolist()
line_conf = []
for i in range(len(lines)):
if lines[i].strip():
line_conf.append((lines[i], round(confs[i],3)))
答案 1 :(得分:0)
经过大量搜索,我想出了一种方法。代替image_to_string
,应该使用image_to_data
。但是,这将为您提供每个单词而不是每一行的统计信息...
text = pytesseract.image_to_data(Image.open(file_image), output_type='data.frame')
因此,我所做的工作被保存为数据框,然后使用pandas
按block_num
进行分组,因为使用OCR将每一行分组为块,所以我也删除了所有没有置信度值的行(-1)...
text = text[text.conf != -1]
lines = text.groupby('block_num')['text'].apply(list)
使用相同的逻辑,您还可以通过计算同一块中所有单词的平均置信度来计算每行的置信度...
conf = text.groupby(['block_num'])['conf'].mean()
答案 2 :(得分:-2)
当前接受的答案并不完全正确。使用pytesseract获取每个line
的正确方法是
text.groupby(['block_num','par_num','line_num'])['text'].apply(list)
我们需要根据以下答案进行此操作:Does anyone knows the meaning of output of image_to_data, image_to_osd methods of pytesseract?
block_num列:检测到的文本或项目的块号 列par_num:检测到的文本或项目的段落编号 列line_num:检测到的文本或项目的行号 word_num列:检测到的文本或项目的单词编号
但是最重要的是,所有4列都是相互连接的。如果该项来自新行,那么字号将从0开始重新计数,它不会从上一行的最后一个字号开始继续计数。 line_num,par_num,block_num也是如此。