关于java:Java-几行代码提取图片文字过个厉害了

起源: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…,下载实现后后装即可

第二步环境变量配置

在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 time

app = 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 result

if __name__ == '__main__':
    app.run(debug=True)

五、程序实现(Java)

不须要任何引入第三方jar包,搭建一个简略的springboot web我的项目就能够了,没有其余额定的依赖。

Spring Boot 根底就不介绍了,举荐下这个实战教程:
https://www.javastack.cn/cate…

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只能辨认规定的字符,对于一些艺术字,形象字它是无能为力的。

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2021最新版)

2.别在再满屏的 if/ else 了,试试策略模式,真香!!

3.卧槽!Java 中的 xx ≠ null 是什么新语法?

4.Spring Boot 2.5 重磅公布,光明模式太炸了!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理