几行 Java 代码搞定图片提取文字功能
近日瀏覽網(wǎng)上一些圖片提取文字的網(wǎng)站,覺得甚是有趣,花費(fèi)半日也做了個在線圖片識別程序,完成了兩個技術(shù)方案的選擇,一是 tesseract + Python flask的方案實(shí)現(xiàn),二是 tesseract + Spring web 的技術(shù)解決方案,并簡作論述,與君共勉。
一、tesseract-ocr介紹
ocr 含義是Optical Character Recognition,含義即視覺字符識別。而tesseract是該領(lǐng)域特別優(yōu)秀開源的作品。
官方的tesseract定義:
OCR engine - libtesseract and a command line program - tesseract.
即tesseract包括一個視覺字符識別引擎libtesseract和命令行程序tesseract。
當(dāng)前最新穩(wěn)定版本是4.x.x基于LSTM,源碼可從找到tesseract的GitHub: tesseract.找到。
關(guān)于tesseract的工作模式如上圖所示。假設(shè)現(xiàn)在有一個圖片輸入,整個執(zhí)行流程為:輸入(一張圖片)
有用信息提取(比如一個圖片上只有一個字,那其他留白的是無用,這個字上每個色素是有效的并且相關(guān))
找出文字/線條
字符分類集
輸入與分類集對比找出最接近的
輸出識別結(jié)果
二、安裝tesseract
第一步下載
下載合適的exe安裝文件:
網(wǎng)址:https://digi.bib.uni-mannheim.de/tesseract/,下載完成后后裝即可
第二步環(huán)境變量配置
在path變量中加入tesseract-ocr的安裝路徑
第三步安裝成功檢測
使用tesseract指令,顯示如下:
Linux環(huán)境下載安裝與上述類似
下載leptonica 和 tesseract兩個包,解壓安裝,配置環(huán)境變量即可。網(wǎng)上很容易找到該安裝包。
三、使用命令行
1.tesseract + 圖片路徑 + 保存結(jié)果名 + -l 語言集
示列: tesseract 1606150081.png 1606150081 -l chi_sim
2.tesseract + 圖片路徑 +stdout -l +語言集
示列: tesseract D:\company\ruigushop\spring-2s\test.png stdout -l chi_sim
有了上述之后就可以完成web圖片識別程序的開發(fā)啦,廢話不多說,直接上代碼。
四、程序?qū)崿F(xiàn)(Python)
程序設(shè)計思路:
上傳圖片 -> 保存 ->對上傳的圖片執(zhí)行tesseract指令->獲取識別結(jié)果
只有二十多行代碼就實(shí)現(xiàn)了,so easy,以后網(wǎng)上看到圖片識別程序再也不會感覺神奇了吧!
# coding=utf-8 from flask import Flask, request import os import datetime import timeapp = Flask(__name__)def get_time_stamp():times = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')array = time.strptime(times, "%Y-%m-%d %H:%M:%S")time_stamp = int(time.mktime(array))return?time_stamp@app.route('/image/extract', methods=['POST']) def pure_rec():file?= request.files.get('file')ts?= str(get_time_stamp())up_path = os.path.join(ts?+ file.filename)file.save(up_path)cmd = "tesseract "+up_path+" "?+ ts?+ " -l chi_sim"print(cmd)os.system(cmd)with open(ts+".txt", 'r+', encoding="utf-8") as?f:result = f.read()return?resultif?__name__ == '__main__':app.run(debug=True)五、程序?qū)崿F(xiàn)(Java)
不需要任何引入第三方j(luò)ar包,搭建一個簡單的 Springboot Web 項目就可以了,沒有其他額外的依賴。
Controller:
@RestController public?class?LiteralExtractController {@PostMapping("/image/extract")public?String?reg(@RequestParam("file")MultipartFile file) throws IOException {String?result = "";String?filename = file.getOriginalFilename();File save = new?File(System.getProperty("user.dir")+"\\"+filename);if?(!save.exists()){save.createNewFile();}file.transferTo(save);String?cmd = String.format("tesseract %s stdout -l %s",System.getProperty("user.dir")+"\\"+filename,"chi_sim");result = cmd(cmd);return?result;}public?static?String?cmd(String?cmd) {BufferedReader br = null;try?{Process p = Runtime.getRuntime().exec(cmd);br = new?BufferedReader(new?InputStreamReader(p.getInputStream()));String?line = null;StringBuilder sb = new?StringBuilder();while?((line = br.readLine()) != null) {sb.append(line + "\n");}return?sb.toString();} catch?(Exception e) {e.printStackTrace();}finally{if?(br != null){try?{br.close();} catch?(Exception e) {e.printStackTrace();}}}return?null;} }六、實(shí)驗測試
很簡單二十多行代碼就完成了,看看效果怎么樣吧。
測試一圖片:
測試一結(jié)果:
測試二圖片:
測試二結(jié)果:
perfect,識別的很準(zhǔn)確,第二個測試全部是英文字符的時候我們采用了中文訓(xùn)練的數(shù)據(jù)集,雖然也很好的識別了,但是速度會慢很多。
七、總結(jié)
圖片識別在當(dāng)今網(wǎng)絡(luò)技術(shù)領(lǐng)域是非常熱門的一塊,而這次完成的這個程序完全是依賴別人開源框架來完成了這個技術(shù)實(shí)現(xiàn),在應(yīng)用層面這是成功的,但是本質(zhì)上并沒有實(shí)際算法,技術(shù)核心上的東西,如果只關(guān)心應(yīng)用層開發(fā)上述解決了我們計算機(jī)在規(guī)則字符識別上的問題。
上述代碼中基本沒有難點(diǎn),直接復(fù)制即可使用。此外,tesseract作為一款優(yōu)秀的開源字符識別軟件,但它也不是萬能的,tesseract只能識別規(guī)則的字符,對于一些藝術(shù)字,抽象字它是無能為力的。
來源:blog.csdn.net/weixin_44671737/article/details/110000864
#投 稿?通 道#
?讓你的博客被更多人看到?
如果你在 CSDN、博客園、掘金等平臺有寫技術(shù)博客的習(xí)慣,想讓自己的原創(chuàng)博客被更多人看到,可以來 Java后端 投稿。
Java后端 鼓勵讀者投稿個人技術(shù)博客、面試經(jīng)驗、教程。不管是入門的圖文教程、還是熱門技術(shù)講解,只要你喜歡寫東西,我們歡迎你來投稿。
?????稿件基本要求:
? 文章確系個人原創(chuàng)作品,如果在其他非公眾號渠道有過發(fā)表也可以,只要是個人原創(chuàng)即可。
? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發(fā)送,要求圖片清晰、語句通順。
? 如果被采納的原創(chuàng)稿件,我們將提供稿費(fèi)以及個人影響力曝光,具體依據(jù)文章閱讀量和質(zhì)量結(jié)算稿費(fèi)。
?????投稿通道:
? 投稿請聯(lián)系下方微信,備注:原創(chuàng)投稿
△長按添加 Java后端 小編
總結(jié)
以上是生活随笔為你收集整理的几行 Java 代码搞定图片提取文字功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css预编译的优缺点
- 下一篇: Rabbits and Recurren