Python+OpenCV实现图像处理OCR手写数字识别原理


一、基本原理

1、载入训练图片:

读取OpenCV安装目录下手写图片合集(图片地址:opencv\sources\samples\data\digits.png)
若找不到可以查看本文附录中的图片进行下载使用

2、图片分割:

此图片大小为2000*1000 有5K个手写字符可以求得每个数字大约占有400个像素故将图像分割为 20 *20 的小块

3、灰度处理:

将分割的图片进行灰度化,使原本的RGB多维数据转化为二维灰度数据,方便处理

4、数据矩阵化:

将灰度图像转换为矩阵横向划分为100份,纵向划分50份

5、分配训练集与测试集:

分别分配50列,前50列为训练集,后50列为测试集

6、将训练测试集进行标定:

方便确定每个块内的数字具体是多少

7、创建KNN邻近:

训练模型

8、使用测试集:

检测模型准确率


二、具体代码

1、训练与测试准确率代码

img = cv.imread('D:\OpenCV\opencv\sources\samples\data\digits.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 将图片进行分割成5000块横向100纵向50,分割为20*20
# 纵线分割np.hsplit(数组,份数),横线分割np.vsplit(数组,份数)
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
# 使其成为一个Numpy数组,大小为(50,100,20,20)
x = np.array(cells)
# 准备train_data和test_data
train = x[:,:50].reshape(-1,400).astype(np.float32)
test = x[:,50:100].reshape(-1,400).astype(np.float32)

# 创建测试,训练标签
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()
# 初始化KNN,训练数据,然后使用k = 1的测试数据对其进行测试
knn = cv.ml.KNearest_create()
knn.train(train,cv.ml.ROW_SAMPLE,train_labels)
ret,result,neighbours,dist = knn.findNearest(test,k=5)#test
# 检测分类的准确性
# 将结果与test_labels进行比较,检查哪个是错误的
print(result)
matches = result == test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result.size
print(accuracy)

2、通过训练模型对某张500*500像素图片进行识别

import numpy as np
import cv2 as cv

# ------------------输入图片处理部分--------------------------------
test_img = cv.imread('./img/3.jpg')
# 缩放测试图片至20*20
height, width = test_img.shape[:2]
size = (int(width/25), int(height/25))
res = cv.resize(test_img,size, interpolation=cv.INTER_CUBIC)
# 图片进行灰度处理
res_gray = cv.cvtColor(res,cv.COLOR_BGR2GRAY)
# 生成等长的纯白255矩阵
test_array = np.array(res_gray)
g25 = np.ones(test_array.shape)
g25 = g25*255
# 相减将底色与字体实际灰度值调换(将底色变为黑色,字体变为白色)
test_array = g25-test_array
# 将多维矩阵转换为一维矩阵
input_test = test_array[:,:].reshape(-1,400).astype(np.float32)
print(input_test.size)
'''
# 显示输入图片(调试使用)
cv.imshow('result_img',res)
cv.waitKey(0)
'''
# ------------------输入图片处理完成--------------------------------

img = cv.imread('D:\OpenCV\opencv\sources\samples\data\digits.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 将图片进行分割成5000块横向100纵向50,分割为20*20
# 纵线分割np.hsplit(数组,份数),横线分割np.vsplit(数组,份数)
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
# 使其成为一个Numpy数组,大小为(50,100,20,20)
x = np.array(cells)
# 准备train_data和test_data
train = x[:,:50].reshape(-1,400).astype(np.float32)
test = x[:,50:100].reshape(-1,400).astype(np.float32)

# 创建测试,训练标签
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()
# 初始化KNN,训练数据,然后使用k = 1的测试数据对其进行测试
knn = cv.ml.KNearest_create()
knn.train(train,cv.ml.ROW_SAMPLE,train_labels)
ret,result,neighbours,dist = knn.findNearest(input_test,k=5)#test
# 结果输出
print(result)

附录

1、训练图片

在这里插入图片描述

2、测试图片

在这里插入图片描述

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python OCR(Optical Character Recognition,光学字符识别)是一种利用计算机对图像中的字符进行识别的技术。在数字识别方面,Python OCR 可以识别图像中的数字,并将其转换为计算机可识别的文本形式。 Python OCR 数字识别的基本步骤包括图像预处理、字符识别和结果输出。首先,需要对待识别的图像进行预处理,包括灰度化、二值化、去噪等操作,以便提高后续字符识别的准确度。然后,利用 OCR 算法对经过预处理的图像进行字符识别,识别出图像中的数字。最后,将识别结果输出为计算机可读取的文本形式,便于后续分析和处理。 在 Python 中,常用的 OCR 库包括 Tesseract、OpenCV 和 PyTorch 等。其中最常用的是 Tesseract,它是一个开源的 OCR 引擎,可以通过在 Python 中调用相关的 API 实现数字识别。通过使用 Tesseract,我们可以轻松地在 Python实现数字识别功能。 Python OCR 数字识别在实际应用中有较广泛的应用,例如自动识别银行卡号码、自动识别手写数字等。这项技术可以节省大量人工操作时间和提高识别准确度。同时,通过不断改进 OCR 算法和提高图像预处理的效果,可以进一步提升数字识别的准确率和效果。 总结起来,Python OCR 数字识别是一项利用计算机对图像中的数字进行识别的技术。通过 Python 中的 OCR 库和相关技术,我们可以轻松实现数字识别功能,并将识别结果输出为计算机可读取的文本形式,方便后续处理和分析。这项技术在实际应用中具有较广泛的应用前景,可以大大提高工作效率和准确度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值