这是一个问题,是Prepare complex image for OCR的后续行动。
我有一个带有数字的图像的canny边缘检测器的输出:
正如你所看到的,我有一个数字的各种边缘,这是由信用卡上的浮雕造成的。目标是拥有适合字符识别的实心数字。
这是尝试使用形状关闭操作“填充”数字,其中5x5结构元素为菱形:
我尝试了各种结构元素,但没有取得多大成功。您可以看到如何创建孔(数字9和0)以及形状是否扭曲(数字3)。
你能推荐一种更好的方法来填充结构,但不要将不同的数字粘在一起并保持原始形状吗?
然而,即使数字看起来很差并且在应用关闭操作后垂直分割数字,也可以获得良好的识别效果。
谢谢, 的Valentin
答案 0 :(得分:2)
我认为使用高级灰度二值化技术可以获得更好的效果,例如使用大内核的sauvola binarisation(我使用50x50)。该阈值滤波器考虑了灰度值的局部方差,并且对限制的变化不敏感。它还具有一些高通/低通属性,具体取决于设置。 请参阅JavaOCR项目中的实现:
http://sourceforge.net/projects/javaocr/
(PS:50x50内核不是问题 - 这个实现速度与内核大小无关)
更新,刚刚在信用卡上尝试了我的OCR拨号器,下面的binarisation结果:
反射表面产生很多噪音,但我认为这可以控制 进行一些预处理。
答案 1 :(得分:1)
你没有显示任何代码,所以我们不能帮助太多。以下是在尝试canny操作之前如何使用某些形态操作填充一些间隙而不更改大小的片段。
// OTSU, then binary threshold
Imgproc.threshold(colorImg, grayImg, 0, 255.0, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);
// Morphological reduction of noise, strengthen lines
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(7, 7));
Imgproc.dilate(grayImg, grayImg2, element);
Imgproc.erode(grayImg2, grayImg, element);
// Edge detection
Imgproc.Canny(grayImg, output, 50, 50);
但是,您应该查看card.io,其中包含信用卡。使用预图像处理读取浮雕符号非常困难,因为照明变化太大。你最好使用机器学习。