利用R语言实现OCR的笔记

一、OCR能干什么

OCR(Optical Character Recognition)能够实现对文本资料的图像文件进行分析识别处理,获取文字及版面信息,这意味着面对大篇幅显示为.jpg、.png等图片的文字信息,我们不需要手动录入就可以实现将图片转化为文本

前段时间笔者看到复旦大学有位博士利用OCR将核酸检测图片的信息转化为文本并进行整理。笔者最近恰好在学习R语言,想到R语言对于表格类的信息处理起来具有天然的优势,于是决定尝试用R语言实现这一过程。

经过笔者在CSDN、腾讯云和哔站等社区的学习,目前可以实现部分该功能,遂做记录,后续会逐步完善

二、R环境下实现OCR的功能的包

鉴于R环境下存在各种R包对R的工作环境进行不断的扩充,笔者觉得应该存在一个R包能够实现OCR功能。经过查找,这个包也确实存在。

tesseract包即可实现OCR功能

事实上,tesseract本身就是一个支持多种操作系统的OCR引擎。tesseract的最大优点是它是一个开源软件。在2006年tesseract被认为是最精准的开源光学字符识别引擎之一。(上述资料来源于维基百科)

在这篇blog中,笔者将实现在R环境下OCR中文图片输出文本文件并简单测试tesseract包进行OCR的性能

三、R环境下实现OCR

1.R包准备

#初始化
rm(list = ls()) 
options(stringsAsFactors = F)

#R包加载
library(magick) #图片切割
library(tesseract)#ocr文字识别
library(stringr)#字符串处理
library(httr)#处理http信息

本次用到的R包如果没有安装都可以通过install.packages()安装成功

2.先查看tesseract包中是否有中文训练数据,如果没有,需要下载安装

> tesseract_info()
$datapath
[1] "C:\Users\HP\AppData\Local\tesseract5\tesseract5\tessdata/"

$available
[1] "chi_sim" "chi_tra" "eng"     "osd"    

$version
[1] "5.0.1"

$configs
 [1] "alto"             "ambigs.train"     "api_config"       "bigram"          
 [5] "box.train"        "box.train.stderr" "digits"           "get.images"      
 [9] "hocr"             "inter"            "kannada"          "linebox"         
[13] "logfile"          "lstm.train"       "lstmbox"          "lstmdebug"       
[17] "makebox"          "pdf"              "quiet"            "rebox"           
[21] "strokewidth"      "tsv"              "txt"              "unlv"            
[25] "wordstrbox"      

$available中默认存在  "eng" 和"osd"两个训练数据,默认识别语言是英语。其中的"chi_sim"和 "chi_tra"表示中文训练数据,如果不存在于$available中,需要下载安装

笔者使用的方法是GitHub下载需要的.traineddata文件,手动拖入$datapath所对应的文件夹下,再次运行代码,提示导入成功。

以下附上GitHub下载地址

https://github.com/tesseract-ocr/tessdatahttps://github.com/tesseract-ocr/tessdata

3.读取图片做OCR并输出文本

(1)在此笔者以海子(R.I.P)的一段诗做OCR的简单测试

此图片命名11.jpg放置在桌面文件夹

 代码如下

#读入图片
img <-  image_read(path = 'c:/Users/HP/Desktop/11.jpg')

#文字识别
text <- ocr(img,engine = tesseract('chi_sim'))

#查看结果
cat(text)#由于结果中有换行的正则表达式n,需要用cat()函数读取

#写出成.txt文件
write.table(text,file = 'c:/Users/HP/Desktop/orc.txt',row.names = F, col.names = F)

将row.names ,和col.names的逻辑值都设为F能避免读出多余的行名和列名

笔者得到如下结果

 左边为图片,右边是OCR得出的结果,结果还是相当不错的。

(2)利用tesseract包做健康卡页面的OCR读取,结果如下

 

 

 笔者发现,虽然tesseract做OCR可以很好地获取印刷体中文字符,但是却无法识别图片和符号信息。txt文件中间的乱码估计系读取二维码所致

(3)利用tesseract包做健康卡页面的OCR读取非印刷体文字测试,结果如下图所示

 可以发现,tesseract包做非规范印刷体OCR时并不能很好地识别汉字,这可能也和图中汉字颜色浅,字体小有关。但是,笔者发现,tesseract包对非规范印刷体的数字识别依然比较精确

与tesseract相比,腾讯QQ自带的OCR功能更胜一筹,对汉字的识别率更高,如下图所示

 

四、期望

下一步,笔者将尝试对OCR的结果进行优化并提取其中的有用信息

在此之上,笔者将完善代码,逐步实现批量处理图片获取有效信息后成表

大部分代码来源于以下

图片切割与ocr文字识别(R语言) - 哔哩哔哩 (bilibili.com)

R+OCR︱借助tesseract包实现图片文本提取功能 - 云+社区 - 腾讯云 (tencent.com)

special thanks to 61

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>