利用R语言实现OCR的笔记
Posted mad night owl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用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
以上是关于利用R语言实现OCR的笔记的主要内容,如果未能解决你的问题,请参考以下文章
印刷字符识别基于matlab OCR印刷字母+数字识别含Matlab源码 1861期
印刷字符识别基于matlab OCR印刷字母+数字识别含Matlab源码 287期