首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OMR:计算实心圆

OMR:计算实心圆
EN

Stack Overflow用户
提问于 2017-04-06 16:49:52
回答 1查看 1.6K关注 0票数 1

我正在为试卷实施OMR系统。但在确定实心圆时会遇到问题。我已经成功地获得了这些感兴趣的灰度区域。

问题是:

  • 二进制阈值(自适应和固定)和计数非零像素给出了很多错误,因为一个圆圈中的字母和移动相机制作的照片的亮度不同。
  • 也尝试了本survey中描述的技术,使用圆圈的平均灰度值来标记它是否已填充,但图像的亮度并不均匀,因为当人们拍摄照片时,不同的光源是他们的相机和我得到了很多错误的results.
  • People也不遵循规则,如我们填充整个圆圈,算法也需要在这种情况下是稳健的。

Sample images

我已经有大约10 GB的样本,所以机器学习或其他统计方法可能会有用。

有人知道将圆分类为实心圆的其他方法吗?

EN

回答 1

Stack Overflow用户

发布于 2017-04-07 01:15:20

由于这不是一个直接的问题,因此需要进行大量的调整才能使其健壮。但我想建议你一个很好的起点。您可以尝试使用它,并尝试使其工作。

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

image_ori = cv2.imread("circle_opt.png")

lower_bound = np.array([0, 0, 0])
upper_bound = np.array([255, 255, 195])
image = image_ori

mask = cv2.inRange(image_ori, lower_bound, upper_bound)
masked_red = cv2.bitwise_and(image, image, mask=mask)

kernel = np.ones((3,3),np.uint8)
closing = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)[0]
contours.sort(key=lambda x:cv2.boundingRect(x)[0])

print len(contours)
for c in contours:
    (x,y),r = cv2.minEnclosingCircle(c)
    center = (int(x),int(y))
    r = int(r)
    if 10 <= r <= 15:
        cv2.circle(image,center,r,(0,255,0),2)

# cv2.imwrite('omr_processed.png', image_ori)
cv2.imshow("original",image_ori)
cv2.waitKey(0)

我从我在你分享的图像上的代码得到的结果是

您可以将阈值应用于这些绿色圆圈斑块,然后计算非零,以获得圆圈是否被标记。您可以尝试使用lower和upper_bound来使解决方案更健壮。

希望这能有所帮助!祝你在解决问题时好运:)

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

https://stackoverflow.com/questions/43250212

复制
相关文章

相似问题

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