基于BOF的图像检索

该博客介绍了基于Bag of Feature (BOF)的图像检索方法。首先,概述了BOF算法,强调其通过SIFT特征和聚类中心形成图像特征表示。接着详细阐述了BOF算法的三个步骤:创建词汇、图像索引和搜索图像,并提到引入TF-IDF权重以增强区分度。实验部分展示了图像检索的过程和结果,指出在特征明显或相似图片多的情况下,匹配效果较好,但也提到BOF忽视了特征位置信息和可能存在的文字干扰问题。
摘要由CSDN通过智能技术生成

BOF

Bag of Feature (BOF)算法简介

BOF的本质是提出一种图像的特征表示方法。按照BOF算法的思想,首先我们要找到图像中的关键词,而且这些关键词必须具备较高的区分度。实际过程中,通常会采用SIFT特征。
有了特征之后,我们会将这些特征通过聚类算法得出很多聚类中心。这些聚类中心通常具有较高的代表性,比如,对于人脸来说,虽然不同人的眼睛、鼻子等特征都不尽相同,但它们往往具有共性,而这些聚类中心就代表了这类共性。我们将这些聚类中心组合在一起,形成一部字典。
对于图像中的每个「SIFT」特征,我们能够在字典中找到最相似的聚类中心,统计这些聚类中心出现的次数,可以得到一个向量表示(有些文章称之为直方图),如本文开篇的图片所示。这些向量就是所谓的Bag。这样,对于不同类别的图片,这个向量应该具有较大的区分度,基于此,我们可以训练出一些分类模型,并用其对图片进行分类。

BOF 算法过程

1、创建词汇
2、创建图像索引
3、在数据库中搜索图像

TF-IDF
对于直方图向量,我们引入 TF-IDF 权值
我们需要对每一个词给一个权重。而且这个权重必须满足以下两个条件:
1、一个词对主题预测能力越强,权重越大;
2、停止词权重为 0;

实验代码

创建数据库

from numpy import *
import pickle
import sqlite3
from functools import cmp_to_key
import operator


class Indexer(object):

    def __init__(self, db, voc):
        """ Initialize with the name of the database
            and a vocabulary object. """

        self.con = sqlite3.connect(db)
        self.voc = voc

    def __del__(self):
        self.con.close()

    def db_commit(self):
        self.con.commit()

    def get_id(self, imname):
        """ Get an entry id and add if not present. """

        cur = self.con.execute(
            "select rowid from imlist where filename='%s'" % imname)
        res = cur.fetchone()
        if res == None:
            cur = self.con.execute(
                "insert into imlist(filename) values ('%s')" % imname)
            return cur.lastrowid
        else:
            return res[0]

    def is_indexed(self, imname):
        """ Returns True if imname has been indexed. """

        im = self.con.execute("select rowid from imlist where filename='%s'" % imname).fetchone()
        return im != None

    def add_to_index(self, imname, descr):
        """ Take an image with feature descriptors,
            project on vocabulary and add to database. """

        if self.is_indexed(imname): return
        print('indexing', imname)

        # get the imid
        imid = self.get_id(imname)

        # get the words
        imwords = self.voc.project(descr)
        nb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值