1. 程式人生 > >[影象識別] java語言使用tess4j識別圖片中的文字

[影象識別] java語言使用tess4j識別圖片中的文字

之所以寫下這篇文章,是因為在實踐中使用時,發現在識別整張圖時,準確率降低。尤其是中文,英文,字元,數字,水印都有的時候。出錯率很高。原先一直認為是水印的問題。結果將圖片二值化以後,沒有水印,識別準確度依舊很低。
偶然的情況,使用區域性區域識別,發現,效果很好,準確度大大提高。
然後體用api切換中文,英文識別庫,很大程度的提高了準確率。

maven依賴

 <dependency>
     <groupId>net.sourceforge.tess4j</groupId>
     <artifactId>tess4j</artifactId
>
<version>3.2.1</version> </dependency>

程式碼示例,工程中,必須要有tessdata目錄,存放語言庫,如eng.traineddata,chi_sim.traineddata等。

public class TesseractExample {

    public static void main(String[] args) {
        File imageFile = new File("eurotext.tif");
        ITesseract instance = new
Tesseract(); // JNA Interface Mapping // ITesseract instance = new Tesseract1(); // JNA Direct Mapping try { String result = instance.doOCR(imageFile); System.out.println(result); } catch (TesseractException e) { System.err.println(e.getMessage()); } } }

工程目錄結構
這裡寫圖片描述

設定目錄。為什麼要這麼做呢?因為jar包中已經有個英文庫了,所以我們只需要再新增其它需要的庫就行,放在classpath下就ok。不需要在外層多一層了。

File imageFile = new File("C:\\random.png");
Tesseract instance = Tesseract.getInstance();

//In case you don't have your own tessdata, let it also be extracted for you
//這樣就能使用classpath目錄下的訓練庫了
File tessDataFolder = LoadLibs.extractTessResources("tessdata");

instance.setLanguage("eng");//英文庫識別數字比較準確

//Set the tessdata path
instance.setDatapath(tessDataFolder.getAbsolutePath());

try {
    String result = instance.doOCR(imageFile);
    System.out.println(result);
} catch (TesseractException e) {
    System.err.println(e.getMessage());
}

目錄結構
這裡寫圖片描述

當然也可以使用中文庫

instance.setLanguage("chi_sim");//中文庫識別中文

也可以只識別圖片中的某一部分,實踐發現,識別小區域,準確度會變高。

instance.setLanguage("eng");//英文庫識別數字比較準確
//提取金額
Rectangle rectangle = new Rectangle(366, y_Axis, 92, h);
String decrease = instance.doOCR(bufferedImage,rectangle)
        .replace(" ",".").replace(",","");

圖片二值化,水印也可以被去掉。

BufferedImage grayImage = ImageHelper.convertImageToBinary(ImageIO.read(imageFile));
ImageIO.write(grayImage, "jpg", new File("data/", "test2.jpg"));