使用KNN算法实现 0-9 十个数字的识别

时间:2022-11-05 17:09:44

[实验项目]
验证码识别
[实验目的]
用matlab编程实现 0-9 十个数字的识别。
[实验原理]
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决 策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方 法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
[设计内容]
使用KNN算法实现 0-9 十个数字的识别。
[设计过程]
KNN算法流程:
1. 准备数据,对数据进行预处理
2. 选用合适的数据结构存储训练数据和测试元组
3. 设定参数,如k
4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列
5. 遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L 与优先级队列中的最大距离Lmax
6. 进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L < Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队列。
7. 遍历完毕,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别。
8. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值。
实验流程图:
使用KNN算法实现 0-9 十个数字的识别
[主要数据结构]
Matlab图像处理函数:

一. 读写图像文件

  1. imread
    imread函数用于读入各种图像文件,如:a=imread(‘e:\w01.tif’)
    注:计算机E盘上要有w01相应的.tif文件。

  2. imwrite
    imwrite函数用于写入图像文件,如:imwrite(a,’e:\w02.tif’,’tif’)

  3. imfinfo
    imfinfo函数用于读取图像文件的有关信息,如:imfinfo(‘e:\w01.tif’)

二. 图像的显示

  1. image
    image函数是MATLAB提供的最原始的图像显示函数(主要彩色显示图象),如:
    a=[1,2,3,4;4,5,6,7;8,9,10,11,12];
    image(a);

  2. imshow
    imshow函数用于灰度图像文件的显示,如:i=imread(‘e:\w01.tif’);
    imshow(i);

  3. colorbar
    colorbar函数用显示图像的颜色条。通常,颜色映象进行过调节,把数据从最小扩展到最大,也就是说整个颜色映象都用于绘图。有时也许想改变颜色使用的方法。函数caxis代表颜色轴,因为颜色增加了另一个维数,它允许对数据范围的一个子集使用整个颜色映象或者对数据的整个集合只使用当前颜色映象的一部分。[cmin,cmax]=caxis返回映射到颜色映象中第一和最后输入项的最小和最大的数据。它们通常被设成数据的最小值和最大值。比如,函数mesh(peaks) 会画出函数peaks的网格图,并把颜色轴caxis设为[-6.5466,8.0752],即Z的最小值和最大值。这些值之间的数据点,使用从颜色映象中经插值得到的颜色。如:i=imread(‘e:\w01.tif’);imshow(i);colorbar;

4 .figure
figure函数用于设定图像显示窗口,如:figure(1); /figure(2);

打开图像并将图像转为二值图像:

i=imread(‘C:\Users\Administrator\Desktop\实验材料\01.jpg’);
i1=im2bw(i);
%imshow(i1)

分割(均匀切割边界)01图像的上半部分,然后对上面图像进行2*5切割:

src_path=’C:\Users\Administrator\Desktop\实验材料\01.jpg’;%原始图片路径
dst_path=’C:\Users\Administrator\Desktop\实验材料\target.jpg’;%分割图片后保存路径
mkdir(dst_path);%路径不存在则生成
A = imread(src_path); %读入原始图片
[m,n,l] = size(A); %获得尺寸
for i = 1:2
for j = 1:5
m_start=1+(i-1)*fix(m/2);
m_end=i*fix(m/2);
n_start=1+(j-1)*fix(n/5);
n_end=j*fix(n/5);
AA=A(m_start:m_end,n_start:n_end,:); %将每块读入矩阵
imwrite(AA,[dst_path num2str(i) ‘-’ num2str(j) ‘.jpg’],’jpg’); %保存每块图片
end
end
获取每个图片数字得到database

KNN算法:

sp = sprintf(‘Using kNN with correlation distance: ‘);disp(sp);
for i = 1:1:4
result = [];
for j=1:m
temp = [targets(i,:);database(j,:)];
result = [result,pdist(temp, ‘correlation’)];
end
% 输出结果
res = find(result == min(result));
sp = sprintf(‘charset: %d’, A(res));disp(sp);
end

处理后的图像(部分):
使用KNN算法实现 0-9 十个数字的识别