opencv_python答题卡自动判卷

opencv_python答题卡⾃动判卷
opencv_python答题卡⾃动判卷
1. 设定答题卡模板
图像为答题卡的答题区域,⿊⾊边框是为了能够在各种环境中轻易的检测,左部分和上部分的⿊⾊矩形,是为能够定位到答题选项的坐标⽽设置,同时题⽬数量为20×3共60道选择题,在进⾏批改试卷之前,需要⼿动输⼊该次考试的正确答案作为模板来对识别的内容进⾏⽐较判分。
2. 读取答题卡图像并对图像进⾏灰度化处理
# 最⼤值法求图像灰度值
def graying(image):
h, w = image.shape[0], image.shape[1]
gray = np.zeros((h, w), np.uint8)
for i in range(h):
for j in range(w):
gray[i, j]=max(image[i,j][0], image[i,j][1], image[i,j][2])
return gray
3 ⾼斯模糊图像去噪点
gray = cv2.GaussianBlur(gray,(3,3),0)
4使⽤⼤津法⼆值分割图像
经过上⼀步操作后,答题卡的前背景分明,已经能够轻易将标识矩阵和答题区域涂改信息和背景分离开来,接下来需要将图像的标识矩阵和答题区域的涂改信息提取出来,需要进⼀步规划数字图像信息,⼆值化图像能使图像的数据量⼤⼤减少,既保留原有的数字信息,⼜能将⽆⽤的数据舍去,将原本数值范围为0-255的图像信息分割成像素值为0或255的⼆值图像,在这⾥0值代表背景,⽆⽤且不需要处理的信息,255表⽰⽬标信息(标识矩阵和答题区域的涂改信息),其算法原理⾮常简单,图像中像素值⼤于阈值时为255,⼩于阈值时为0。在⼆值化时,需要确定⼀个阈值,⽽这个阈值⼈为来定义是⽆法随着环境变换随时处于最优状态,在这⾥我们使⽤1979年由学者⼤津提出的对图像分割的⾼效算法来处理。⼤津法算法原理:
有假设如下:
u: 图像像素值平均值
g: 图像类间⽅差
w0: 图像背景像素点数占图像的⽐例内孔撑圆涨紧夹具
u0: 图像背景像素点的平均值
w1: 图像前景像素点数占图像的⽐例
智能停车场系统管理u1: 图像前景像素点的平均值
算法公式为:
将第⼀个公式代⼊第⼆个得:
5使⽤开运算去噪点
此时已经得到较为完美的预处理图,但是不难发现,我们答题卡有⼀⼩块⼲扰像素。在实际情况中,这种⼲扰信息是有可能出现的,且⼤⼩与清晰度并没有固定范围,因此,在判卷之前,需要尽可能的
将这种⼲扰信息去除,前⾯的各种图像预处理⽅法仅仅是将图像的前景和背景分离提取出定位标识信息和涂改信息,⾯对这样的情况,选择使⽤机器视觉中常⽤的开运算⽅法处理图像可以得到较好的效果。
开运算:先对图像进⾏腐蚀操作,再进⾏膨胀操作,就是开运算操作,能够消除细⼩的物体,将两个物体的细⼩的连接处去除从⽽分离两个物体,且拥有平滑边界的效果,被⼴泛应⽤于去除图像噪声。
腐蚀算法原理:
步骤1:定义⼀个卷积核B,卷积核可以是随意的⼤⼩与形状,但通常是带参考点的正⽅形或圆形,作为腐蚀的模板。
步骤2:将卷积核与原图像进⾏卷积操作,计算原图像包裹卷积核B的区域的像素最⼩值,这个区域则作为腐蚀操作后的结果。无线收发
例如有原图像A,卷积核B
则经过腐蚀算法操作之后可得实验结果为如下:
实验发现,右上⾓的⼩块图像噪声被腐蚀掉了,同时,下⽅的像素块被腐蚀了⼀圈且两块被分割开来,
为了尽量减少图像的信息被过度腐蚀掉,接下来⼀步需要使⽤膨胀算法,将图像像素膨胀回来,尽可能去掉图像噪声的同时,也减少图像信息的过度减少。
膨胀算法原理:
步骤1:定义⼀个卷积核B,开运算时直接使⽤腐蚀操作时使⽤的卷积核B。
步骤2:将卷积核B与原图像进⾏卷积操作,计算原图像包裹卷积核B的区域的像素最⼤值,这个区域则作为膨胀操作后的结果。使⽤腐蚀操作后的结果来进⾏膨胀操作,实验效果如下:
观察开运算操作的前后对⽐,可以得知,右上⾓的噪声完全去除的同时,与原图像信息相⽐较,仅仅有五个像素点被去除,是完全可以接受的。
开运算操作实际实验效果如下:
彩碳粉步骤进⾏到这,发现右下⾓那块较⼤的图像噪声,仍旧⽆法消除,主要原因是该噪声较⼤,形状⼤⼩与颜⾊深度与⽬标信息相似,在准确保留⽬标信息的情况下难以将其分割开来,因此接下来选择通过定位图像信息来排除该图像噪声,对其不进⾏操作。
代码⽹上的,忘记从哪抄的了,百度⼀下都有。。。
# 图像腐蚀
def etch(img, size):
h=img.shape[0]
w=img.shape[1]
s((h,w),np.uint8)
for i in range(1,h-1):
for j in range(1,w-1):
min=img[i,j]
for k in range(i-size,i+size):
for l in range(j-size,j+size):
if k<0|k>=h-1|l<0|l>=w-1:
continue
if img[k,l]<min:
min=img[k,l]
img1[i,j]=min
return img1
# 图像膨胀
def expand(img, size):
h=img.shape[0]
w=img.shape[1]
s((h,w),np.uint8)
for i in range(1,h-1):
for j in range(1,w-1):
max=img[i,j]
for k in range(i-size,i+size):
for l in range(j-size,j+size):
if k<0|k>=h-1|l<0|l>=w-1:
continue
if img[k,l]>max:
max=img[k,l]
经络拍img1[i,j]=max
return img1
# 开运算
def opening(image, size):
智能药盒etch_img = etch(image, size)
expand_img = expand(etch_img, size)
return expand_img

本文发布于:2024-09-22 18:24:40,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/157823.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   信息   操作   区域   腐蚀   需要   卷积   背景
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议