一、需求分析
对天猫平台的企业信息采集下来进行结构化处理,提取出文字信息后汇总进Excel作为交付文件。
主要的功能设计如下:
1、程序能够自动读取企业工商信息图片所在的文件夹路径,并从文件夹路径中顺序取出图片进行识别,最终的识别结果以一份汇总的Excel交付。
2、因为天猫平台公示的图片内容没有固定格式,所以需要程序能匹配不同格式的图片内容提取信息。
3、能够提取出图片中的企业注册号、企业名称数据项,企业注册号、企业名称数据项要进行分析处理。
4、识别准确率需要保证在95%以上。
5、识别速度保持在60秒识别50张图片。
二、本程序处理图片方面的关键模块
1、对图片进行切割:
要求识别的文字信息“企业名称”“企业注册号”位于整个图片的其中一部分,把剩余部分切除,只留下关键信息部分,不但可以提高识别速度,还可提升识别率。
2、在进行图片的二值化时,有两种方式:
(1)图片为彩色时,宜找到每个像素点合适的灰色度,因为每个像素点的灰色度不同程度上受到周边像素加权影响,从而影响整个图片的识别率。比如本像素点加上周围8个灰度值再除以9,算出其相对灰度值。
(2)图片为黑白色时,宜采用max-min方法对图片进行二值化。
针对本程序识别的图片的黑白色对比明显,故采用max-min方法进行二值化。
private static File binaryImage(File orcFile) throws IOException {
// 获取图片的BufferedImage对象
BufferedImage bi = ImageIO.read(orcFile);
int h = bi.getHeight();// 获取图片的高
int w = bi.getWidth();// 获取图片的宽
BufferedImage nbi = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);
// 设置合适的经验阈值,对二值化的识别效果起重要作用
int threshold = new Color(20, 20, 20).getRGB();// 阈值对应的颜色位于黑色文字和偏黑色背景颜色区间即可
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
// 二值化處理
if (bi.getRGB(x, y) > threshold) {
int max = new Color(255, 255, 255).getRGB();
nbi.setRGB(x, y, max);
} else {
int min = new Color(0, 0, 0).getRGB();
nbi.setRGB(x, y, min);
}
}
}
// 将二值化处理后的图片放于D:\\orc_cut_binary下
String orcFileName = orcFile.getName();
String binaryDir = "D:\\orc_cut_binary";
File dir = new File(binaryDir);
// 存储目录不存在,则创建目录
if (!dir.exists()) {
dir.mkdirs();
}
File binaryFile = new File(binaryDir + "/" + orcFileName.substring(0, orcFileName.indexOf(".")) + "binary.png");
ImageIO.write(nbi, "png", binaryFile);
return binaryFile;
}
3、在选取二值化中的经验阈值,我们有以下思路:
(1)二值化微分计算阈值
(2)二值化类卷积的对梯度变化加强得到阈值
对24位位图进行中值滤波会改变RGB各分量的值,所以图片的颜色会发生变化,但对于8位的位图,由于都是灰度的颜色,所以变化并不明显,而且滤波的窗口选的越大,对应的滤波效果的模糊度也会上升。
4、增加图片的亮度:
增加图片亮度可以使有些彩色图片的识别率大大增加,本程序别的图片为黑白照片,增加图片亮度提升的识别率并不乐观。
5、对图片的边缘进行尖锐化处理:
锐化可以快速调整图像边缘细节的对比度,并在边缘的两侧生成一条亮线一条暗线,使画面整体更加清晰。对于高分辨率的输出,通常锐化效果在屏幕上显示比印刷出来的更明显。在图片的Alpha值保持不变的情况下,本程序前期也进行了锐化处理,但效果并不明显,有时识别率甚至可能低于未锐化处理的图片。
6、对图片进行平滑缩放:
有时很多图片本身无法很好的被识别,但当放大适当倍数时,就可增强识别率,但这个“适当倍数”很难把控,它受诸多硬件因素影响,比如电脑配置、针式打印机打印连贯性差等问题。
来源:CSDN
作者:javastart
链接:https://blog.csdn.net/javastart/article/details/104089482