计算机视觉(五):图像检索

  • Post author:
  • Post category:其他



特征提取


聚类

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

​​​​​​​



版权声明:本文为akiakiapple原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。