Python OpenCV招商银行信用卡卡号识别的方法
学在前面
从本篇博客起,我们将实际完成几个小案例,第一个就是银行卡号识别,预计本案例将写5篇左右的博客才可以完成,一起加油吧。
本文的目标是最终获取一套招商银行卡,0~9数字的图,对于下图的数字,我们需要提取出来,便于后续模板匹配使用。不过下图中找到的数字不完整,需要找到尽量多的卡片,然后补齐这些数字。
提取卡片相关数字
先对上文中卡片中的数字进行相关提取操作,加载图片的灰度图,获取目标区域。在画板中模拟一下坐标区域,为了便于进行后续的操作。
importcv2ascv importnumpyasnp #读取灰度图 src=cv.imread("./ka1.jpg",0) #寻找卡号目标区域 roi=src[142:168,42:360] #cv.imshow("roi",roi)
获取到的图片如下,发现右侧边缘缺少一部分内容,对目标区域坐标进行微调。
修改之后的代码如下,你如果使用的图片与橡皮擦不一致,注意进行修改。
#寻找卡号目标区域 roi=src[142:168,46:364] cv.imshow("roi",roi)
消除噪音,可以增加模糊卷积操作,分别测试均值模糊,中值模糊,高斯模糊效果。
#模糊卷积操作 blur_roi=cv.blur(roi,(5,5)) cv.imshow("blur_roi",blur_roi) med_roi=cv.medianBlur(roi,5) cv.imshow("med_roi",med_roi) gau_roi=cv.GaussianBlur(roi,(7,7),0) cv.imshow("gau_roi",gau_roi)
测试不同的卷积核效果,选择一个合适的即可,我这里发现卷积核为(7,7)的时候,高斯模糊效果不错,可以去噪。
#对目标区域进行二值化操作 ret,thresh=cv.threshold( gau_roi,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) cv.imshow("thresh",thresh)
二值化处理完毕之后,发现还存在一些白色区域的点,需要去除掉,这里使用了形态学里面的腐蚀操作。
#腐蚀 kernel=np.ones((3,4),np.uint8) dst=cv.erode(thresh,kernel=kernel)
腐蚀之后在进行膨胀,让原有的数字区域变的明显,最后的图片是进行之后的效果,关于卷积核你可以自行调整。
#腐蚀 kernel=np.ones((3,4),np.uint8) erode_dst=cv.erode(thresh,kernel=kernel) cv.imshow("erode_dst",erode_dst) #膨胀 kernel=np.ones((4,4),np.uint8) dilate_dst=cv.dilate(erode_dst,kernel=kernel)
下面进行外轮廓检测,检测之后发现恰好有16个轮廓,也就对应了16个数字区域。
#检测外轮廓 #只检测外轮廓 contours,hierarchy=cv.findContours(dilate_dst,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) print(len(contours))
对轮廓面积进行一下输出,为了防止出现非目标区域,可以进行一下基本的判断,当罗阔面积大于80的时候才进行展示。
target_list=[] #轮廓判断 forcntincontours: #轮廓面积 area=cv.contourArea(cnt) print(area) ifarea>79: target_list.append(cnt) print(len(target_list))
有这些参数之后,就可以对灰度图进行裁切了,基于外接矩形获取目标区域,我直接做了循环展示。
forindex,cntinenumerate(target_list): #外接矩形 x,y,w,h=cv.boundingRect(cnt) #在二值化的图像上进行目标区域获取 c_roi=roi[y:y+h,x:x+w] #调整图像大小 #big_roi=cv.resize(c_roi,dsize=(0,0),fx=2,fy=2) #big_roi=cv.resize(c_roi,dsize=(0,0)) cv.imshow("big_roi"+str(index),c_roi) #cv.imwrite(f"./numbers/ka_{index}.png",big_roi)
接下来放大图片对其进行保存即可,得到如下图片列表,至此,已经获取到1、4、6、8几个数字,下面在切换到另一张卡片,去获取其他数字即可,注意图片大小保持一致。
big_roi=cv.resize(c_roi,dsize=(42,66)) #cv.imshow("c_roi"+str(index),c_roi) cv.imwrite(f"./numbers/ka1_{index}.png",big_roi)
新的图像注意调整目标区域,获取素材,已经获取到1、2、4、5、6、7、8几个数字
importcv2ascv importos defwalk_file(file): forroot,dirs,filesinos.walk(file): forfinfiles: file=os.path.join(root,f) #读取灰度图 basename=os.path.basename(file) filename=basename.split(".")[0] src=cv.imread(file,0) ret,thresh=cv.threshold(src,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) #cv.imshow("thresh",thresh) cv.imwrite(f"./numbers/001_{filename}_bit.png",thresh) cv.waitKey() cv.destroyAllWindows() if__name__=="__main__": walk_file("./numbers")
二值化之后,挑选出比较清晰的数字即可,如果发现存在不清楚的,可以在寻找资源进行提取,银行里面8真的是太多了。
橡皮擦最后调整之后,得到的结果如下所示,信用卡卡号识别的第一步算是准备好了。
到此这篇关于PythonOpenCV招商银行信用卡卡号识别的方法的文章就介绍到这了,更多相关OpenCV信用卡卡号识别内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。