用python写一个基于特征提取不用机器学习的手写数字识别程序
时间: 2023-11-27 14:03:32 浏览: 71
好的,以下是一个基于特征提取的手写数字识别程序的示例代码:
```
import numpy as np
import cv2
# 加载预处理模板
template = cv2.imread('digits.png',0)
# 定义特征提取函数
def get_features(img):
# 缩小图像
img = cv2.resize(img, (20, 20))
# 二值化
ret, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 求每行和每列的像素值和
row_sum = np.sum(img, axis=1).reshape(-1, 1)
col_sum = np.sum(img, axis=0).reshape(1, -1)
# 将特征向量合并为一个一维数组
features = np.concatenate([row_sum.flatten(), col_sum.flatten()])
return features
# 定义计算距离的函数
def distance(x1, x2):
return np.sqrt(np.sum(np.square(x1-x2)))
# 加载测试图片
test_img = cv2.imread('test.png', 0)
# 提取特征
test_features = get_features(test_img)
# 计算与所有预处理模板的距离
distances = []
for i in range(10):
for j in range(5):
template_roi = template[j*20:(j+1)*20, i*20:(i+1)*20]
template_features = get_features(template_roi)
dist = distance(test_features, template_features)
distances.append((dist, i))
# 排序并取出距离最小的数字
distances.sort()
digit = distances[0][1]
print('识别结果:', digit)
```
该程序的思路是先将手写数字图像缩小并二值化,然后计算每行和每列的像素值和作为特征向量。接着,对于每个数字,将其预处理模板的特征向量与测试图像的特征向量计算欧氏距离,最后选择距离最小的数字作为识别结果。
请注意,该程序的识别效果可能不如基于机器学习的手写数字识别程序,因此仅供参考。
阅读全文