Java 从图像中识别数字
我正试图编写一个应用程序来查找图像中的数字并将其相加 如何识别图像中的手写数字 在图片中有很多框,我需要在左边得到数字,然后将它们相加,得到总数。我怎样才能做到这一点 编辑:我对图像进行了java tesseract ocr,但没有得到任何正确的结果。我如何训练它 也 我做了一个边缘检测我得到了这个:Java 从图像中识别数字,java,image-processing,ocr,tesseract,hough-transform,Java,Image Processing,Ocr,Tesseract,Hough Transform,我正试图编写一个应用程序来查找图像中的数字并将其相加 如何识别图像中的手写数字 在图片中有很多框,我需要在左边得到数字,然后将它们相加,得到总数。我怎样才能做到这一点 编辑:我对图像进行了java tesseract ocr,但没有得到任何正确的结果。我如何训练它 也 我做了一个边缘检测我得到了这个: 您很可能需要执行以下操作: 在整个页面上应用该算法,这将产生一系列页面部分 对于得到的每个部分,再次应用它。如果当前部分产生了2个元素,那么您应该处理与上面类似的矩形 完成后,可以使用OCR提取
您很可能需要执行以下操作:
+------------------------------+
| +---+---+ |
| | | | |
| +---+---+ |
| +---+---+ |
| | | | |
| +---+---+ |
| +---+---+ |
| | | | |
| +---+---+ |
| +---+---+ |
| | | | |
| +---+---+ |
+------------------------------+
您可以裁剪图像,以便删除没有相关数据的区域(左侧的部分),通过裁剪图像,您可以得到如下结果:
+-------------+
|+---+---+ |
|| | | |
|+---+---+ |
|+---+---+ |
|| | | |
|+---+---+ |
|+---+---+ |
|| | | |
|+---+---+ |
|+---+---+ |
|| | | |
|+---+---+ |
+-------------+
其想法是运行Hough变换,以便您可以获得包含矩形的页面段,如下所示:
+---+---+
| | |
+---+---+
然后再次应用Hough变换,得到两段,然后取左边的一段
一旦你有了左边的部分,你就可以应用OCR了
您可以尝试在手之前应用OCR,但最多,OCR将同时识别数字值,无论是手写的还是打印的,从我得到的信息来看,这不是您想要的
此外,描绘矩形的额外线条可能会使OCR偏离轨道,并导致不良结果。放弃它。真正地作为一个人,我不能确定第三个字母是“1”还是“7”。人类的破译能力更强,因此计算机将无法破译。 “1”和“7”只是一个有问题的情况,“8”和“6”、“3”和“9”也很难破译/区分。您的错误报价将>10%。 如果所有的笔迹都来自同一个人,你可以尝试训练OCR,但即使在这种情况下,你仍然会有大约3%的错误。可能您的用例是特殊的,但是这个数量的错误通常禁止任何类型的自动处理。
如果我真的需要自动化,我会研究Mechanical Turk。在大多数图像处理问题中,您希望尽可能利用现有的信息。根据这张图片,我们可以做出一些假设(可能更多):
假设你必须开始担心现实世界,也很难做出假设,比如,如果要扫描它,你就需要考虑“模板”或数字的歪斜或旋转。 < 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()