如何从光学形式中选择?

时间:2019-06-21 08:26:44

标签: python numpy opencv

我正在使用Python和OpenCV编写光学表格阅读器。我从光学形式中得到答案,但是我怎么知道填写了哪个选择呢?

这是一个示例图片:

enter image description here

到目前为止,这是我的代码:

image = cv2.imread('cevap1.png')
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(image,(1,1),0)
th2 = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 1)][1]][1]

1 个答案:

答案 0 :(得分:2)

假设答案的特征是大部分为实心圆,我将逐行求和所有像素值。然后,将结果矢量分成五个部分,每个部分代表一个选项的总和,然后对这些窗口中的强度值求平均。然后,具有最低平均强度的窗口就是选定​​的答案(深色=低强度值)。

我将给出一个示例代码片段,用于检测单个答案:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# Read image
img = cv2.imread('images/p4I1m.png', cv2.IMREAD_GRAYSCALE)

# Sum intensity values row-wise
sum = np.sum(img, axis=0)
plt.plot(sum)
plt.show()

# Set up answers
nAnswers = 5
answers = []

# Calculate mean intensity value for each answer option using a simple windowed, moving average with displacement
step = int(np.floor(sum.size / nAnswers))
for i in range(nAnswers):
    answers.append(np.mean(sum[i*step:(i+1)*step-1]))
print(answers)

# Find minimum mean intensity
answer = np.argmin(answers)
print(answer)

# TODO: Mapping from indices (0, 1, ...) to ('A', 'B', ...)

图的输出:

Plot

answers的输出:

[2225.0, 2227.5454545454545, 2252.909090909091, 2246.0, 1449.3636363636363]

answer的输出:

4

我跳过了从np.argmin到A,B等之类的映射。

现在,需要进一步改进:

  • 空答案:所有均值将相似。您需要某种阈值来检查“已填充”或“未填充”。
  • 多个答案:一个以上的平均值将明显大于另一个平均值。同样,阈值可能是区分“已填充”或“未填充”的更好选择。

按行求和应在一定程度上具有旋转稳定性。

希望有帮助!