图像检索

图像检索

  • 一、BOF图像检索
    • 1.1简介
    • 1.2流程
  • 二、代码
    • 2.1sift特征匹配
    • 2.2图片集特征提交到数据库
    • 2.3图片检索
  • 三、图片集
  • 四、结果

一、BOF图像检索

1.1简介

Bof,即Bag of features,中文翻译为“词袋”,是一种用于图像或视频检索的技术。而检索就要进行比对。两幅不同的图像如何比对,比对什么,这就需要提炼出每幅图像中精练的东西出来进行比较。正如超市中的条形码,就能很好的反映出一件商品的所有特征。因此概括的来说,bof就是生成每幅图像的“条形码”来进行检索。

1.2流程

1.特征提取:通过sift算法提取图像特征。
2.学习“视觉词典”。
3.针对输入特征集,根据视觉词典进行量化。
4.把输入图像,根据TF-IDF转化成视觉单词(visual words)的频率直方图。
5.构造特征到图像的倒排表,通过倒排表快速索引相关图像.根据索引结果进行直方图匹配。

二、代码

2.1sift特征匹配

# -*- coding: utf-8 -*

import pickle

from PCV.imagesearch import vocabulary

from PCV.tools.imtools import get_imlist

from PCV.localdescriptors import sift

# 要记得将PCV放置在对应的路径下


# 获取图像列表

imlist = get_imlist('D:/pycharm/untitled1/image/')  # 存放数据集的路径

nbr_images = len(imlist)  # 获取数据集的长度

# nbr_images = 300  # 可以是自己选择用多少张图片作为训练数据集

# 获取特征列表

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('imglltest')

voc.train(featlist, 300, 10)

# 保存词汇

with open('D:/pycharm/untitled1/vocabulary.pkl', 'wb') as f:
    pickle.dump(voc, f)

    print 'vocabulary is:', voc.name, voc.nbr_words

2.2图片集特征提交到数据库

# -*- coding: utf-8 -*-

import pickle

from PCV.imagesearch import imagesearch

from PCV.localdescriptors import sift

from sqlite3 import dbapi2 as sqlite

from PCV.tools.imtools import get_imlist

# 要记得将PCV放置在对应的路径下


# 获取图像列表

imlist = get_imlist('D:/pycharm/untitled1/image/')  # 存放数据集的路径

nbr_images = len(imlist)

# nbr_images = 300

# 获取特征列表

featlist = [imlist[i][:-3] + 'sift' for i in range(nbr_images)]

# 载入词汇

with open('D:/pycharm/untitled1/vocabulary.pkl', 'rb') as f:  # 读取再上一步中保存的.pkl文件

    voc = pickle.load(f)

# 创建索引

index = imagesearch.Indexer('testImaAdd.db', voc)  # 创建数据库

index.create_tables()  # 创建数据库表单

# 遍历所有的图像,并将它们的特征投影到词汇上

for i in range(nbr_images)[:300]:
    locs, descr = sift.read_features_from_file(featlist[i])

    index.add_to_index(imlist[i], descr)

# 提交到数据库

index.db_commit()

con = sqlite.connect('testImaAdd.db')  # 连接到数据库

print con.execute('select count (filename) from imlist').fetchone()  # 数据库操作

print con.execute('select * from imlist').fetchone()

2.3图片检索

# -*- coding: utf-8 -*-

import pickle

from PCV.localdescriptors import sift

from PCV.imagesearch import imagesearch

from PCV.geometry import homography

from PCV.tools.imtools import get_imlist

# 要记得将PCV放置在对应的路径下

# 载入图像列表

imlist = get_imlist('D:/pycharm/untitled1/image/')  # 存放数据集的路径

nbr_images = len(imlist)

# nbr_images = 300

# 载入特征列表

featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]

# 载入词汇

with open('D:/pycharm/untitled1/vocabulary.pkl', 'rb') as f:  # 存放模型的路径

    voc = pickle.load(f)

src = imagesearch.Searcher('testImaAdd.db', voc)

imlist = get_imlist('D:/pycharm/untitled1/image/')  # 存放数据集的路径

# 查询图像索引和查询返回的图像数

q_ind = 030    # 查询图片的索引

nbr_results = 5

# 常规查询(按欧式距离对结果排序)

res_reg = [w[1] for w in src.query(imlist[q_ind])[:nbr_results]]

print 'top matches (regular):', res_reg

# 载入查询图像特征

q_locs, q_descr = sift.read_features_from_file(featlist[q_ind])

fp = homography.make_homog(q_locs[:, :2].T)

# 用单应性进行拟合建立RANSAC模型

model = homography.RansacModel()

rank = {}

# 载入候选图像的特征

for ndx in res_reg[1:]:

    locs, descr = sift.read_features_from_file(featlist[ndx])

# 获取匹配数

# get matches执行完后会出现两张图片

matches = sift.match(q_descr, descr)

ind = matches.nonzero()[0]

ind2 = matches[ind]

tp = homography.make_homog(locs[:, :2].T)

# 计算单应性,对内点技术。如果没有足够的匹配书则返回空列表

try:

    H, inliers = homography.H_from_ransac(fp[:, ind], tp[:, ind2], model, match_theshold=4)

except:

    inliers = []

# 存储内点数

rank[ndx] = len(inliers)

# 将字典排序,以首先获取最内层的内点数

sorted_rank = sorted(rank.items(), key=lambda t: t[1], reverse=True)

res_geom = [res_reg[0]]+[s[0] for s in sorted_rank]

print 'top matches (homography):', res_geom

# 显示靠前的搜索结果

imagesearch.plot_results(src, res_reg[:5])  # 常规查询

imagesearch.plot_results(src, res_geom[:5])  # 重排后的结果

三、图片集

图像检索_第1张图片

四、结果

以第一张图片检索输入
图像检索_第2张图片
匹配结果为:
在这里插入图片描述
有三张图片没有匹配成功,结果可能是在创建词汇上,特征描述较为相似,数据集不够大也是造成误配的原因。

你可能感兴趣的:(图像检索)