在解决一个OMR问题时,我不能完全正确地检测出所有标记的答案。这是我的输入表。
Input Image
我的代码来二值化图像。
import cv2
image = cv2.imread('input.png')
img = cv2.GaussianBlur(image,(5,5),0)
res, img = cv2.threshold(img, 60, 255, cv2.THRESH_BINARY)
img = 255 - img
cv2.imwrite('output.png',img)
我得到的结果。
Output generated
我已经改变了高斯模糊和阈值参数如下。
img = cv2.GaussianBlur(image,(7,7),0)
res, img = cv2.threshold(img, 90, 255, cv2.THRESH_BINARY)
我在此更改后得到的结果。
Result after changing Parameters
我期望的结果应该如下所示。Desired Result
下面是我的完整代码来检测答案。
def solve(img,n_row = 50):
height, width, channels = img.shape
n_col = 4
xShift = int(width/n_col)
yShift = int(height/n_row)
img = cv2.resize(img, (n_col * xShift, n_row*yShift))
img = cv2.GaussianBlur(img,(5,5),0)
res, img = cv2.threshold(img, 60, 255, cv2.THRESH_BINARY)
img = 255 - img
for row in range(0, n_row):
tmp_img = img [row*yShift + 5:(row+1)*yShift - 5,]
area_sum = []
for col in range(n_col):
area_sum.append(np.sum(tmp_img[1:,col*xShift :(col+1)*xShift]))
y = str(area_sum > np.median(area_sum) * 1)
result.append(area_sum > np.median(area_sum) * 5)
如果有人能帮我解决这个问题,我将非常感谢。
回答建议:
我怎样才能检查出每个外接矩形内的白色像素数,并只保留那些面积大于最小值的外接矩形/轮廓。
inputImg= cv2.imread('input.jpg')
img = cv2.cvtColor(inputImg, cv2.COLOR_BGR2GRAY)
mask = np.zeros(img.shape[:2], dtype=img.dtype)
ret, otsu_threshold = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
contours, hierarchy = cv2.findContours(otsu_threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
x,y,w,h = cv2.boundingRect(c)
if cv2.contourArea(c) > 1500:
cv2.rectangle(otsu_threshold, (x, y), (x+w, y+h), (0,255,0), 2)
cv2.imshow('Otsu', otsu_threshold)
cv2.waitKey(0)
3条答案
按热度按时间8hhllhi21#
下面是在Python/OpenCV中实现这一点的一种方法。
输入:
阈值图像:
形态图像:
结果:
答案:
这个解决方案可能对墨水的颜色不太敏感。只需要使用cv2.inRange()在白色上设置阈值,然后反转。
阈值图像:
形态图像:
结果:
中心:
rjee0c152#
标记的气泡是蓝色墨水,其是对应LAB颜色空间的B通道中的主色。
了解更多关于LAB空间go through this page的信息
下面的代码段显示了它在这里的用处:
请注意下面带阴影的气泡是多么明显:
ajsxfq5m3#
你可以试试这个,它把二进制图像分割成单元格
并进行比较以找出行中哪个单元具有最多白色像素
https://dontrepeatyourself.org/post/bubble-sheet-multiple-choice-test-with-opencv-and-python/
但您必须按照测验表单更改代码