Java中如何使用 tesseract-ocr 进行图片文字提取(tesseract、tesseract训练自己的字库)

tesseract下载链接:

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

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

Java中如何使用 tesseract-ocr 进行图片文字提取(tesseract、tesseract训练自己的字库)_第1张图片

文字识别技术在许多领域都有广泛的应用,例如文档处理、自动化办公、移动设备上的文本输入等。而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配置
        
        
            net.sourceforge.tess4j
            tess4j
            4.5.5
        
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 转 File
				file = convert(multipartFile,filename);
				// 判断是否为PNG类型
				boolean bl_png = isImagePng(file);
				// true/false
				if(bl_png) {
					// true 不处理
				}else {
					// 判断文件格式
					boolean bl = isImage(file);
					// 
					if(bl) {
						// 转换为png
						file = convertToPng(file);
						
					}else {
						tpExtraction.setMsg("文件格式异常,请上传.png图片格式。");
						return tpExtraction;
					}
				}
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			result = tesseract.doOCR(file);
			tpExtraction.setMsg(result);
		} catch (TesseractException e) {
			// TODO Auto-generated catch block
			e.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、应用效果

Java中如何使用 tesseract-ocr 进行图片文字提取(tesseract、tesseract训练自己的字库)_第2张图片

四、 总结

如果想要提高tesseract识别率对图片分块是一个非常好的方法,识别率提高巨大。

你可能感兴趣的:(前端,后端,大数据,ocr,java,spring,boot,机器学习,机器翻译,深度学习,opencv)