数字 OCR。用胡不变矩分类

Posted

技术标签:

【中文标题】数字 OCR。用胡不变矩分类【英文标题】:OCR of digits. Classify with Hu Invariant Moments 【发布时间】:2014-04-22 14:28:46 【问题描述】:

我正在对多位数字的图片进行 OCR。我隔离数字,计算每个数字的七胡不变矩,并存储数据。因此,当我对每个数字都有足够的数据时,我想将一个传入的数字与我已经拥有的数据相匹配。

我首先计算数字的七个 hu 矩,然后检查所有数据并检查其他 hu 矩向量是否与我新到达的数字相匹配。

对于数字 6,七个 hu 时刻可能如下所示:

0.0015019597635929924
8.216737738246056E-7
2.0375639403591246E-10
7.83546684255912E-11
7.317864741055554E-21
3.429093590309372E-14
-6.668347984552349E-21

其他六人也很相似。

数字1可能有这样的数据:

0.0013343457573374317
7.801615619419164E-7
1.2084360881640018E-10
2.0011222038541843E-10
3.0737764628109555E-20
1.7596117047839112E-13
4.854579634937481E-21

因此,如果我收到 1 的 hu 时刻,我希望它与 1 数据最匹配。我应该如何解决这个问题,实现它的最佳方法是什么?我正在使用 JavaOpenCV 来计算矩。

编辑:另外一个问题:现在我刚刚用每个数字周围的边界框隔离了每个数字,并计算了该图像的 hu 矩。计算数字本身周围轮廓的 hu 矩是否更准确?如果是这样,有人愿意解释这种方法吗? 只需这样做:

    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();    
   Imgproc.findContours(image, contours, new Mat(),Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);
    Moments mom = new Moments();
    mom = Imgproc.moments(contours.get(0), false);
    Mat hu = new Mat();
    Imgproc.HuMoments(mom, hu);

我有时会以零值作为 hu 时刻。 contours.get(0) 是传递给矩计算的正确参数吗?

EDIT2: 很抱歉进行了编辑,但从我现在对自己的尝试来看,我计算的 hu 不变矩太相似了。我无法以聪明的方式区分它们。可能我现在计算它们的方式太“粗糙”了。我实际上只是在每个数字图像中找到最大的计数,即每个数字的边界框图像,并从中计算 hu 矩。

【问题讨论】:

【参考方案1】:

首先你必须使用或构建一个大型数据库,这个网站有很多数据:machine learning data set collection

其次,最好的办法是使用神经网络分类器或决策树的提升,在我的情况下,我使用 C4.5 算法和这个数据库Pen-Based Recognition of Handwritten Digits Data Set ,它给我的比率是 99%,这几乎是.我认为所有这些算法都已经在 boost 库中实现了。 对于 java 试试weka

【讨论】:

以上是关于数字 OCR。用胡不变矩分类的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程200篇233. 区域特征之矩不变量

基于Matlab不变矩的数字验证码识别

图像识别基于不变矩的数字验证码识别含GUI界面

图像识别基于不变矩的数字验证码识别含GUI界面

图像识别基于不变矩的数字验证码识别含GUI界面

图像识别基于不变矩的数字验证码识别含GUI界面