赞
踩
新手上路,从头讲起
1、工具
原版代码:http://www.cs.ubc.ca/~lowe/keypoints/
vlfeat工具:http://www.vlfeat.org/index.html
这两个工具都可以进行sift特征提取以及匹配。我使用的是vlfeat工具箱,使用环境为win10,matlab。
2、sift特征提取
- image=imread('1.jpg'); %读取图片,此处读取图片为RGB
- I = single(rgb2gray(image)); %函数传入图片格式固定为二维图像的single或者double类型,因此此处转为灰度,并改数据格式为single
- I=(I-min(min(I))+1)/(max(max(I))-min(min(I))+1); %因为single格式图片需要数据范围为0~1时才可以正常显示,因此在这里调整一次数据大小,方便显示。
- %实际上上一步的I转为single格式之后就可以了,有无这一步的操作并不会影响特征提取。
- [f,d] = vl_dsift(I) ; %特征提取,得到的f是一个2*n的矩阵,每一列是一个坐标;d是特征数据,是一个128*n的矩阵,每列是一个特征。
3、 k-mean
- X=[];
- for i=1:sizepic %循环一个所有图片
- name=piclist(i).name;
- feature=load(name); %读取之前保存的每张图片的特征矩阵的*.mat文件
- d=vertcat(feature.d); %因为之间保存的时候将f和d都保存了,所以需要从feature结构体中读取矩阵d
- Xpos=[Xpos,d]; %将矩阵简单的叠加起来,这里每一列是一个keypoint,所以把矩阵横向叠加
- end
- Xpos=double(Xpos); %由于kmean的函数要求数据格式为single或者double,因此这里将矩阵的数据格式转换为double
- [Cp, Ap] = vl_kmeans(Xpos, 50, 'verbose', 'distance', 'l1', 'algorithm', 'elkan'); %kmean聚类,具体函数详解查看vlfeat文档啊
4、将每一张图片的特征放入k-mean聚类中心中转换
name=list(i).name; image=imread(name); I = single(rgb2gray(image)) ; I=(I-min(min(I))+1)/(max(max(I))-min(min(I))+1); [f,d] = vl_dsift(I) ; % sift featVec=zeros(1,50); for j=1:size(d,2) fi = double(d(:,j)); diffMat = repmat(fi, 1,50) - Cp; sqSum = sum(diffMat.^2,1); dist = sqrt(sqSum); [val,idx]=min(dist); featVec(1,idx) = 1+ featVec(1,idx) ; end feature(count,:)=[featVec,1]; % 将特征和标签一起放入特征集合 count=count+1;
5、分类模型
6、分类测试
lab = module.predictFcn(featVec); #传入与训练模型一致的50维特征进行分类
其他参考网站链接
博主的代码是python代码,很详细。
博主很详细的讲解了sift+kmean+svm的算法思想,博主的论文里面的东西在博客当中基本已经讲解清楚了,除了一个不同数量聚类中心的对比试验在论文中详细讲解,其他都讲完了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。