特征提取
聚类
k-means算法流程:
- 随机初始化K个聚类中心
-
重复下述步骤直至算法收敛:
- 对应每个特征,根据距离关系赋值给某个中心/类别
- 对每个类别,根据其对应的特征及重新计算聚类中心
量化
利用单词表的中词汇表示图像特征点
通过统计单词表中每个单词在图像中出现的次数,可以将图像表示成为一个n维数值向量
最常用的权重是
TF-IDF
TF指的是一个给定的词语在该文件中出现的次数。如:一篇文档总词数为1000,单词A出现次数为3次,则TF=3/1000=0.003。其主要思想是:如果某个关键词在一篇文章中出现的频率高,说明该词语能够表征文章的内容,该关键词在其它文章中很少出现,则认为此词语具有很好的类别区分度,对分类有很大的贡献。
DF是描述了某一个特定词语的普遍重要性,如果某词语在许多文档中都出现过,表明它对文档的区分力不强,则赋予较小的权重;反之亦然。如:总共有1000篇文档,有100个包含词语A,则IDF= log (1000/1,00) = 3.287。IDF的主要思想是:如果文件数据库中包含词语A的文件越少,则IDF越大,则说明词语A具有很好的类别区分能力。
最终的TF-IDF权值为词频与逆文档频率的乘积。
把输入图像,根据TF-IDF转化成视觉单词( visual words)的频率直方图 ,用视觉单词直方图来表示图像
倒排表
根据索引结果在直方图匹配
优缺点
优点:BoW 模型简单有效
缺点:BoW模型存在缺少空间信息和语义信息的不足的问题
由于pcv的问题至今无法解决,所以使用matlib实现
提取特征
for i = 1:ImgNum
ImgName = [ImgFolder int2str(i-1)];
ImgName = [ImgName '.jpg'];
disp(i);
RGBImg = imread(ImgName);
YUVImg = rgb2ycbcr(RGBImg);
ImgInfo{i} = YUVImg;
end
挑选特征
function y=Func_divide(x,BlockSize)
y = [];
n = size(x,1)/8;
m = size(x,2)/8;
for i = 1:n
for j = 1:m
posx = (i-1)*BlockSize+1; %某个8*8的块起始位置横坐标
posy = (j-1)*BlockSize+1; %某个8*8的块起始位置纵坐标
temp = x(posx:posx+BlockSize-1,posy:posy+BlockSize-1);
temp = reshape(temp',1,BlockSize*BlockSize); %求转置来横着拼
% 平铺
y = [y;temp];
end
end
end
聚类
[Idx,C] = kmeans(SelectHist,clusterNum);
分类
for i = 1:ImgNum;
similarDistances = pdist2(cell2mat(LocalHist_Y(i)),C);
[minElements,idx] = min(similarDistances,[],2);
bins = 0.5:1:clusterNum+0.5;
hist = histogram(idx,bins);
Features = hist.Values;
Final_Hist(i,:) = Features;
end
计算直方图距离
%% 计算各图片与其它图片间的距离
Hist_Dist=[];
for i=1:ImgNum
for j=1:ImgNum
a = Final_Hist(i,:);
b = Final_Hist(j,:);
similarDistance(j) = pdist2(a,b,'cityblock');
end
Hist_Dist = [Hist_Dist;similarDistance];
end
检索
%% 测试
Img = 436;
temp = Hist_Dist(Img,:);
[Y,I] = sort(temp);
k = 16; %前15相似
for i = 1:k
ImgFolder = './test1/';
ImgName = [ImgFolder int2str(I(i)-1)];
ImgName = [ImgName '.jpg'];
subplot(4,4,i);
imshow(ImgName);
end