持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
实验内容
基于内容的图像检索,使用传统方法:基于Hand-Crafted Features方法选择一种特征(如SIFT或颜色直方图、边缘方向直方图等)实现;
数据集
Holidays数据集,下载网址lear.inrialpes.fr/people/jego…
Holidays数据集描述:Holidays数据集包含1491张关于假日场景的图像,该数据集分为500组,每组为2到多张图像。每一组图像的命名规则如下:
图像名字通式为:1abcpq.jpg,第一个字符表示数字1,第2到4个字符所构成的字符串abc表示组号,第5到6个字符所构成的字符串pq表示该组的第几个图像,例如:
l 第1组:100000.jpg, 100001.jpg, 100002.jpg,其中组数k=1, 该组有3张图,每张图序号分别为t=0,1,2;
l 第2组:100100.jpg, 100101.jpg 其中组数k=2, 该组有2张图,每张图序号分别为t=0,1;
l 第3组:100200.jpg, 100201.jpg其中组数k=3, 该组有2张图,每张图序号分别为t=0,1;
l ……
l 第499组:149800.jpg, 149801.jpg,其中组数k=499, 该组有2张图,每张图序号分别为t=0,1;
l 第500组:149900.jpg, 149901.jpg, 149902.jpg,其中组数k=500, 该组有3张图,每张图序号分别为t=0,1,2;
实现思想
本次实验的图像检索基本可以分为如下步骤:
1. 提取图像特征
已知所有图像的中间部分在颜色空间或构图上有显著的区别,故可以以中心为圆心绘制椭圆mask,加强对中间部分的分析,从而更加高效地提取图像特征。
2. 图像特征的存储
将图像特征量化为数据存放于索引表中,并存储在外部存储介质(csv文件)中,搜索图片时仅搜索索引表中的图像特征,按匹配程度从高到低查找类似图像。对于图像尺寸分辩率不同的情况可以采用降低采样或归一化方法。
3. 相似度匹配
由于存储的是特征向量,则比较特征向量之间的加权后的平方距离。距离越低,则两个图像的相似度越高。若距离为0,则表示两个图像相同。
实现过程及方法
(一) 颜色空间特征提取及存储
1. 颜色空间特征提取
编辑颜色空间特征提取器color_descriptor,通过传入的bins以及weight构造:
其中类成员bins是每个维度参与直方图计算的组数histSize,用于记录HSV色彩空间生成的色相、饱和度及明度分布直方图的最佳bins分配,后续取值(8,12,3)。而类成员weight用于后续判断中心区域后对色彩特征向量进行加权处理,后续取值5.0。
接着实现能够生成图像的色彩特征分布直方图的成员函数getHistogram(self, image, mask, isCenter):
其中,image为待处理图像,mask为图像处理区域的掩模,isCenter判断是否为图像中心,从而有效地对色彩特征向量做加权处理。采用OpenCV的calcHist()方法获得直方图,normalize()方法归一化。需要注意的是,该函数处理的是HSV色彩空间生成的色相、饱和度及明度分布直方图
最后成员函数describe(self, image)的实现如下:将图像从BGR色彩空间转为HSV色彩空间(此处应注意OpenCV读入图像的色彩空间为BGR而非RGB)。生成四个矩形角落与椭圆形中心部分的掩模。在getHistogram()方法中对不同部位的色彩特征做加权处理。
2. 颜色空间特征存储
新建一个csv文件,并提前准备好具有3张图片的小数据集文件夹:
编辑测试程序test_color_descriptor.py,调用glob文件通配符匹配文件夹下的所有(3张)jpg图像文件,调用颜色空间特征提取器,将提取到的特征向量写入到csv文件中:
运行后效果如下:
(二) 构图空间特征提取及存储
构图空间特征提取器的实现较简单,通过opencv中的resize方法,将所有图片归一化(降低采样)为dimension所规定的尺寸,用于统一的匹配和构图空间特征的生成。初始构造时仅需指定降低采样的尺寸dimension即可。
StructureDescriptor类如下:
由于在调用该提取器之前(色彩空间特征提取器)已经将传入的image由原先的BGR色彩数组转成了HSV,故describe步骤中无需转换色彩空间。
实现构图空间特征索引表的存储与上述色彩空间特征索引表的存储同理,具体实现见下一步骤。
(三) 图像索引表构建驱动
综合上述两个特征提取器,通过参数输入实现不同的图像数据集、色彩空间特征索引表以及构图空间特征索引表的选择,并在index.py中调用相关类功能,写入色彩空间特征向量以及构图空间特征向量的索引表。
首先,需要引入argparse库中的ArgumentParser,通过指定参数dataset,colorindex以及structureindex来指定对应的文件路径。
接着引入上述两个特征提取器,仿照色彩空间特征向量存储的测试程序,通过glob文件通配符匹配数据集下的所有jpg文件,通过生成索引表文本后写入对应的csv文件中。
色彩空间特征向量提取代码如下:
同理,构图空间特征提取如下:
运行该驱动程序index.py,调用指令如下:
python index.py -d E:\PycharmProjects\image-retrieval\dataset -c E:\PycharmProjects\image-retrieval\color.csv -s E:\PycharmProjects\image-retrieval\structure.csv
结果如下:
除了原先写入的color.csv文件外,同时也会写入构图空间特征到structure.csv。
(四) 图片搜索匹配
思路: 通过上述特征索引表驱动,可以实现将数据集的所有图像存储到两种特征向量的索引表中,而通过特征提取器,可以提取指定query图像的特征向量,剩下需实现匹配query图像的特征向量以及索引表中的数据。
编辑searcher类,其中核心的搜索匹配逻辑如下:
函数searchByColor实现如下:通过使用csv模块中的reader读取索引表数据,用字典featureResults存储query特征向量与数据集中特征向量的距离。
其中,需要记录两张图片之间的平均向量的距离值distance,为了避免出现相同的图像而出现相除为0的情况,增加参数eps最小精度。
构图空间特征向量的比较同理:
其中需要额外转换未处理的query数据为与构图空间特征向量结构相同的数据,transformRawQuery函数如下:
计算距离值如下:
编辑搜索核心函数后,通过驱动程序searchEngine.py调用如下,依旧使用argparse设置命令行参数,额外指定query图像的路径。核心代码如下:
通过构建holidays数据集的索引表后,查询122500.jpg图像结果如下:由于单个图像较大,故以缩略图的形式展示:
经过原数据集对比,可知并非查询到了所有相同类类型的结果:其中122502.jpg未匹配到前三,而121403.jpg的相似程度更高。