使用 Python 识别答卷中的数字

问题描述

我正在尝试构建一个程序,该程序可以识别答卷上问题的分数,最后将分数相加得出学生获得的总分。我主要使用 OpenCV 进行图像识别。总结到目前为止我为尝试获得输出所做的工作:

  1. 首先,我过滤图像以从中提取红色实体。这样做的前提是假设教师会使用红笔为这些试卷评分。
  2. 接下来,我使用霍夫圆变换来查找图像中的圆。理想情况下,分配的标记应包含在一个圆圈内。这将有助于区分学生所写的数字,使我们能够确定页面上的哪些数字实际上是分数,而不是学生答案的一部分。
  3. 我使用 MNIST 数据集来训练手写数字识别模型。我还有一个使用 (https://www.kaggle.com/jcprogjava/handwritten-digits-dataset-not-in-mnist) 数据集训练的辅助模型。我的想法是让多个模型预测这个数字,然后取出现次数最多的数字,以帮助提高准确性。
  4. 在将图像传递给模型之前,我将其调整为 28x28 图像,并应用 cv2.equalizeHist() 来增加对比度。我这样做是为了解决调整图像大小时分辨率的损失。

我目前面临的问题是:

  1. 不同的图片具有不同的红色圆圈和数字值,具体取决于照明、使用的笔等。无论如何,我如何确保我设法获得红色文本?
  2. 霍夫圆变换似乎不一致。有时,当我运行代码时,我会得到上次不存在的随机圆圈。我也很难决定要使用哪些 param1 和 param2 值。
  3. 最后,模型预测通常很好。我觉得这可能是由于圆圈本身存在于我输入到模型中的图像中。当圆圈可能有不同的大小时,我该如何摆脱它?我试图裁剪圆,以便只得到圆周内的内容,但由于不规则的圆形形状而得到了不同的结果。

任何帮助将不胜感激,我是机器学习和 stackoverflow 的新手,所以请原谅我犯的任何错误。我也乐于接受新的方法来尝试获得分数(如果有的话)。

代码

#Red Extraction
t = 40 #threshold acceptance
red_thresh = cv2.inRange(img,np.array([123 - t,57 - t,57 - t]),np.array([123 + t,57 + t,57 + t]))
#Applying Hough Circle Transform
#Tried Canny Edge Detection,Couldn't get it to work.
#img = cv2.Canny(img,150,200);
#plt.imshow(img,cmap="gray")
img = cv2.medianBlur(img,5)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,200,param1=100,param2=30,minRadius=100,maxRadius=300)
#grey is the cropped circle from the hough transform
ret,thresh = cv2.threshold(grey.copy(),220,255,cv2.THRESH_BINARY)
#contours,_ = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
preprocessed_digits = []
x,y,w,h = cv2.boundingRect(grey)

# Creating a rectangle around the digit in the original image (for displaying the digits fetched via contours)
cv2.rectangle(image,(x,y),(x+w,y+h),color=(0,0),thickness=2)

# Cropping out the digit from the image corresponding to the current contours in the for loop
digit = thresh[y:y+h-10,x:x+w-10]
plt.imshow(grey,cmap="gray")
plt.show()
# Resizing that digit to (18,18)
resized_digit =  imutils.resize(grey,width=28,height=28)

# Adding the preprocessed digit to the list of preprocessed digits
preprocessed_digits.append(resized_digit)

The original image

The number after cropping and resizing

The number after cv2.equalizeHist()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...