首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >识别扫描图像上的手写数字

识别扫描图像上的手写数字
EN

Stack Overflow用户
提问于 2018-08-16 07:41:48
回答 1查看 677关注 0票数 3

我正在尝试读取扫描图像中的所有手写数字

我试着使用PIL逐个像素地查看,裁剪子图像,然后通过神经网络将它们输入,但被裁剪的区域从未完全对齐,导致许多不准确。

我也尝试过使用OpenCV来找到所有的灰色方块,然后裁剪图像并通过神经网络输入它们,但我似乎无法找到所有的,甚至只遗漏了几个;它将遗漏大约30%的方块。(我对OpenCV不是很有经验,所以我可能把事情搞砸了)

所以我正在为这个问题寻找一个潜在的想法/解决方案,所以任何建议都将不胜感激,提前谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-16 18:51:35

我假设输入图像的名称是"sqaures.jpg“

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

代码语言:javascript
复制
import cv2
import numpy as np

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

然后,我们执行一个简单的操作,使用np.where()函数从输入图像中清除一些噪声:

代码语言:javascript
复制
image_gray = np.where(image_gray > 240, 255, image_gray)
image_gray = np.where(image_gray <= 240, 0, image_gray)

因为我们想从图像中抓取整个正方形区域。在执行自适应阈值方法之前,我们需要对图像进行一点模糊:

代码语言:javascript
复制
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中使用轮廓检测来查找所有可能的区域:

代码语言:javascript
复制
_, 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

最后,尝试根据高度和宽度的比例找到潜在的正方形区域:

代码语言:javascript
复制
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

我们需要通过执行以下操作从列表中删除任何太小的内容:

代码语言:javascript
复制
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]

您可以通过在原始图像上绘制所有矩形来直观地检查输出:

代码语言:javascript
复制
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“来定位所有的正方形,并从原始图像中裁剪它们。

以下是最终结果的预览。

干杯。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51867834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档