2012-03-21 139 views
2

这是一个后续的Prepare complex image for OCR合并边缘和填充区域

我有一个形象的Canny边缘检测与数字输出:

Canny edge image

正如你所看到的,我有一个数字不同的边缘,从信用卡上的浮雕而导致。目标将是具有固体数字,这适合于字符识别。

这是一种尝试以“填充”使用形态关闭操作与菱形形状的5x5的结构化元素的数字:

Morphological close operation

我尝试过各种结构元素,但是没有多大成功。您可以看到如何创建孔(数字9和0)以及形状被扭曲(数字3)。

你能否推荐一种更好的方法来填充结构,但没有将不同的数字粘合在一起并保持原始形状?

然而,即使在应用关闭操作后数字很差并且数字垂直分开,也已经有了很好的识别结果。

感谢, 瓦伦丁

+0

瓦伦丁,我正在处理与您一样的问题(使用OCR读取信用卡)。我已经使用tesseract在手动预处理后读取图像取得了一些成功,但我仍在努力使这些处理自动化。 我在想你最终解决了什么问题?你的代码是否可用?我很乐意与你比较笔记。 – bjmc 2012-11-02 21:13:03

+0

你可以给我发一封邮件(www.valentin-manthei。如果你想的话)。我通过使用模板/特征匹配技术和附加标准来改进结果,从而实现了OCR。尽管如此,预处理是最糟糕的部分。整个过滤器链可动态调整参数,现在最终可以完全扫描一些信用卡号码,但只能在良好环境下(闪电,分辨率)进行扫描。 – valentin 2012-11-05 14:32:48

回答

2

enter image description here我认为,你可以使用高级灰度二值化技术,达到更好的效果,就像大内核(我用50×50)sauvola二值化。该阈值滤波器考虑了灰度值的局部变化,并且对限幅变化不敏感。它也有一些高通/低通属性取决于设置。 见实施JavaOCR项目:

http://sourceforge.net/projects/javaocr/

(PS:50×50内核是没有问题的 - 这个实现速度内核大小无关)

更新,只是试图信用卡,二值化在我的OCR拨号结果如下:

反射表面会产生很多噪音,但我认为这可以通过一些更多的预处理来管理 。

+0

非常感谢您的意见。这是40x40内核和sauvola算法的结果:http://i.imgur.com/QWlPc.jpg(虽然我没有在JavaOCR中找到sauvola源代码)。结果非常嘈杂,但可能会用高斯模糊进行优化。但是,我不确定这是如何解决部分数字的问题,这不适用于字符识别(我只能用所有方法得到轮廓)。 – valentin 2012-03-21 14:24:51

+0

由于sauvola使用Mx和widnow上的方差,它已经具有低通滤波器属性。但对银反射塑料表面来说显然还不够。在这个示例中,我的切片代码无法提取字形,但我敢说,即使图像失真,我在JavaOCR中使用的基于概率的识别对于信用卡号字体也会很好地工作 – 2012-03-21 17:58:12

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,它读取信用卡。预处理图像处理非常困难,因为光照变化非常大。你最好使用机器学习。