欢迎关注方志朋的博客,回复”666“获面试宝典

来源:blog.csdn.net/weixin_44671737/

article/details/110000864

摘要

近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是tesseract+python flask的方案实现,二是tesseract+spring web的技术解决方案,并简作论述,与君共勉。

一、tesseract-ocr介绍

ocr含义是Optical Character Recognition,含义即视觉字符识别。而tesseract是该领域特别优秀开源的作品。

官方的tesseract定义:

OCR engine - libtesseract and a command line program - tesseract.

即tesseract包括一个视觉字符识别引擎libtesseract和命令行程序tesseract。

当前最新稳定版本是4.x.x基于LSTM,源码可从找到tesseract的GitHub: tesseract.找到。

关于tesseract的工作模式如上图所示。假设现在有一个图片输入,整个执行流程为:

  1. 输入(一张图片)

  2. 有用信息提取(比如一个图片上只有一个字,那其他留白的是无用,这个字上每个色素是有效的并且相关)

  3. 找出文字/线条

  4. 字符分类集

  5. 输入与分类集对比找出最接近的

  6. 输出识别结果

二、安装tesseract

第一步下载

下载合适的exe安装文件:

网址:https://digi.bib.uni-mannheim.de/tesseract/,下载完成后后装即可

第二步环境变量配置

在path变量中加入tesseract-ocr的安装路径

第三步安装成功检测

使用tesseract指令,显示如下:

linux环境下载安装与上述类似

下载leptonica 和 tesseract两个包,解压安装,配置环境变量即可。网上很容易找到该安装包。

三、使用命令行

1.tesseract + 图片路径 + 保存结果名 + -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图片识别程序的开发啦,废话不多说,直接上代码。

四、程序实现(Python)

程序设计思路:

上传图片 -> 保存 ->对上传的图片执行tesseract指令->获取识别结果

只有二十多行代码就实现了,so easy,以后网上看到图片识别程序再也不会感觉神奇了吧!

# 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)

五、程序实现(Java)

不需要任何引入第三方jar包,搭建一个简单的springboot web项目就可以了,没有其他额外的依赖。

Controller:

package com.lbh.web.controller;/** Copyright@lbhbinhao@163.com* Author:liubinhao* Date:2020/11/23* ++++ ______ @author       liubinhao   ______             ______* +++/     /|                         /     /|           /     /|* +/_____/  |                       /_____/  |         /_____/  |* |     |   |                      |     |   |        |     |   |* |     |   |                      |     |   |________|     |   |* |     |   |                      |     |  /         |     |   |* |     |   |                      |     |/___________|     |   |* |     |   |___________________   |     |____________|     |   |* |     |  /                  / |  |     |   |        |     |   |* |     |/ _________________/  /   |     |  /         |     |  /* |_________________________|/b    |_____|/           |_____|/*/
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;@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;}
}

哈哈哈,还有帅气的程序logo。

六、实验测试

很简单二十多行代码就完成了,看看效果怎么样吧。

测试一图片:

测试一结果:

测试二图片:

测试二结果:

perfect,识别的很准确,第二个测试全部是英文字符的时候我们采用了中文训练的数据集,虽然也很好的识别了,但是速度会慢很多。

七、总结

图片识别在当今网络技术领域是非常热门的一块,而这次完成的这个程序完全是依赖别人开源框架来完成了这个技术实现,在应用层面这是成功的,但是本质上并没有实际算法,技术核心上的东西,如果只关心应用层开发上述解决了我们计算机在规则字符识别上的问题。

上述代码中基本没有难点,直接复制即可使用。此外,tesseract作为一款优秀的开源字符识别软件,但它也不是万能的,tesseract只能识别规则的字符,对于一些艺术字,抽象字它是无能为力的。

热门内容:干掉SQL中的like,我用es后运营小姐姐们都说好快!假如 IDEA 也加入防沉迷功能...当 Docker 遇到 Intellij IDEA,再次解放了生产力~你真的会写for循环吗?来看看这些常见的for循环优化方式最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

图片提取文字功能很神奇?Java几行代码搞定它!相关推荐

  1. 图片提取文字功能很神奇?Java几行代码搞定它

    摘要 近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是tesseract+python flask的方案实现,二是tesseract+ ...

  2. python怎么识别图片里面的文字并合成语音_几行代码搞定识别图片中的文字信息,同时转换成语音...

    image前几天想把一篇不错的文章保存下来,无奈是图片的,于是想利用python把图片中的文字识别出来 实现的方式还是挺多的,这里介绍下百度的AI开放平台,毕竟大公司,感觉识别的精度会高点,同时相信他 ...

  3. 微信支付java helloworld_10行代码搞定微信支付(Java版)

    微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与对象的互转, 微信使用xml格式而不使用jso ...

  4. java微信支付代码_10行代码搞定微信支付(Java版)

    原标题:10行代码搞定微信支付(Java版) 微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与 ...

  5. 几行 Java 代码搞定图片提取文字功能

    近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是 tesseract + Python flask的方案实现,二是 tesseract ...

  6. python屏幕文字识别_学会python就是如此任性,15行代码搞定图片文字识别,附源码...

    python作为一门高级编程语言,它的定位是优雅.明确和简单.阅读Python编写的代码感觉像在阅读英语一样,这让使用者可以专注于解决问题而不是去搞明白语言本身.Python虽然是基于C语言编写,但是 ...

  7. Python 技术篇-3行代码搞定图像文字识别,pytesseract库实现

    我们需要 pillow 和 pytesseract 这两个库,pip install 安装就好. 还需要安装 Tesseract-OCR.exe 然后配置下就好了. 具体的环境配置方法请看 pytho ...

  8. 网易数读所有精致图片,Python百行代码搞定!

    微信公众号原文链接 网易数读是一个数据新闻可视化栏目,致力于提供轻量化的阅读体验.其内容往往是结合时下新闻热点将相关数据可视化处理,并以精致的图文形式呈现出来. 举个栗子,大家感受一下人家的风格: 图 ...

  9. 短短60行代码搞定鸿蒙“二维码扫描”功能!

    开发者(KaiFaX) 面向全栈工程师的开发者专注于前端.Java/Python/Go/PHP的技术社区 可以实现的效果就是打开摄像头扫描一张二维码图片然后显示二维码里面的内容,看个视频一睹为快吧(界 ...

最新文章

  1. 港科大谢丹阳教授问诊未来,预测长远趋势与转折点
  2. 45. GameProject9+输入检测
  3. gentoo 安装opencv
  4. 【数据平台】pandas按条件去重
  5. Skpi List跳表
  6. 一篇网易获奖的产品分析来敲门:『有道云笔记』产品体验报告
  7. 【渝粤教育】电大中专常见病药物治疗 (2)作业 题库
  8. 怎么知道wx.config执行成功没_作为一个减肥40斤,且10年没反弹的普通人,这份瘦身经验分享给你...
  9. 有两个python怎么停用其中一_如何在python中停止另一个已经运行的脚本?
  10. gephi生成网络关系图_路网拓扑重建专题 (3) 网络图生成
  11. 大数据_Hbase-原理说明_大数据存储_垂直拆表_水平拆表_动态列扩展---Hbase工作笔记0003
  12. 一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化
  13. 水滴公司在纽交所挂牌上市;嘉楠科技完成1.7亿美元机构定增 | 美通企业日报...
  14. 怎么查询域名mx记录是否生效
  15. 问题G:卡布列克常数
  16. 电工电子学学习笔记---稳压管部分
  17. Ubuntu 安装MinGW32出现Unable to locate package mingw32找不到安装包的解决方法和思路
  18. 对求一个数的各个位数的理解
  19. 安卓系统双屏异显_双屏异显在Android系统上的实现
  20. VC++图形平移功能的实现

热门文章

  1. 树莓派装linux ros,树莓派安装Ubuntu16.04 MATE系统以及ROS(kinetic)的安装
  2. centos ezhttp mysql_CentOS安装mysq
  3. ORACLE中的imp和exp
  4. JS中Math函数的常用方法
  5. Leetcode 213.大家劫舍II
  6. js 验证数据类型的4中方法
  7. Tomcat在Linux上的安装与配置
  8. HDU-4738-Caocao's Bridges(tarjan)
  9. Delphi7的主窗口
  10. Winform程序怎么降低占用的内存?