我正在开发一个项目,我必须开发OCR算法(我必须从Image中读取文本,然后将其转换为不同的语言)。所以我的第一个任务是从图像中获取文本。
完成第一项任务的步骤。
结果
检测分辨率和反转等图像特征。这样我们最终可以将其转换为拉直图像以进行进一步处理。 (完成了Image的旋转代码,但是无法检测到我们必须旋转Image的Image角度,所以仍然在角度检测部分工作)
线路检测和删除。需要此步骤来改进页面布局分析,以获得更好的下划线文本识别质量,检测表格等(决定在最后完成该部分)
页面布局分析。在此步骤中,我尝试识别图像中存在的文本区域。因此,只有那部分用于识别,并且遗漏了该区域的其余部分。
检测文字行和单词。在这里,我们还需要处理不同的字体大小和单词之间的小空格。
识别字符。这是OCR的主要算法;必须将每个字符的图像转换为适当的字符代码。有时,该算法会为不确定图像生成多个字符代码。例如,识别“I”字符的图像可以产生“I”,“|” “1”,“l”代码和最终字符代码将在稍后选择。
将结果保存为选定的输出格式,例如,可搜索的PDF,DOC,RTF,TXT。保存原始页面布局非常重要:列,字体,颜色,图片,背景等。
所以我在第6部分需要帮助。我已经完成了线路检测部分(从包含n行的段落中获取n个图像)但是在下一部分中卡住了获得单词和字符识别。如果您知道与OCR和字符识别部分相关的良好链接那么请在这里发帖。
对于字符识别,我想使用asprise(Java库)http://asprise.com/product/ocr/index.php?lang=java
答案 0 :(得分:18)
要检测旋转角度,请使用Hough transformation。
对于降噪,将具有相同颜色(相似颜色,使用容差阈值)的没有邻居(北,东,南或西)的任何像素替换为邻居的平均数。
搜索布局检测的垂直白色间隙。沿垂直间隙切片。对于每个切片,现在搜索水平间隙和切片。如果切片具有相同(相似)的高度,则您处于行级别。否则重复垂直/水平切片,直到你只剩下线。然后最后一步是垂直切片,给你单个字符(或某些情况下的连字)。长而窄或短而宽的切片是线条。
将字符切片与字符库进行比较。如果性能不是主要问题,请尝试查找不同字体库中的字符,直到您可以识别使用的字体。然后坚持使用该字体进行字符识别。
在原始图像中,用背景颜色替换每个字符,背景颜色是通过插入不属于字符每个像素的字符一部分的像素来确定的。如果有的话,这会为您提供背景图片。
答案 1 :(得分:5)
您应该使用自适应阈值而不是Otsu方法..我认为它会有所帮助http://www.csse.uwa.edu.au/~shafait/papers/Shafait-efficient-binarization-SPIE08.pdf 此方法将自动消除噪音。
答案 2 :(得分:3)
您可能需要查看Tesseract字符识别部分。
答案 3 :(得分:1)
您可以使用potrace来降低噪音 它将给定图像(bmp)矢量化并将其转换为svg,pdf和其他一些格式