基于Python CV2的OMR开发:矩形检测遭竖线干扰问题求助
OMR答题卡矩形轮廓检测问题解决思路
针对答题卡中贯穿垂直黑线导致轮廓合并的问题,可从以下几个方向处理:
先去除干扰垂直黑线:用形态学开运算,选择水平方向的结构元素,针对性消除细竖线。开运算先腐蚀后膨胀,能保留矩形的水平/垂直边框,同时去掉细长的垂直干扰线。
# 创建水平结构元素(宽度远大于高度,适配竖线粗细) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 1)) # 对Canny结果做开运算处理 processed_img = cv2.morphologyEx(canny_img, cv2.MORPH_OPEN, kernel)优化边缘检测参数:调整高斯模糊和Canny阈值,弱化竖线的边缘响应。加大模糊核可让细竖线变得模糊,调整Canny高低阈值能过滤掉竖线的弱边缘,同时保留矩形的清晰边缘。
# 加大高斯模糊核尺寸,弱化细竖线细节 blurred = cv2.GaussianBlur(gray_img, (5, 5), 0) # 调整Canny阈值,按需调整数值适配你的答题卡 canny_img = cv2.Canny(blurred, 30, 150)轮廓后筛选目标矩形:使用层级轮廓检测模式(
cv2.RETR_TREE)获取所有轮廓,再通过面积、宽高比筛选出符合选项框特征的轮廓。即使仍有大轮廓,也能从中提取出内部的矩形子轮廓。# 检测包含层级信息的所有轮廓 contours, hierarchy = cv2.findContours(processed_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) target_contours = [] for cnt in contours: area = cv2.contourArea(cnt) x, y, w, h = cv2.boundingRect(cnt) aspect_ratio = w / h # 根据你的选项框实际尺寸调整面积和宽高比范围 if 200 < area < 1000 and 0.8 < aspect_ratio < 1.2: target_contours.append(cnt)固定位置竖线直接消除:如果竖线位置固定,可直接将竖线所在列的像素置为背景色(白色),从根源上消除干扰。
# 假设竖线位于x=198-203和x=398-403列,根据实际坐标调整 gray_img[:, 198:203] = 255 gray_img[:, 398:403] = 255
内容的提问来源于stack exchange,提问作者guy blau
相关产品推荐
相关产品推荐

