您的位置:首页 > 其它

基于最小距离分类器的图像识别

2017-11-15 14:26 393 查看

1.最小距离分类器





[b]MATLAB的实现[/b]

% 例11.3 利用最小距离分类器分类3种鸢尾属植物
load fisheriris %载入Matlab自带的鸢尾属植物数据集

% 每类的前40个样本用于生成代表该类的模板,后10个作为独立的测试样本
m1 = mean( meas(1:40, :) ); %第1类的前40个样本的平均向量
m2 = mean( meas(51:90, :) ); %第2类的前40个样本的平均向量
m3 = mean( meas(101:140, :) ); %第3类的前40个样本的平均向量

% 测试样本集,采用后十个作为测试集
Test = [meas(41:50, :); meas(91:100, :); meas(141:150, :)];
% 测试样本集对应的类别标签
classLabel(1:10) = 1;
classLabel(11:20) = 2;
classLabel(21:30) = 3;

% 利用最小距离分类器分类测试样本
class = zeros(1, 30); %类标签
size(Test,2)
for ii = 1:size(Test, 1)
d(1) = norm(Test(ii, :) - m1); %计算欧几里得距离,与第1类的距离
d(2) = norm(Test(ii, :) - m2); %与第2类的距离
d(3) = norm(Test(ii, :) - m3); %与第3类的距离

[minVal class(ii)] = min(d); %计算最小距离并将距离样本最短的类赋给类标签数组 class,min()函数的性质
end

% 测试最小距离分类器的识别率
nErr = sum(class ~= classLabel);
rate = 1 - nErr / length(class);
strOut = ['识别率为', num2str(rate*100), '%']


2.基于相关的模板匹配

基于相关的模板匹配,实现是对子图像用行向量/列向量W来表示,将子图像与原图像覆盖的部分也用行向量/列向量表示U。根据相关定义,两者之间对应像素分别相乘。

但由于图像是灰度图像,需要进行归一化处理。所以,处理的公式应该为,


构造一个imcorr()函数;

代码如下

function Icorr = imcorr(I, w)
% function Icorr = imcorr(I, w, )
% 计算图像 I 与子模式 w 的相关响应,并提示最大的响应位置
%
% Input:I - 原始图像
%        w - 子图像
%
% Output:Icorr - 响应图像

[m, n] = size(I);
[m0, n0] = size(w);

Icorr = zeros(m-m0+1, n-n0+1); %为响应图像分配空间

vecW = double( w(:) ); %按列存储为向量
normW = norm(vecW); %模式图像对应向量的模

for ii = 1:m-m0+1
for jj = 1:n-n0+1
subMat = I(ii:ii+m0-1, jj:jj+n0-1);
vec = double( subMat(:) ); %按列存储为向量
Icorr(ii, jj) = vec' * vecW / (norm(vec)*normW+eps); %计算当前位置的相关
end
end

% 找到最大响相应位置
[iMaxRes, jMaxRes] = find(Icorr == max( Icorr(:) ) );
figure, imshow(I);
hold on
for ii = 1:length(iMaxRes)
plot(jMaxRes(ii), iMaxRes(ii), 'w*');
plot([jMaxRes(ii), jMaxRes(ii)+n0-1], [iMaxRes(ii), iMaxRes(ii)], 'w-' );
plot([jMaxRes(ii)+n0-1, jMaxRes(ii)+n0-1], [iMaxRes(ii), iMaxRes(ii)+m0-1], 'w-' );
plot([jMaxRes(ii), jMaxRes(ii)+n0-1], [iMaxRes(ii)+m0-1, iMaxRes(ii)+m0-1], 'w-' );
plot([jMaxRes(ii), jMaxRes(ii)], [iMaxRes(ii), iMaxRes(ii)+m0-1], 'w-' );
end


但是,这个程序运行比较慢,考虑到相关运算可以用傅里叶变换及傅共轭乘积,来表示。

改进的代码如下:

function Icorr = dftcorr(I, w)
% function Icorr = dftcorr(I, w)
% 在频域下计算图像 I 与子模式 w 的相关响应,并提示最大的响应位置
%
% Input:I - 原始图像
%        w - 子图像
%
% Output:Icorr - 响应图像
I = double(I);
[m n] = size(I);
[m0 n0] = size(w);
F = fft2(I);
w = conj(fft2(w, m, n)); %w 频谱的共轭
Ffilt = w .* F; %频域滤波结果
Icorr = real(ifft2(Ffilt)); %反变换回空域

% 找到最响相应位置
[iMaxRes, jMaxRes] = find(Icorr == max( Icorr(:) ) );
figure, imshow(I, []);
hold on
for ii = 1:length(iMaxRes)
plot(jMaxRes(ii), iMaxRes(ii), 'w*');
plot([jMaxRes(ii), jMaxRes(ii)+n0-1], [iMaxRes(ii), iMaxRes(ii)], 'w-' );
plot([jMaxRes(ii)+n0-1, jMaxRes(ii)+n0-1], [iMaxRes(ii), iMaxRes(ii)+m0-1], 'w-' );
plot([jMaxRes(ii), jMaxRes(ii)+n0-1], [iMaxRes(ii)+m0-1, iMaxRes(ii)+m0-1], 'w-' );
plot([jMaxRes(ii), jMaxRes(ii)], [iMaxRes(ii), iMaxRes(ii)+m0-1], 'w-' );
end


改进的代码似乎识别不准确;一开始以为是图像没有进行归一化处理造成的

I=I/256;w=w/256;


这个识别成功了,但是中间的识别头像有偏差



归一化之后,效果也不是很理想,现在也不太清楚是什么原因造成的。

参考文献:1.http://whuhan2013.github.io/blog/2017/01/04/image-disntiguish-start/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图像识别