一、Bag of features算法
1、算法原理
Bag of features算法一种是用于图像和视频检索的算法,该算法对于不同角度、光照的图像,基本都能在图像库中正确检索。
2、算法步骤
(1)收集图片,用sift算法生成图像库中没附图的特征及描述符。
(2)用K-means算法对图像库中的特征点进行训练,生成类聚中心。
(3)通过判断图像的每个特征点与那个类心最近,最近则放入该类心,最后生成一列频数表,生成每幅图像的BOF。
(4)对需要查询的图片不断进行(3)操作,生成一列查询图片的BOF。
(5) 将得到的BOF向量与图像库中每幅图的BOF向量求夹脚,夹脚最小的即为匹配对象。
3、补充:K-means算法
K-means算法是一种类聚算法,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。
K-means算法步骤:
(1)从数据中选择K个对象作为初始类聚中心。
(2)计算每个类聚对象到类心的距离。
(3)计算标准测度函数,直到达到最大迭代次数,停止。
4、BOF算法的流程
1、准备一个训练图片集,提取这些图片的SIFT特征
2、对这些特征进行K-Means聚类,创建视觉词典。
3、针对输入特征集,根据视觉词典进行量化
4、输入测试图片,提取测试图片的SIFT特征,把输入图像转成视觉单词的频率直方图。
5、构造特征到图像的倒排表,通过倒排表快速索引相关图像。
6、根据索引结果进行直方图匹配
数据集
代码
(1)提取每张图片的sifi特征,生成词汇表。
# -*- coding: utf-8 -*-
import pickle
from PCV.imagesearch import vocabulary
from PCV.tools.imtools import get_imlist
from PCV.localdescriptors import sift
#获取图像列表
# imlist = get_imlist('D:/pythonProjects/ImageRetrieval/first500/')
imlist = get_imlist('D:/pythonProjects/ImageRetrieval/animaldb/')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]
#提取文件夹下图像的sift特征
for i in range(nbr_images):
sift.process_image(imlist[i], featlist[i])
#生成词汇
voc = vocabulary.Vocabulary('ukbenchtest')
voc.train(featlist, 1000, 10)
#保存词汇
# saving vocabulary
with open('D:/pythonProjects/ImageRetrieval/animaldb/vocabulary.pkl