基于颜色特征的图像检索(二)

上一篇是给定一张测试图像检索前10张最相似的图像,但是要比较一种方法的好坏,需要对整个测试集进行计算,因此这里给出对整个测试集进行检索的代码,思路在上一篇博客中有写,代码部分用到的ImgExtract函数、HSVHist函数和ColorMoment函数也已经在上一篇博客中进行了说明。

目录

一、提取训练集和测试集图像的特征

二、进行相似度计算并排序

三、计算精度

四、结果


一、提取训练集和测试集图像的特征

这里给出了提取颜色直方图作为特征的代码,首先读取训练集,由于颜色直方图的维数是72,所以新建一个shape=[train_num, 72]的矩阵train_imghist用于存储每张图像的颜色直方图,然后存储训练集图像的粗分类标签、细分类标签和文件名,代码如下:

load train.mat
train_num = size(data, 1);
train_imghist = zeros(train_num, 72);
for i = 1:train_num
    train_img = ImgExtract(i, data);
    train_imghist(i, :) = HSVHist(train_img);    % 获取测试图像的直方图
end
train_coarse = coarse_labels;
train_fine = fine_labels;
train_filename = filenames;

如果要用颜色矩作为特征,需要将72改成9,调用的函数也需要从HSVHist换成ColorMoment函数,即:

    train_imghist(i, :) = ColorMoment(train_img);    % 用颜色矩做特征

提取测试集图像特征的思路和代码都和训练集差不多,代码如下:

load test.mat
test_num = size(data, 1);
test_imghist = zeros(test_num, 72);
for i = 1:test_num
    test_img = ImgExtract(i, data);
    test_imghist(i, :) = HSVHist(test_img);
end
test_coarse = coarse_labels;
test_fine = fine_labels;
test_filename = filenames;

 

二、进行相似度计算并排序

有了训练集和测试集每张图像的特征后,需要将测试集每张图像的特征与训练集的所有图像进行特征匹配,计算相似度,首先新建一个shape=[test_num, train_num] 的矩阵p,矩阵的第i行第j列的数存储的是第i张测试图像和第j张训练图像的相似度,为了提高计算速度,这里采用的是矩阵运算,获取一张测试图像的特征后,调用repmat函数复制train_num行,现在得到的矩阵test_re的维度是[train_num, 72],每一行的数是一样的,都代表该测试图像的特征,然后用这个矩阵直接与训练集的特征矩阵train_imghist做运算,注意直方图相交法是点除运算,欧氏距离得到的q需要做reshape操作,最后再将q赋值给p(i, :)即可,代码如下:

p = zeros(test_num, train_num);
for i = 1:test_num
    test_hist = test_imghist(i,:);
    test_re = repmat(test_hist, train_num, 1);
%     q = sum(min(test_re, train_imghist), 2) ./ sum(test_re, 2);    % 直方图相交法
    diff = (test_re - train_imghist).^2;  
    q = sqrt(sum(diff, 2));    % 计算欧氏距离
    p(i,:) = reshape(q, [1, train_num]);
end

得到矩阵p后,对p的每一行进行排序,直方图相交法是降序排序,欧氏距离是升序排序,排序后取每行的前10个,获取下标,并通过下标获取粗分类标签和细分类标签,代码如下:

% [B, IX] = sort(p, 2, 'descend');
[B, IX] = sort(p, 2);
B = B(:, 1:10);
IX = IX(:, 1:10);
coarse_label10 = train_coarse(IX);
fine_label10 = train_fine(IX);

 

三、计算精度

测试图像一共10000张,对每张测试图像检索最相似的10张训练图像,因此最后一共得到10*10000=100000张图像,这里的精度算的是100000张图像中有多少与相应测试图像的粗分类标签或细分类标签匹配,计算公式就是匹配的数量/100000,代码中的cnt_coarse是算的粗分类精度,cnt_fine是算的细分类精度。这里也是矩阵运算,先将测试图像的标签复制10列,然后与训练图像的标签矩阵相减,相减等于0说明两个标签匹配,注意要将矩阵先转换成double类型,否则MATLAB会认为是图像矩阵相减,本应得到的负数会变成0,导致精度计算错误,代码如下:

test_coarse10 = repmat(test_coarse, 1, 10);
test_fine10 = repmat(test_fine, 1, 10);
cnt_c = double(coarse_label10) - double(test_coarse10);
cnt_f = double(fine_label10) - double(test_fine10);
cnt_coarse = length(find(cnt_c == 0)) / 100000;
cnt_fine = length(find(cnt_f == 0)) / 100000;

 

四、结果

运行结果如下表格,可以看到颜色直方图+直方图相交法的精度 > 颜色直方图+欧氏距离 > 颜色矩+欧氏距离:

方法粗分类精度细分类精度
颜色直方图+直方图相交法17.33%8.49%
颜色直方图+欧氏距离15.89%7.45%
颜色矩+欧氏距离13.34%5.71%

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值