以图搜图系统概述
以图搜图系统概述
以图搜图指的是根据图像内容搜索出相似内容的图像。
构建一个以图搜图系统需要解决两个最关键的问题:首先,提取图像特征;其次,特征数据搜索引擎,即特征数据构建成数据库并提供相似性搜索的功能。
图像特征表示
介绍三种方式。
图像哈希
图像通过一系列的变换和处理最终得到的一组哈希值称之为图像的哈希值,而中间的变换和处理过程则称之为哈希算法。
图像的哈希值是对这张图像的整体抽象表示。
比如 Average Hash 算法的计算过程:
1.Reduce size : 将原图压缩到 8 x 8 即 64 像素大小,忽略细节。2.Reduce color : 灰度处理得到 64 级灰度图像。3.Average the colors : 计算 64 级灰度均值。4.Compute the bits : 二值化处理,将每个像素与上一步均值比较并分别记为 0 或者 1 。5.Construct the hash : 根据上一步结果矩阵构成一个 64 bit 整数,比如按照从左到右、从上到下的顺序。最后得到的就是图像的均值哈希值。
参考:http://www.hackerfactor.com/blog/?/archives/432-Looks-Like-It.html
图像哈希算法有很多种,包含但不限于:
•AverageHash
: 也叫 Different Hash•PHash
: Perceptual Hash•MarrHildrethHash
: Marr-Hildreth Operator Based Hash•RadialVarianceHash
: Image hash based on Radon transform•BlockMeanHash
: Image hash based on block mean•ColorMomentHash
: Image hash based on color moments
我们最常见可能就是 PHash
。
图像哈希可以对抗一定程度的水印、压缩、噪声等影响,即通过对比图像哈希值的 Hamming distance (汉明距离)可以判断两幅图像的内容是否相似。
图像的哈希值是对这张图像的整体抽象表示,局限性也很明显,由于是对图像整体进行的处理,一旦我们对整体性进行了破坏,比如在原图加一个黑边就几乎无法判断相似性了。
传统特征
在计算机视觉领域早期,创造了很多经典的特征算法,比如 SIFT
如上图所示,通过 SIFT
算法提取出来的一系列的特征点。
一幅图像提取出来的特征点有多个,且每一个特征点都是一个多维的局部向量,为了进行相似性计算,通常需要先将这一系列特征点融合编码为一个全局特征,也就是局部特征向量融合编码为一个全局特征向量(用这个全局特征向量表示一幅图像),融合编码相关的算法包括但不限于:
•BOW
•Fisher vector
•VLAD
CNN 特性
人工智能兴起之后,基于 CNN 卷积神经网络提取图像特征越来越主流。
通过 CNN 提取出来的图像特征其实也是一个多维向量,比如使用 VGG16 模型提取特征可参考: https://keras.io/applications/#extract-features-with-vgg16
搜索引擎
由于将图像转换为了特征向量,因此搜索引擎所要做的就是其实就是向量检索。
这里直接推荐 Milvus ( https://www.milvus.io/ ),刚开源不久,可以很方便快捷的使用在工程项目上,具体的相关内容直接查阅官方文档即可。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则T.5:结合使用泛型和面向对象技术应该增强它们的效果而不是成本
- C++核心准则T.10:为所有的模板参数定义概念
- C语言二级指针用法之模拟句柄用途
- Linux解压缩文件
- C++核心准则T.11:只要可能就使用标准概念
- 给pugjs的stun主题添加canvas时钟
- C++核心准则T.12:声明局部变量类型时,概念比auto更好
- Arch Linux切换rEFInd开机引导程序
- C++核心准则T.13:对于简单的,单类型参数概念,使用缩略记法更好
- VBA编写Ribbon Custom UI编辑器08——实现ZIP的写入
- 用 Python 写个七夕表白神器
- 3分钟短文 | Laravel 用户授权原来内置了这么多方法
- E0144"const char *" 类型的值不能用于初始化 "char *" 类型的实体的三种解决方法
- 数据采集面对JS加密无所适从?善用这3个工具,搞定一大半的JS逆向!
- 点赞功能设计与实现