之所以写下这篇文章,是因为在实践中使用时,发现在识别整张图时,准确率降低。尤其是中文,英文,字符,数字,水印都有的时候。出错率很高。原先一直认为是水印的问题。结果将图片二值化以后,没有水印,识别准确度依旧很低。
偶然的情况,使用局部区域识别,发现,效果很好,准确度大大提高。
然后体用api切换中文,英文识别库,很大程度的提高了准确率。
maven依赖
net.sourceforge.tess4jgroupId>
tess4jartifactId>
3.2.1version>
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"));
参考
* http://tess4j.sourceforge.net/codesample.html
* https://github.com/nguyenq/tess4j/issues/9
tessdata来源
* https://github.com/tesseract-ocr/tessdata/tree/3.04.00