合并边缘和填充区域

时间:2012-03-21 12:31:38

标签: image-processing ocr edge-detection

这是一个问题,是Prepare complex image for OCR的后续行动。

我有一个带有数字的图像的canny边缘检测器的输出:

Canny edge image

正如你所看到的,我有一个数字的各种边缘,这是由信用卡上的浮雕造成的。目标是拥有适合字符识别的实心数字。

这是尝试使用形状关闭操作“填充”数字,其中5x5结构元素为菱形:

Morphological close operation

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

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

然而,即使数字看起来很差并且在应用关闭操作后垂直分割数字,也可以获得良好的识别效果。

谢谢, 的Valentin

2 个答案:

答案 0 :(得分:2)

enter image description here我认为使用高级灰度二值化技术可以获得更好的效果,例如使用大内核的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,其中包含信用卡。使用预图像处理读取浮雕符号非常困难,因为照明变化太大。你最好使用机器学习。