基于模板匹配的数字识别

这几天做了一些关于图像的活,简单的数字识别,记录一下。
因为图像质量比较好,灰度、二值化后,可以直接用opencv得到连通域信息

ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
binary = 255 - binary # 黑白反转
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary, connectivity=4, ltype=None)

将保存下来的图片resize成2030,建立模板库
模板库
在模板匹配的时候,走了些弯路。
匹配前,将连通域resize成模板的尺寸,并且需要重新二值化。

Rsize = (20, 30)
tempImg = cv2.resize(tempImg, Rsize) # resize后,像素值会变化,需要重新二值化
ret, tempImg = cv2.threshold(tempImg, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

先是拿连通域一个一个跟模板匹配,结果是所有连通域都得到匹配得数字,两三个连通域匹配到得都是同一个结果。
后来换了顺序,拿模板库里的模板来匹配连通域,这样可以在图片中找到所有跟模板库里相似度最高的且唯一的数字。
匹配过程中,直接拿模板图片binary_datas减去连通域图片tempImg ,因为整体效果有,只是3、8识别不了,觉得很奇怪,这两个区别度还是挺高的。怎么就分不对呢。

res = sum(sum(((tempImg - binary_datas) / 255) * ((tempImg - binary_datas) / 255)))

后来才发现,这样直接做减法,当出现(0-255=-255)结果为负数的时候,会直接取值为1.改成下面的代码,3跟8就能区分了

for x in range(30):
    for y in range(20):
        temp_img[x, y] = abs(int(tempImg[x, y] - int(binary_datas[x, y]))) / 255
res = sum(sum(temp_img))
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值