www.gusucode.com > 基于概率神经网络的手写体数字识别 > 基于概率神经网络的手写体数字识别/getFeature1.m

    function [Feature,bmp,flag]=getFeature1(A)
% getFeature.m
% 提取64*64二值图像的特征向量
% input:
% A: 64*64矩阵
% output:
% Feature: 长度为14的特征向量
% bmp    : 图像中的数字部分
% flag   : 标志位,表示数字部分的宽高比

% 反色
A = ones(64) - A;

% 提取数字部分
[x, y] = find(A == 1);

% 截取图像中的数字部分
A = A(min(x):max(x),min(y):max(y));  

% 计算宽高比和标志位
flag = (max(y)-min(y)+1)/(max(x)-min(x)+1);
if flag < 0.5
    flag = 0;
elseif flag >=0.5 && flag <0.75
    flag = 1;
elseif flag >=0.75 && flag <1
    flag = 2;
else
    flag = 3;
end

% 重新放大,将长或宽调整为64
rate = 64 / max(size(A));
% 调整尺寸
A = imresize(A,rate);  
[x,y] = size(A);

% 不足64的部分用零填充
if x ~= 64
    A = [zeros(ceil((64-x)/2)-1,y);A;zeros(floor((64-x)/2)+1,y)];
end;
if y ~= 64
    A = [zeros(64,ceil((64-y)/2)-1),A,zeros(64,floor((64-y)/2)+1)];
end

%% 三条竖线与数字字符的交点个数  F(1)~F(3)
% 1/2 竖线交点数量
Vc = 32;
Num = 0;
for i = 1:64
    Num = Num+A(i, Vc);
end
F(1) = Num;
% F(1) = sum(A(:,Vc));

% 5/12 竖线交点数量
Vc = round(64*3/12);
Num = 0;
for i = 1:64
    Num = Num + A(i, Vc);
end
F(2) = Num;
% F(2) = sum(A(:,Vc));

% 7/12 竖线交点数量
Vc = round(64*9/12);
Num = 0;
for i = 1:64
    Num = Num + A(i, Vc);
end
F(3)=Num;
% F(3) = sum(A(:,Vc));

%% 三条横线与数字字符的交点个数 F(4)~F(6)
% 1/2 水平线交点数量
Hc = 32;
Num = 0;
for i = 1:64
    Num = Num + A(Hc, i);
end
F(4) = Num;
%  F(4) = sum(A(Hc,:));

% 1/3 水平线处交点数量,
Hc = round(64/3);
Num = 0;
for i = 1:64
    Num = Num + A(Hc, i);
end
F(5) = Num;
%  F(5) = sum(A(Hc,:));
 
% 2/3水平线处交点数量
Hc = round(2*64/3);
Num = 0;
for i = 1:64
    Num = Num + A(Hc, i);
end
F(6) = Num;
%  F(6) = sum(A(Hc,:));
%% 两条对角线的交点数量
% 主对角线交点数,
x3 = 1;
y3 = 1;
Num = 0;
for i = 0:63
    Num = Num+A(x3+i,y3+i);
end
F(7) = Num;
% F(7) = sum(diag(A));
% 次对角线交点数
x4 = 1;
y4 = 64;
Num = 0;
for i = 0:63
    Num = Num + A(x4+i, y4-i);
end
F(8) = Num;
% F(8) = sum(diag(rot90(A)));
%% 小方块

% 右下角1/2小方块中的所有点
Num = 0;
for i = 32:64
    for r = 32:64
        Num = Num + A(i,r);
    end
end
F(9) = Num/10;
% t = A(32:64,33:64);
% F(9) = sum(t(:))/10;
% 左上角1/2小方块中的所有点
Num = 0;
for i3 = 1:32
    for r3 = 1:32
        Num = Num + A(i3,r3);
    end
end
F(10) = Num/10;
% t = A(1:32,1:32);
% F(10) = sum(t(:))/10;
% 左下角方块中的所有点
Num = 0;
for i4 = 1:32
    for r4 = 32:64
        Num = Num + A(i4,r4);
    end
end
F(11) = Num/10;
% t = A(1:32,32:64);
% F(11) = sum(t(:))/10;
% 右上角方块中的所有点
Num = 0;
for i5 = 32:64
    for r5 = 1:32
        Num = Num + A(i5,r5);
    end
end
F(12) = Num/10;
% t = A(32:64,1:32);
% F(12) = sum(t(:))/10;
% 下方2/3部分的所有像素点
Num = 0;
for i1 = 1:64
    for r1 = 16:48
        Num = Num + A(i1,r1);
    end
end
F(13) = Num/20;
% t = A(1:64,16:64);
% F(13) = sum(t(:))/20;
% 右方2/3部分的所有像素点
Num = 0;
for i2 = 16:48
    for r2 = 1:64
        Num = Num + A(i2,r2);
    end
end
F(14) = Num/20;
% t = A(16:48,1:64);
% F(14) = sum(t(:))/20;
Feature = F';
bmp = A;