基于最小距离分类器的图像识别
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/
相关文章推荐
- 基于图像识别的分类器的实现
- 基于 TensorFlow 的图像识别(R实现)
- 基于BOW的图像分类识别算法实现步骤
- 车牌识别中一种新的直接基于彩色图像的二值化简化方法
- 基于vuforia的图像识别Jar的使用
- Matlab图像识别/检索系列(6)-10行代码完成深度学习网络之基于CNN的图像分类
- 互联网相似图像识别检索引擎 —— 基于图像签名的方式
- 基于OpenCV图像最小二乘相位解包裹算法
- 基于移动最小二乘的图像变形和曲线拟合
- 图像处理实例--基于Hough变化的答题卡识别(未完成)
- 通过分类器自动识别图像中的人脸
- 基于OpenCV及Python的数独问题识别与求解(一)图像预处理
- Matlab图像处理学习笔记(三):基于匹配的目标识别
- 图像五值化与基于三值图像的车牌识别(1)
- 基于opencv2.0的haar算法以人脸识别为例的训练分类器xml的方法
- 基于51最小系统的距离测量仪制作/更新于2017/12/30
- 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)
- 基于深度学习的图像识别进展:百度的若干实践
- 基于OpenCV及Python的数独问题识别与求解(二)边框识别与图像矫正
- 基于色卡的颜色识别和色调识别-基于颜色的图像检索