[影象識別] java語言使用tess4j識別圖片中的文字
阿新 • • 發佈:2019-01-11
之所以寫下這篇文章,是因為在實踐中使用時,發現在識別整張圖時,準確率降低。尤其是中文,英文,字元,數字,水印都有的時候。出錯率很高。原先一直認為是水印的問題。結果將圖片二值化以後,沒有水印,識別準確度依舊很低。
偶然的情況,使用區域性區域識別,發現,效果很好,準確度大大提高。
然後體用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"));