从扫描图像中识别手写数字

3
我正在尝试读取扫描图像中的所有手写数字。我尝试使用 PIL 按像素逐个查找,裁剪子图像,然后通过神经网络进行处理,但是被裁剪的区域从未完全对齐,导致准确性不高。我还尝试使用 OpenCV 查找所有灰色正方形,然后裁剪图像并将其馈送到神经网络中,但我似乎无法使其找到所有正方形,甚至会错过一些;它会错过约30%的正方形。(我在使用 OpenCV 方面经验不足,所以可能出了点问题)。因此,我正在寻找这个问题的解决方案,欢迎提出任何建议,谢谢!

Pytesseract怎么样? - hypadr1v3
$x^2+y^2=z^2\int_{I=0}^{j=5}$ - Onyambu
1个回答

6

我将假设输入图片的名称为“squares.jpg”。

首先,导入所需的库并以RGB和灰度格式加载图像:

import cv2
import numpy as np

image = cv2.imread("squares.jpg", 1)
image_gray = cv2.imread("squares.jpg", 0)

然后,我们使用np.where()函数执行简单的操作来清除输入图像中的一些噪声:
image_gray = np.where(image_gray > 240, 255, image_gray)
image_gray = np.where(image_gray <= 240, 0, image_gray)

因为我们需要从图像中获取整个正方形区域。在执行自适应阈值方法之前,我们需要稍微模糊图像:

image_gray = cv2.blur(image_gray, (5, 5))
im_th = cv2.adaptiveThreshold(image_gray, 255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv2.THRESH_BINARY, 115, 1)

kernal = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
im_th = cv2.morphologyEx(im_th, cv2.MORPH_OPEN, kernal, iterations=3)

使用OpenCV中的轮廓检测来查找所有可能的区域:
_, contours, _ = cv2.findContours(im_th.copy(), cv2.RETR_LIST, 
                                  cv2.CHAIN_APPROX_SIMPLE)

contours = sorted(contours, key=cv2.contourArea, reverse=True)
contours.remove(contours[0])  #remove the biggest contour

最后,根据高度和宽度的比例,尝试找到潜在的正方形区域:
square_rects = []
square_areas = []
for i, cnt in enumerate(contours):
    (x, y, w, h) = cv2.boundingRect(cnt)
    ar = w / float(h)
    if 0.9 < ar < 1.1:
        square_rects.append(((x,y), (x+w, y+h)))
        square_areas.append(w*h)  #store area information

我们需要通过以下步骤从列表中删除任何太小的内容:
import statistics
median_size_limit= statistics.median(square_areas) * 0.8
square_rects = [rect for i, rect in enumerate(square_rects)
                    if square_areas[i] > median_size_limit]

你可以通过在原始图像上绘制所有矩形来直观地检查输出:
for rect in square_rects:
    cv2.rectangle(image, rect[0], rect[1], (0,255,0), 2)

cv2.imwrite("_output_image.png", image)

cv2.imshow("image", image)
cv2.waitKey()

你可以使用“square_rects”来定位所有的正方形,并从原始图像中裁剪它们。
以下是最终结果的预览。 Preview of Final Result 干杯!

不客气。祝你在神经网络训练中好运并愉快。 - Howard GENG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接