欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于“斜率”特征值的数字识别

程序员文章站 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;