当前位置:   article > 正文

图像检索

图像检索

一、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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106

三、图片集

在这里插入图片描述

四、结果

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/283514
推荐阅读
相关标签
  

闽ICP备14008679号