Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 合并边和填充区域_Image Processing_Ocr_Edge Detection - Fatal编程技术网

Image processing 合并边和填充区域

Image processing 合并边和填充区域,image-processing,ocr,edge-detection,Image Processing,Ocr,Edge Detection,这是一个后续的问题 我有一个canny边缘检测器的输出,图像带有数字: 正如你所看到的,我有一个数字的各种边缘,这是由信用卡上的浮雕造成的。目标是要有适合字符识别的实数 这是一种尝试,使用菱形5x5结构元素的形态闭合操作“填充”数字: 我尝试了各种结构元素,但没有多大成功。您可以看到孔是如何创建的(数字9和0)和形状是如何扭曲的(数字3) 你能推荐一种更好的方法来填充结构,但不需要将不同的数字粘在一起并保持原始形状吗 然而,即使使用外观不佳的数字并在应用闭合操作后垂直分割数字,也已经可以获得

这是一个后续的问题

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

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

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

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

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

然而,即使使用外观不佳的数字并在应用闭合操作后垂直分割数字,也已经可以获得良好的识别结果

谢谢,
Valentin

我认为使用高级灰度二值化技术可以获得更好的结果,比如使用大内核的sauvola二值化(我使用50x50)。该阈值滤波器考虑了灰度值的局部方差,对灰度变化不敏感。它还具有一些高通/低通特性,具体取决于设置。 请参见JavaOCR项目中的实现:

(PS:50x50内核不是问题-此实现速度与内核大小无关)

更新,刚刚在信用卡上试用了我的OCR拨号器,二值化结果如下:

反射面会产生很多噪音,但我认为这是可以控制的
再进行一些预处理

您没有显示任何代码,因此我们无法提供太多帮助。下面是一个片段,介绍如何在尝试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);

然而,你应该看看,上面写着信用卡。读取浮雕符号是非常困难的预图像处理,因为照明变化如此之大。您最好使用机器学习。

非常感谢您的意见。这是40x40内核和sauvola算法的结果:(不过,我在JavaOCR中没有找到sauvola源代码)。结果是非常嘈杂,但这可能是优化与应用高斯模糊。然而,我不确定这是如何解决不适合字符识别的部分数字的问题的(我只获得所有方法的轮廓)。由于sauvola在widnow上使用Mx和方差,它已经具有低通滤波器特性。但显然,对于银反射塑料表面来说,LZ还不够。在这个示例中,我的切片代码无法提取字形,但我敢说,我在JavaOCR中使用的基于概率的识别在信用卡号码字体上会很好地工作,即使图像被扭曲Valentin,我正在处理与您相同的问题(使用OCR阅读信用卡)。我在手动预处理后使用tesseract读取图像方面取得了一些成功,但我仍在努力实现该过程的自动化。我想知道你最终选择了什么解决方案?你的代码在任何地方都可用吗?我很想和你比较一下。如果你愿意,你可以给我发封邮件(www.valentin-manthei.de)。我使用模板/特征匹配技术和其他标准实现了OCR,以改进结果。不过,预处理是最糟糕的部分。一个动态调整其参数的整个过滤链现在最终能够完全扫描一些信用卡号,但只有在良好的情况下(闪电、分辨率)。