【问题标题】:Select part of text that was extracted using the Tesseract OCR选择使用 Tesseract OCR 提取的部分文本
【发布时间】:2018-11-07 17:32:16
【问题描述】:

我在 R 中使用最新的 Tesseract OCR 引擎从几个图像中提取文本。它工作得很好,我对结果很满意。问题是我不想要整个文本,只想要一部分,但我不知道如何提取它。

代码是这样的:

library("tesseract") 
library("pdftools")
library("magick")

mypdfFile<-"C:/Users/.../fileName.pdf"

mypngFile<-pdf_convert(mypdfFile, format="png", pages=1, dpi=600)

myImage<-image_read("fileName_1.png")

textFile<-ocr(myImage,engine = tesseract("spa"), HOCR = FALSE) # Text is in spanish

cat(textFile) 

现在,最终结果是这样的

bla bla bla bla bla bla 
bla text that I want to 
extract bla bla bla bla 
bla bla bla bla bla bla  

我怎样才能获得我想要提取的文本

我尝试在应用 ocr() 函数之前裁剪图像,但仅裁剪该部分是不可行或非常准确的。 ocr() 返回纯文本。

下面的完整示例

图片(最初为 pdf 文件)是电费单。由于隐私问题,我无法完整提供,但看起来像 sample image。在NOMBRE Y DIRECCION(名称和地址)下,应该有两行(一行带有名称,另一行带有地址),后跟“GALEANA CENTRO LERDO. C.P.”(城市名称)和“35150 LERDO,DGO”。 (邮政编码和州)。我的代码是这样的

myImage<-image_read("sampleImage.png")

myImage<-image_crop(myImage, new dimensions) #crop the right half and some from the top

textFile<-ocr(myImage,engine = tesseract("spa"), HOCR = FALSE) 

cat(textFile) 

我明白了

Nombre y Domicilio
NAME REDACTED 
ADDRESS REDACTED
GALEANA CENTRO LERDO. C.P.
35150 LERDO, DGO.
Cuenta E Tarifa
30DC27B011164660 General < 25kW 02
AE A MA E
Num. de Lectura Lectura Mult. C
Medidor actual anterior
BD6687 40994 40539 1 ¿
Apoyo gubernamental

我只想从中提取“名称已编辑”和“35150 LERDO,DGO”之间的所有内容。包括的。

【问题讨论】:

  • 我们不知道您的文本是否有潜在的结构,答案会根据结构和内容而改变。因此,其他人可以复制的示例将有所帮助。
  • 添加了一个完整的例子。希望这就足够了。如果没有,我可以提供更多详细信息或更改所需的任何内容。

标签: r ocr tesseract


【解决方案1】:

如果您知道您的文本在哪里,您可以先裁剪图像,或者您可以使用 whitelist 来限制 tesseract 正在寻找的内容,请参阅 here.


编辑: 在 cmets 之后,我们确实可以检索到地址,这里使用逻辑“提到“地址”的那一行之后的两行

text <- ("Nombre y Domicilio
NAME REDACTED 
ADDRESS REDACTED
GALEANA CENTRO LERDO. C.P.
35150 LERDO, DGO.
Cuenta E Tarifa
30DC27B011164660 General < 25kW 02
AE A MA E
Num. de Lectura Lectura Mult. C
Medidor actual anterior
BD6687 40994 40539 1 ¿
Apoyo gubernamental")

library(dplyr)
text2 <- strsplit(text, "\n") %>% unlist()
addressline <- which(grepl("address", text2, ignore.case = T))
addresslines <- c(addressline+1:2)
address_extracted <- text2[addresslines]
address_extracted
[1] "GALEANA CENTRO LERDO. C.P." "35150 LERDO, DGO."  

【讨论】:

  • 我试过了,但是我有很多不需要的图像和文本与我需要的文本非常接近。这就是为什么我只剪掉了右半部分和一些顶部。现在,从结果(我认为非常好)中,我想选择我需要的部分。 ocr() 函数返回纯文本,所以我希望能够使用它。
  • 查看编辑。一般来说,您可以使用grepgrepl 在文本中定位文本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多