基于“斜率”特征值的数字识别
程序员文章站
2022-03-06 08:25:23
...
实验报告
实验目的:能准确识别数字(针对图像中仅含一个数字的情况)
实验准备:
准备含0~9十个数字各5张的标准数字字符图像,其图像大小均为64x32 pixel。除此之外还准备若干张不标准的数字字符图像,图像大小同标准数字图像,用于测试识别的准确率。
实验环境:MATLAB R2016a
实验步骤:
首先,读取5*10张标准图片,然后将图片进行二值化;其次将图片分为A、B、C、D、E、F、G、H八个区域(见图1),再分别统计每张图片中每个区域内的像素点数目,将相邻区域像素个数两两做差,得出“斜率”,作为该数字的标准数字特征集之一;最后,将测试图像二值化,计算该图像的斜率特征集,与标准数字特征集进行比较,识别该图像。
图1 图像8分割图
实验改进:
考虑到给定的图像都是标准字符的数字图像,因此将每一张图像的特征集都作为一个独立的特征,同时也综合考虑图像的平均特征。简单来说,原来一个数字只有一个标准平均特征集,现在一个数字将有6个标准特征集(五个图像特征集 + 一个平均图像特征集),测试图像的特征集只要与其中一个特征集相似,则认为测试图像即为该特征集所代表的数字,从而完成数字识别。
标准图像图库(见图2):
图2 标准图像的图库展示
测试图像图库(见图3):
图3 测试图像的图库展示
实验代码:
见附录。
实验结果:
实验分析:
分析实验结果,发现识别正确率达94.74%,但是测试集内的数字仍然相对来说比较端正、标准,那么对于存在内容缺失情况的数字图像的识别结果如何呢?算法仍待进一步提高!
(PS:标准图像图库和测试图像图库在百度云中。
链接:https://pan.baidu.com/s/1tmKhU5dKmGw0c_K_QugEnA 密码:kg3b)
附录
Part_Three.m
result =zeros(1,10);feature=zeros(60,10);
for i=0:9
z0 = double(imread(strcat(num2str(i),'_Arial.bmp')));
z1 = double(imread(strcat(num2str(i),'_Courier.bmp')));
z2 = double(imread(strcat(num2str(i),'_SongTi.bmp')));
z3 = double(imread(strcat(num2str(i),'_Times.bmp')));
z4 = double(imread(strcat('just_',num2str(i),'.bmp')));
thresh = graythresh(z0);z0 =im2bw(z0,thresh);thresh = graythresh(z1);z1 = im2bw(z1,thresh);
thresh = graythresh(z2);z2 =im2bw(z2,thresh);thresh = graythresh(z3);z3 = im2bw(z3,thresh);
thresh = graythresh(z4);z4 =im2bw(z4,thresh);
r1=feature_vector(z0);r2=feature_vector(z1);r3=feature_vector(z2);r4=feature_vector(z3);r5=feature_vector(z4);
feature(i*6+1,:) = r1;
feature(i*6+2,:) = r2;
feature(i*6+3,:) = r3;
feature(i*6+4,:) = r4;
feature(i*6+5,:) = r5;
feature(i*6+6,:) = (r1 + r2 + r3 + r4+r5)./4;
end
test = double(imread('C:\Users\Lenovo\Desktop\testSet\just_57.bmp'));
thresh = graythresh(test);
test= im2bw(test,thresh);
r=feature_vector(test);
for i=1:60
result(i) = (feature(i,1) - r(1)).^2 +(feature(i,2) - r(2)).^2 + (feature(i,3) - r(3)).^2 + (feature(i,4) - r(4)).^2+ (feature(i,5) - r(5)).^2 +...
(feature(i,6) - r(6)).^2 +(feature(i,6) - r(6)).^2 + (feature(i,8) - r(8)).^2 + (feature(i,9) - r(9)).^2+ (feature(i,10) - r(10)).^2;
end
[x,y] = min(result);
yy = fix((y-1)/6);
X = sprintf('it is %d',yy);
disp(X)
feature_vector.m
function r = feature_vector(z)
a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;
for m=1:16
for n=1:16
if z(m,n) == 1
a = a+1;
end
end
end
for m=1:16
for n=17:32
if z(m,n) == 1
b = b+1;
end
end
end
for m=17:32
for n=1:16
if z(m,n) == 1
c = c+1;
end
end
end
for m=17:32
for n=17:32
if z(m,n) == 1
d = d+1;
end
end
end
for m=33:48
for n=1:16
if z(m,n) == 1
e = e+1;
end
end
end
for m=33:48
for n=17:32
if z(m,n) == 1
f = f+1;
end
end
end
for m=49:64
for n=1:16
if z(m,n) == 1
g = g+1;
end
end
end
for m=49:64
for n=17:32
if z(m,n) == 1
h = h+1;
end
end
end
r(1)=b-a;r(2)=c-a;r(3)=d-b;r(4)=d-c;r(5)=e-c;
r(6)=f-d;r(7)=f-e;r(8)=g-e;r(9)=h-f;r(10)=h-g;