web文字图片识别程序开发

  • 摘要
  • 一、tesseract-ocr介绍
  • 二、安装tesseract
  • 三、使用命令行
  • 四、程序实现(Python)
  • 五、程序实现(Java)
  • 六、实验测试
  • 七、总结

摘要

近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是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只能识别规则的字符,对于一些艺术字,抽象字它是无能为力的。

翻译app上的图片文字信息提取好神奇?如何实现一个文字图片识别程序相关推荐

  1. html同一段文字设置不同颜色字体,CSS设置一个文字两种颜色

    CSS设置一个文字两种颜色属于前端实例代码,有关更多实例代码大家可以查看. CSS可以将一个文字设置为两种颜色,下面介绍一下如何实现此效果. 代码实例如下: 犀牛前端部落 .antzone{ disp ...

  2. 前端判断img图片未能正确加载时显示一个默认图片。img标签onerror事件设置了本地默认图片还是不显示的问题

    前端img标签中引用后端交给的图片地址时,有可能这个路径下图片被删除或者损坏了,那么页面在加载img图片时就显示为,太丑了. img标签有个onerror事件,就是当图片未被正确加载的时候调用此事件, ...

  3. 计算机函数表格制作图片作业,使用VOOKUP函数,制作一个报价单简易小程序-Excel电子表格...

    老板让制作一个报价单,当填入需求的时候,总报价就自动的计算出来了 1.物品较少的时候 制作的效果如下,我们只需要输入物品和数量,单价和金额能够自动的进行计算 这个简易的报价单只需要两步进行制作: ❶简 ...

  4. 教你实现一个提取图片上文字的Java项目!

    来源:https://mp.weixin.qq.com/s/FZy3Ppm_y6qTK_Lz65WlvQ 摘要 近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成 ...

  5. css背景上能添加文字,如何利用div+css来给背景图片上文字布局

    这段时间设计了一个专题页面,上传到网站上去,打开这个网页一看,问题来了,这网页只是一个图片,没有文字,在后台添加的时候才知道只能在图片的下面显示文字. 我想到了可以将图片设为背景,然后在上面添加问题, ...

  6. python写文字方法_初学Python-简单的在图片上加文字

    场景 在用户运营中,拉新是第一步.我们产品打算先再小范围试验一下效果,不动用开发哥哥,自己制作邀请海报. 没错,就是最简单的,邀请领奖励活动. UI妹妹把海报模版做出来,邀请码根据用户ID自行填上. ...

  7. [软件工具]OCR批量识别图片提取文字信息提取号码编号单号软件使用教程

    当你有很多图片,但是想提取这些图片里面的手机号或者编号或者快递单号,或者是其他一些信息时候这个工具就很有用了,一般都是通过打开图片一张一张去查看手动输入信息,但是图片很多时候基本就是个体力活,十分不方 ...

  8. 怎么把图片上的字盖住_html用css怎样把文字覆盖到图片上?

    展开全部 可以把图片作e69da5e6ba9062616964757a686964616f31333365633864为文字那个块标签的背景图片或者你把图片和文字都放在一个同一个div 里面然后给图片 ...

  9. 因为1024图片 AppIcon 图标包含了透明度导致app上传ios 代码报错

    错误提示图片 错误原因: AppIcon 图标包含了透明度,才导致了包的上传失败. 后面我查看了AppIcon中添加的图片, 发现有一张1024 x 1024@1x的图标带有alpha透明度. 错误验 ...

最新文章

  1. AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203
  2. Javascript学习------内部对象
  3. 【BLE MIDI】MIDI 时间标志分析 ( 音符速度设置事件 | 拍号设置事件 | 基本时间 - 每个四分音符有多少 tick 或 pulse | 节拍时值计算 | 小节时值计算 )
  4. CTF-Xortool,windows上的安装与使用
  5. 案例代码:sprimngboot备份数据库
  6. MFC实现图像灰度、采样和量化功能详解
  7. 买了套房28年后才想起来,房价从33万涨到600万!上门却发现住着人?
  8. c++ 判断数学表达式有效性_2009年高考数学上海卷难度如何?独特的题型设计,让你耳目一新...
  9. 智能门锁主要有哪些优势,具体是怎么分类的?
  10. 使用stm32驱动RC522读取IC卡
  11. App测试实战:测试内容、测试工具、测试效果
  12. wsimport 的使用
  13. 外卖cps淘客项目,一个被动引流躺着赚钱的玩法
  14. IT运维存在问题及改进
  15. macOS Monterey系列原版光盘镜像文件制作
  16. VMware SDS之十: VMware SPBM之SolidFire篇
  17. vue使用高德地图关键字搜索功能的实例代码(踩坑经验)
  18. 国外大学诸多自学课程
  19. 【html】svg标签
  20. traceroute命令(unix)/tracert命令(windows)的工作原理

热门文章

  1. 利用PP-OCR对街道门牌号进行识别
  2. sunspot solr
  3. Springboot高校学生实习档案管理毕业设计-附源码221508
  4. VUE项目搭建的整个过程
  5. 计算机文件丢失系统无法启动,文件损坏或丢失windows无法启动_windows无法启动文件损坏解决方法...
  6. python代码什么时候用单引号_Python 中的单引号和双引号有什么区别?
  7. Tuscany 的说明
  8. 关于笔记本电脑的选购
  9. 哔哩哔哩在Hilt组件化的使用 | 技术探索
  10. mysql 数据文件_mysql的数据文件