通过 Python 检测并提取扫描表格中的标记区域
开源免费基于 Python 的 OMR 引擎,支持 OMR 处理。它支持处理 OMR 表格、基于模板的检测以及多页表单的处理等。
什么是 PyOMR 库?
光学标记识别(OMR)是一项强大的技术,用于从调查、测试和选票等文档中捕获人工标记的数据。虽然已有商业 OMR 解决方案,但寻找免费开源替代方案的开发者可以使用 PyOMR,这是一款专为 OMR 处理设计的 Python 库。由 pattyjogal 开发,PyOMR 使软件开发者能够通过简单的 Python 代码和标准图像处理技术检测扫描表单上的标记气泡。它支持检测并提取扫描纸张上的标记区域,处理多项选择表单、调查和评估,并可为各种使用场景定制 OMR 模板。
PyOMR 是一个基于 Python 的 OMR 引擎,旨在检测预定义表单(如选择题答卷或调查问卷)上的填涂标记。它利用 OpenCV 等库进行图像处理,并提供基于模板的系统来定义表单上预期的标记区域。无论您是构建评分系统的软件开发者、自动化试卷评估的教师,还是收集调查数据的组织,PyOMR 都可以让您直接在应用中嵌入 OMR 功能。凭借模板化方法、OpenCV 驱动的检测以及完整的脚本化能力,它是希望在不依赖第三方服务的情况下构建自动表单处理工具的开发者的理想选择。
PyOMR 入门指南
推荐的 PyOMR 库安装方式是通过 GitHub。请使用以下命令进行顺利安装。
通过 GitHub 安装 PyOMR 库
git clone https://github.com/pattyjogal/pyomr.git
cd pyomr
通过 GitHub 安装受支持的库
pip install opencv-python numpy 您可以直接从 GitHub 下载该库。
使用 Python 的自动图像预处理
• 开源的 PyOMR 库已完整支持在 Python 应用程序中进行自动图像处理。该库内置了用于校正倾斜扫描的去倾斜(Deskewing)功能、用于转换为黑白以提升标记检测的阈值化(Thresholding)功能,以及用于在低质量扫描中提高准确性的噪声去除功能。此外,它还能处理扫描表单中的常见问题,如光照不均、对比度低或轻微错位。以下代码示例展示了如何在 Python 应用程序中处理图像。
如何在 Python 应用中处理图像?
from omr import omr_engine
# File paths
template_path = "config.json"
image_path = "answer_sheet.jpg"
# Run the OMR process
results = omr_engine.process_image(image_path, template_path)
# Output the results
for i, response in enumerate(results, 1):
print(f"Q{i}: {response if response else 'No mark detected'}")
使用 Python 的基于模板的检测
PyOMR 使用 JSON 模板来定义答题卡的布局。包括题目数量、每题选项数、首个气泡的起始位置、行列间距以及气泡尺寸。此设计使系统在不同布局之间高度灵活且可复用。下面是一个简单示例,展示如何使用 Python 库创建 JSON 模板以指定气泡位置。
如何创建 JSON 模板以指定气泡位置并通过 Python 加载?
{
"bubbles": [
{"question": "Q1", "options": ["A", "B", "C", "D"], "coords": [100, 150, 30, 30]},
{"question": "Q2", "options": ["A", "B", "C", "D"], "coords": [100, 200, 30, 30]}
],
"reference_marks": [[50, 50], [500, 50], [50, 700]]
}
#Load template
omr.load_template("template.json")
使用 Python 处理多页表单
PyOMR 库已包含对在 Python 应用程序中处理多页表单的支持。无论是处理单页答题纸还是多页调查问卷,PyOMR 都可以配置为适应不同的布局。建议对多页表单分别处理每一页:以下代码示例展示了软件开发者如何在 Python 应用程序中处理多页表单。
如何使用 Python 库处理多页表单?
# for multi-page forms, process each page separately:
for page in omr.multi_page_scan("multi_page_form.pdf"):
page.preprocess()
answers = page.read_answers()
print(answers)
噪声处理与预处理
开源的 PyOMR 库为 Python 应用程序提供了完整的图像预处理和噪声处理支持。该库包括灰度转换、阈值化和轮廓检测等图像预处理功能,以可靠地识别标记,即使在噪声扫描或印刷不完美的情况下也能正常工作。