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
Java 从图像中识别数字_Java_Image Processing_Ocr_Tesseract_Hough Transform - Fatal编程技术网

Java 从图像中识别数字

Java 从图像中识别数字,java,image-processing,ocr,tesseract,hough-transform,Java,Image Processing,Ocr,Tesseract,Hough Transform,我正试图编写一个应用程序来查找图像中的数字并将其相加 如何识别图像中的手写数字 在图片中有很多框,我需要在左边得到数字,然后将它们相加,得到总数。我怎样才能做到这一点 编辑:我对图像进行了java tesseract ocr,但没有得到任何正确的结果。我如何训练它 也 我做了一个边缘检测我得到了这个: 您很可能需要执行以下操作: 在整个页面上应用该算法,这将产生一系列页面部分 对于得到的每个部分,再次应用它。如果当前部分产生了2个元素,那么您应该处理与上面类似的矩形 完成后,可以使用OCR提取

我正试图编写一个应用程序来查找图像中的数字并将其相加

如何识别图像中的手写数字

在图片中有很多框,我需要在左边得到数字,然后将它们相加,得到总数。我怎样才能做到这一点

编辑:我对图像进行了java tesseract ocr,但没有得到任何正确的结果。我如何训练它

我做了一个边缘检测我得到了这个:


您很可能需要执行以下操作:

  • 在整个页面上应用该算法,这将产生一系列页面部分

  • 对于得到的每个部分,再次应用它。如果当前部分产生了2个元素,那么您应该处理与上面类似的矩形

  • 完成后,可以使用OCR提取数值

  • 在本例中,我建议您看看(OpenCV Java包装器),它应该允许您处理Hough变换部分。然后,您将需要类似于(Tesseract Java包装器)的东西,它应该允许您提取您要查找的数字

    另外,为了减少误报,您可能需要执行以下操作:

  • 如果您确定某些坐标永远不会包含您要查找的数据,请裁剪图像。这将为您提供一个较小的图片

  • 将图像更改为灰度可能是明智的(假设您使用的是彩色图像)。颜色会对OCR解析图像的能力产生负面影响

  • 编辑:根据您的评论,如下所示:

    +------------------------------+
    |                   +---+---+  |
    |                   |   |   |  |
    |                   +---+---+  |
    |                   +---+---+  |
    |                   |   |   |  |
    |                   +---+---+  |
    |                   +---+---+  |
    |                   |   |   |  |
    |                   +---+---+  |
    |                   +---+---+  |
    |                   |   |   |  |
    |                   +---+---+  |
    +------------------------------+
    
    您可以裁剪图像,以便删除没有相关数据的区域(左侧的部分),通过裁剪图像,您可以得到如下结果:

    +-------------+
    |+---+---+    |
    ||   |   |    | 
    |+---+---+    |
    |+---+---+    |
    ||   |   |    |
    |+---+---+    |
    |+---+---+    |
    ||   |   |    |
    |+---+---+    |
    |+---+---+    |
    ||   |   |    |
    |+---+---+    |
    +-------------+
    
    其想法是运行Hough变换,以便您可以获得包含矩形的页面段,如下所示:

    +---+---+    
    |   |   |     
    +---+---+ 
    
    然后再次应用Hough变换,得到两段,然后取左边的一段

    一旦你有了左边的部分,你就可以应用OCR了

    您可以尝试在手之前应用OCR,但最多,OCR将同时识别数字值,无论是手写的还是打印的,从我得到的信息来看,这不是您想要的


    此外,描绘矩形的额外线条可能会使OCR偏离轨道,并导致不良结果。

    放弃它。真正地作为一个人,我不能确定第三个字母是“1”还是“7”。人类的破译能力更强,因此计算机将无法破译。 “1”和“7”只是一个有问题的情况,“8”和“6”、“3”和“9”也很难破译/区分。您的错误报价将>10%。 如果所有的笔迹都来自同一个人,你可以尝试训练OCR,但即使在这种情况下,你仍然会有大约3%的错误。可能您的用例是特殊的,但是这个数量的错误通常禁止任何类型的自动处理。
    如果我真的需要自动化,我会研究Mechanical Turk。

    在大多数图像处理问题中,您希望尽可能利用现有的信息。根据这张图片,我们可以做出一些假设(可能更多):

  • 数字周围的方框是一致的
  • 右边的数字总是8(或提前知道)
  • 左边的数字总是一个数字
  • 左边的数字总是由同一个人手写的
  • 然后,我们可以使用这些假设来简化问题:

  • 您可以使用更简单的方法来查找数字(模板匹配)。当你有了匹配的坐标后,你可以创建一个子图像,减去模板,只留下你想要给OCR引擎的数字
  • 如果您知道预期的数字,那么您可以从其他来源获得这些数字,而不必冒OCR错误的风险。您甚至可以将8作为模板的一部分
  • 在此基础上,您可以大大减少词汇表(可能的OCR结果),从而提高OCR引擎的准确性。TesseractOCR有一个白名单设置来执行此操作(请参见?)
  • 手写体对于OCR引擎来说更难识别(它们用于打印字体)。但是,您可以训练OCR引擎识别作者的“字体”。(见附件)
  • 不过,要点是使用您可以使用的任何假设,将问题简化为更小、更简单的子问题。然后看看有哪些工具可以单独解决这些子问题


    假设你必须开始担心现实世界,也很难做出假设,比如,如果要扫描它,你就需要考虑“模板”或数字的歪斜或旋转。

    < P>神经网络是这类问题的典型方法。

    在此场景中,可以考虑每个手写数字的像素矩阵。如果你用与你想要识别的图像大小相同的图像训练神经网络,你可能会得到更好的结果

    你可以用不同的手写数字图像来训练神经网络。一旦经过训练,如果您将手写数字的图像传递给识别,它将返回最相似的数字


    当然,训练图像的质量是获得良好结果的关键因素。

    我建议将两个基本神经网络组件结合起来:

    • 感知器
    • 自组织映射(SOM)
    感知器是一个非常简单的神经网络组件。它接受多个输入并产生一个输出。您需要通过输入和输出对其进行训练。这是一个自我学习的组成部分

    在内部,它有一组权重因子,用于计算输出。这些重量因子在训练中得到完善。感知器的美妙之处在于
    38
    18
    78
    
    import cv2
    import pytesseract
    
    pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
    
    # Load image, grayscale, Otsu's threshold
    image = cv2.imread('1.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    
    # Detect horizontal lines
    horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,1))
    horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=1)
    
    # Detect vertical lines
    vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,25))
    vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=1)
    
    # Remove horizontal and vertical lines
    lines = cv2.bitwise_or(horizontal, vertical)
    result = cv2.bitwise_not(image, image, mask=lines)
    
    # Perform OCR with Pytesseract
    result = cv2.GaussianBlur(result, (3,3), 0)
    data = pytesseract.image_to_string(result, lang='eng', config='--psm 6')
    print(data)
    
    # Display
    cv2.imshow('thresh', thresh)
    cv2.imshow('horizontal', horizontal)
    cv2.imshow('vertical', vertical)
    cv2.imshow('lines', lines)
    cv2.imshow('result', result)
    cv2.waitKey()