Java中如何使用 tesseract-ocr 進行圖片文字提取(tesseract、tesseract訓練自己的字庫)

tesseract下載鏈接:

github:https://github.com/tesseract-ocr/?

db:https://digi.bib.uni-mannheim.de/tesseract/

文字識別技術在許多領域都有廣泛的應用,例如文檔處理、自動化辦公、移動設備上的文本輸入等。而Tesseract-OCR作為一款開源的OCR引擎,以其高效、準確的文字識別能力,受到了廣泛的關注和應用。本文將詳細介紹Tesseract-OCR的原理、優勢、使用方法以及應用案例,幫助讀者更好地理解和使用這款工具。

一、Tesseract-OCR簡介

Tesseract-OCR是由HP實驗室開發,后由Google維護的一款開源OCR引擎。OCR是Optical Character Recognition的縮寫,意為光學字符識別,是一種通過計算機軟件識別印刷或手寫文本的技術。Tesseract-OCR采用深度學習的方法進行文字識別,可以識別多種語言,包括英文、中文、德文、法文等。

二、Tesseract-OCR的優勢
  • 準確性高:Tesseract-OCR的準確性在同類產品中處于領先地位,對于印刷體文本的識別率高達95%以上。
  • 支持多種語言:Tesseract-OCR支持多種語言的識別,包括英文、中文、德文、法文等,并可以通過訓練來擴展識別其他語言。
  • 靈活的API接口:Tesseract-OCR提供了靈活的API接口,可以輕松集成到各種應用中,方便開發者進行二次開發。
  • 跨平臺性:Tesseract-OCR可以在多種操作系統上運行,如Windows、Linux和Mac OS等。
    三、Tesseract-OCR的使用方法
  • 安裝:首先需要下載并安裝Tesseract-OCR軟件。可以從官網下載最新版本的安裝包進行安裝。對于不同的操作系統,需要選擇相應的安裝包進行下載和安裝。
  • 訓練數據:為了提高識別的準確性,需要對特定的字體或文本進行訓練。訓練數據可以是自己的數據集,也可以使用公開的數據集進行訓練。訓練完成后,保存為.traineddata文件供Tesseract-OCR使用。
  • API接口:Tesseract-OCR提供了多種語言的API接口,包括C++、Java、Python等。開發者可以根據自己的需求選擇相應的接口進行集成和使用。使用API接口可以方便地進行文本識別的各種操作,例如識別圖片中的文本、進行文本轉換等。
    四、Tesseract-OCR的應用案例
  • PDF文字識別:將PDF文件中的文字識別出來,方便用戶進行編輯和使用。
  • 圖形驗證碼識別:將圖形驗證碼中的文字識別出來,用于登錄驗證等場景。
  • 移動設備上的文本輸入:通過拍照或掃描文檔,將圖片中的文字識別出來,方便用戶進行文本輸入。
  • 自動化辦公:將紙質文檔或圖片中的文字識別出來,進行后續的處理和分析。
三、(源碼)Tesseract-OCR在Java中的應用實例
1、maven配置
        <!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j --><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.5</version></dependency>
2、源碼
/*** 	提取圖片文字接口 V1.1*/
@RestController 
@RequestMapping(value="/ts/api/extract")     
public class TpExtractionApiController {// Windows圖片地址public final static String globalVariableImageUrl = "D:\\tesseract";// Windows tesseract 訓練地址public final static String globalVariableTesseractUrl = "D:\\tesseract";/*** 	main*/@RequestMapping(value="/image", method=RequestMethod.POST) public TpExtraction reg(@ApiParam(value = "文件") @RequestPart(value = "multipartFile") MultipartFile multipartFile) {//TpExtraction tpExtraction = new TpExtraction();//String filename = multipartFile.getOriginalFilename();//創建tess對象ITesseract tesseract = new Tesseract();//windows 設置訓練文件目錄tesseract.setDatapath(globalVariableUrl+"\\tessdata");//設置訓練語言tesseract.setLanguage("chi_sim");//String result = "";//try {File file = null;try {// MultipartFile 轉 Filefile = convert(multipartFile,filename);// 判斷是否為PNG類型boolean bl_png = isImagePng(file);// true/falseif(bl_png) {// true 不處理}else {// 判斷文件格式boolean bl = isImage(file);// if(bl) {// 轉換為pngfile = convertToPng(file);}else {tpExtraction.setMsg("文件格式異常,請上傳.png圖片格式。");return tpExtraction;}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}result = tesseract.doOCR(file);tpExtraction.setMsg(result);} catch (TesseractException e) {// TODO Auto-generated catch blocke.printStackTrace();}return tpExtraction;}/***	 MultipartFile 轉 File**/public static File convert(MultipartFile file,String filename) throws IOException {// windows 圖片路徑File convFile = new File(globalVariableUrl+"\\"+filename);// 創建文件convFile.createNewFile();try (InputStream in = file.getInputStream();OutputStream out = new FileOutputStream(convFile)) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}}return convFile;}/*** 判斷文件類型是否為圖片類型*/public static boolean isImage(File file) {String name = file.getName().toLowerCase();return name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".png") ||name.endsWith(".gif") || name.endsWith(".bmp") || name.endsWith(".wbmp");}/*** 判斷文件類型是否為PNG圖片類型*/public static boolean isImagePng(File file) {String name = file.getName().toLowerCase();return name.endsWith(".png");}/***	將圖片文件轉換為PNG格式*/public static File convertToPng(File file) {//File writeFile = null;//try {BufferedImage image = ImageIO.read(file);String name = file.getName().toLowerCase();String format = "png";if (name.endsWith(".jpg") || name.endsWith(".jpeg")) {format = "png";} else if (name.endsWith(".gif")) {format = "gif";} else if (name.endsWith(".bmp") || name.endsWith(".wbmp")) {format = "bmp";}writeFile = new File(file.getParent(), name.substring(0, name.lastIndexOf('.')) + ".png");ImageIO.write(image, format, writeFile);} catch (IOException e) {e.printStackTrace();}return writeFile;}}
3、應用效果

四、 總結

如果想要提高tesseract識別率對圖片分塊是一個非常好的方法,識別率提高巨大。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40157.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40157.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40157.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python推導式寫出簡潔高效的代碼方法詳解

概要 推導式是Python中一種非常強大的語法特性,允許你用簡潔的語法創建列表、字典、集合等數據結構。使用推導式不僅可以讓代碼更加簡潔和易讀,還能提高代碼的執行效率。本文將詳細介紹Python中的各種推導式,并提供相應的示例代碼,幫助全面掌握這一強大的工具。 列表推導式…

【前端項目筆記】9 數據報表

數據報表 效果展示&#xff1a; 在開發代碼之前新建分支 git checkout -b report 新建分支report git branch 查看分支 git push -u origin report 將本地report分支推送到云端origin并命名為report 通過路由的形式將數據報表加載到頁面中 渲染數據報表基本布局 面包屑導航…

數據洞察:從零到一的數據倉庫與Navicat連接全攻略【實訓Day04】[完結篇]

一、數據分析 1 實現數據倉庫(在hadoop101上) 1) 創建jobdata數據庫 # cd $HIVE_HOME # bin/hive hive>create database jobdata; hive>use jobdata; 2) 創建原始職位數據事實表ods_jobdata_orgin(在hadoop101上) create table ods_jobdata_origin( city string CO…

Keepalived+LVS實現負責均衡,高可用的集群

Keepalived的設計目標是構建高可用的LVS負載均衡群集&#xff0c;可以調用ipvsadm工具來創建虛擬服務器&#xff0c;管理服務器池&#xff0c;而不僅僅用作雙機熱備。使用Keepalived構建LVS群集更加簡便易用&#xff0c;主要優勢體現在&#xff1a;對LVS負責調度器實現熱備切換…

配置并調試后端程序(sql)

1.環境準備 安裝VS Code和Node.js插件&#xff1a;確保你已經安裝了VS Code和Node.js插件。創建launch.json文件&#xff1a;在你的項目中創建一個.vscode文件夾&#xff0c;并在其中創建launch.json文件。添加以下內容&#xff1a; {"version": "0.2.0"…

uniapp 數據父傳子

文章目錄 可能出現的問題 在uni-app中&#xff0c;父組件向子組件傳遞數據主要通過屬性綁定的方式實現。這里提供一個簡單的示例來說明如何進行父傳子的數據傳遞&#xff1a; 父組件 準備數據: 在父組件的data中定義要傳遞的數據。 export default {data() {return {parentMe…

@ControllerAdice統一返回值類型【Spring源碼學習】

我們可以通過在ControllerAdvice注解類上實現ResponseBodyAdvice注解來實現統一返回值類型&#xff1b; 例如統一接口的返回類型為Result類 ControllerAdvice static class MyControllerAdvice implements ResponseBodyAdvice<Object> {Overridepublic boolean supports…

PLC基礎知識

1.PLC中的數據寄存器地址D表示存數據的地方。 2.PLC的物理存儲器的規定&#xff1a;PLC存儲器以字節為單位&#xff08;Byte&#xff09;&#xff0c;存儲單元以位&#xff08;Bit&#xff09;、字節&#xff08;B&#xff0c;8Bit&#xff09;、字&#xff08;W&#xff0c;1…

谷歌優化師招聘網站:夢想啟航的舞臺,實現職業理想的起點

尊敬的夢想實踐者們&#xff0c;歡迎您走進谷歌優化師招聘網站這個充滿魔力的領域。這里不僅是一個招聘平臺&#xff0c;更是您實現職業理想的起點&#xff0c;激發熱情的舞臺。現在&#xff0c;請做好準備&#xff0c;與我們共同揭開這個神秘世界的面紗&#xff01; 夢想啟航…

電子行業MES系統解決方案

工業4.0時代的工業自動化&#xff0c;將在原有自動化技術和架構下&#xff0c;實現集中式控制向分散式增強型控制的基本模式轉變&#xff0c;讓設備從傳感器到因特網的通訊能夠無縫對接&#xff0c;從而建立一個高度靈活的、個性化和數字化、融合了產品與服務的生產模式。在這種…

上海市計算機學會競賽平臺2022年11月月賽丙組染色問題

題目描述 &#x1d45b;n 個點排成一列&#xff0c;需要給每個點一個顏色&#xff0c;顏色有 &#x1d45a;m 種。請問有多少種方法&#xff0c;能使任意相鄰兩個點的顏色均不相同&#xff1f; 輸入格式 兩個整數&#xff1a;表示 &#x1d45b;n 與 &#x1d45a;m 輸出格…

【控制Android.bp的編譯】

1.首先Android.bp的語法是不支持if 條件語句的 2.查到可以用enabled來控制Android.bp中的模塊是否參與編譯&#xff0c;但是并不能實現動態的控制&#xff0c;比如你需要根據獲取到的安卓版本來控制一個Android.bp是否編譯&#xff0c;是無法做到的。enabled只能是固定的true或…

spark shuffle寫操作——BypassMergeSortShuffleWriter

創建分區文件writer 每一個分區都生成一個臨時文件&#xff0c;創建DiskBlockObjectWriter對象&#xff0c;放入partitionWriters 分區writer寫入消息 遍歷所有消息&#xff0c;每一條消息都使用分區器選擇對應分區的writer然后寫入 生成分區文件 將分區writer的數據flu…

Java中初始化一個List的多種方式

1.最原始的方式&#xff1a;先創建&#xff0c;然后再添加元素 List<String> list new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry");2.使用Arrays.asList 這是一種快速方便的方式&#xff0c;直接…

從海上長城到數字防線:視頻技術在海域邊防現代化中的創新應用

隨著全球化和科技發展的加速&#xff0c;海域安全問題日益凸顯其重要性。海域邊防作為國家安全的第一道防線&#xff0c;其監控和管理面臨著諸多挑戰。近年來&#xff0c;視頻技術的快速發展為海域邊防場景提供了新的解決方案&#xff0c;其高效、實時、遠程的監控特點極大地提…

面試八股Day1

JavaSE&#xff08;回顧&#xff09; 什么是java? java跟c的區別&#xff1f;Java語言有哪些特點&#xff1f;JVM、JDK和JRE有什么區別&#xff1f;什么是跨平臺性&#xff1f;原理是什么&#xff1f;什么是字節碼&#xff1f;采用字節碼的好處是什么&#xff1f; 說說Java程…

如何快速開展每日待辦工作 待辦任務高效管理

每天&#xff0c;我們都需要處理大量的待辦工作&#xff0c;如何高效有序地開展這些工作成為了我們必須要面對的問題。僅僅依靠個人的記憶和腦力去管理這些繁雜的事務&#xff0c;顯然是一項艱巨的挑戰。在這個時候&#xff0c;如果能有一款實用的待辦工具來輔助我們&#xff0…

深入理解Spring應用中的初始化和清理代碼執行方式

目錄 引言使用PostConstruct和PreDestroy注解 PostConstructPreDestroy 實現InitializingBean和DisposableBean接口 afterPropertiesSet()destroy() 使用init-method和destroy-method屬性 init-methoddestroy-method 使用Bean注解的initMethod和destroyMethod屬性 initMethodd…

【高級篇】第8章 Elasticsearch 安全與權限管理

在深入探討Elasticsearch高級應用的征途中,我們無法忽視其核心——安全與權限管理的重要性。此章節將為你全面剖析如何構建一個既強大又安全的數據搜索與分析平臺。本章內容將圍繞X-Pack的強大功能展開,深入用戶與角色管理的實踐,以及如何利用SSL/TLS加密來強化數據傳輸的安…

如何使用C++調用Pytorch模型進行推理測試:使用libtorch庫

如何使用C調用Pytorch模型進行推理測試&#xff1a;使用libtorch庫 目錄 如何使用C調用Pytorch模型進行推理測試&#xff1a;使用libtorch庫一、環境準備1&#xff0c;linux&#xff1a;以ubuntu 22.04系統為例1. 準備CUDA和CUDNN2. 準備C環境3, 下載libtorch文件4, 編寫測試li…