zoukankan      html  css  js  c++  java
  • 图像搜索(二)-全局特征

    图像搜索(二)-全局特征

    最直观及理想化的特征,就是把二维图像之间的相似性,转变成几个数字(或字符串)之间的相似性,这种简朴算法得到的特征结果可称之为该图像的指纹。

    一个图像的像素级别的量很大,而且是个二维的,如1024 * 768 = 736432(而且是多通道的,如RGB)大小的图像,要在这种数量级上进行相似度比较,没有可行性。但图像的轮廓在不同的大小尺寸下基本还是相似的,另一方面,对大规模数据相似性匹配而言,1+0组成的二值数据无疑是最快的;在此思路下,我们借用直方图+均值的概念,来进行指纹的提取,步骤如下:

    1. 把图像缩小到固定大小,如8 * 8,去掉复杂信息,保留大致轮廓;
    2. 简化色彩通道,灰度化,由单一通道信息代表多通道(会有缺陷);
    3. 将所有像素的灰度值加起来求简单均值;
    4. 将所有像素与均值来比较大,大或等于的为1,小的为0;
    5. 将上述0,1组合起来,得到一个hash值,即为图像的指纹。

    匹配时,将两个hash值求汉明距离,值为0的为一模一样,1的高度相似等,依次类推,这个方法称之为均值哈希算法。

    看到这个算法的时候,各位第一个感觉是不是,这太简单了吧,它真的有效吗?事实上,很多的相似图可以通过这个办法找出来,像下图左那样,它的hash值的图压根就看不出是个什么东西了,居然还能做相似的匹配,而且一定情况下,还是挺有效的(变形程度不超过25%,它们就能匹配原图)。

    改进一

    上述方法是简单,但存在很多问题,受均值的影响非常大,如伽马校正或颜色直方图被调整后,这个方法就不行了;但我们可以根据信号理论来改进:一张图片就是一个二维信号,它包含了不同频率的成分。亮度变化小的区域是低频成分,它描述大范围的信息。而亮度变化剧烈的区域(比如物体的边缘)就是高频的成分,它描述具体的细节。或者说高频可以提供图片详细的信息,而低频可以提供一个框架。对我们缩小后的图片来说,缺乏图像细节,大部分都是低频的。我们平时说的下采样,也就是缩小图片的过程,实际上是损失高频信息的过程。
    改进一:利用图片的低频信息,在频率域进行指纹获取,其有变化的工作过程如下:

    它将图像从像素域变换到频率域,通过离散余弦变换(DCT)来获取图片的低频成分。一般图像都存在很多冗余和相关性的,所以转换到频率域之后,只有很少的一部分频率分量的系数不为0,大部分系数都为0(或者说接近于0),换句话说,图像的能量几乎都集中在左上角这个地方的低频系数上面了;所以我们可以缩放到较大的尺寸(如由88变为6464),然后只取左上角的8*8区域来获取64位的Hash值,其它步骤(包括匹配)与上述的一样。

    这种算法称之为感知哈稀算法,只要图片的整体结构保持不变,hash结果值就不变。

    这种方法的优点是,具有比较好的尺度不变性以及光照不变性;以及优良的空间点用,计算速度快!

    同样的,缺点非常大,误配多,尤其是很多商品图(如穿在同一模特上的样式大致相同的衣服)的低频域信息很相似,以及众商品图在拷贝时带来的边框和背景误差,都会带来错误匹配。

    改进二

    增加64bit哈希码的识别能力,加入空间信息,分区块提取hash码;加入颜色识别码和颜色置信度;同时考虑加入开头信息,使用少量的形状基;其具体方法基本都是基于统计方法然后二值化;

    通过以上种种手段所得到的指纹,已经能区别大部分拷贝图(或轻变形图)了,而且精度非常高(9?%),因为这种算法的要求就是,轻量级,速度快,重精度,轻召回。

    特点:此类算法均充分利用了统计量化的原理,同样的算法可以用在颜色、纹理等其它全局性的特征中,这类特征可以判断几张图的整体上相似,但对局部特性和噪声都比较敏感;因此加入空间信息(金字塔)来进行指纹抽取的升级是一个比较好的思路。

    本算法充分体验了“简约而不简单”的算法之美,但图像搜索所面向的对象绝非简单的拷贝图,它的缺陷也非常明显,除尺度/光照以及微形变以外,其它不变性都难以应付,而且判断两图是否相似的阈值也比较难以把握;

    知识点

    汉明距离,均值hash算法

    汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。

    汉明重量是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是 1 的个数,所以 11101 的汉明重量是 4。

    计算一个数字的比特位包含1的个数有个小技巧:value &= value - 1这个运算的结果就是把value最后一个1去掉,循环进行运算直到value等于0(所有的1都被去掉)就可以知道vaule拥有多少个1了。

    伽马校正及颜色直方

    伽马校正:伽马校正就是对图像的伽马曲线进行编辑,以对图像进行非线性色调编辑的方法,检出图像信号中的深色部分和浅色部分,并使两者比例增大,从而提高图像对比度效果。

    实际的图像系统是由多个部件组成的,这些部件中可能会有几个非线性部件。如果所有部件都有幂函数的转换特性,那么整个系统的传递函数就是一个幂函数,它的指数γ 等于所有单个部件的g 的乘积。如果图像系统的整个γ =1,输出与输入就成线性关系。这就意味在重现图像中任何两个图像区域的强度之比率与原始场景的两个区域的强度之比率相同,这似乎是图像系统所追求的目标:真实地再现原始场景。但实际情况却不完全是这样。

    颜色直方:
    对一幅灰度图像从上到下,从左到右扫描每个像素值,在每个灰度值上计算像素数目,以这些数据为基础完成图像直方图的绘制。

    JAVA实现

    下采样

    缩小图片

    离散余弦变换

    离散余弦变换(DCT for Discrete Cosine Transform)是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transform),但是只使用实数。离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的(因为一个实偶函数的傅里叶变换仍然是一个实偶函数),在有些变形里面需要将输入或者输出的位置移动半个单位(DCT有8种标准类型,其中4种是常见的)。

    DCT 将原始图像信息块转换成代表不同频率分量的系数集,这有两个优点:其一,信号常将其能量的大部分集中于频率域的一个小范围内,这样一来,描述不重要的分量 只需要很少的比特数;其二,频率域分解映射了人类视觉系统的处理过程,并允许后继的量化过程满足其灵敏度的要求。

    当u,v = 0 时,离散余弦正变换(DCT)后的系数若为F(0,0)=1,则离散余弦反变换(IDCT)后的重现函数 f(x,y)=1/8,是个常 数值,所以将 F(0,0) 称为直流(DC)系数;当 u,v≠0 时,正变换后的系数为 F(u,v)=0,则反变换后的重现函数 f(x,y) 不是常数,此时 正变换后的系数 F(u,v) 为交流(AC)系数。
      
    DCT 后的64个 DCT 频率系数与 DCT 前的64个像素块相对应,DCT 过程的前后都是64个点,说明这个过程只是一个没有压缩作用的无损变换过程。

    [DCT JAVA实现](http://blog.csdn.net/luoweifu/article/details/8214959](http://blog.csdn.net/luoweifu/article/details/8214959):

    64bit 哈希码,金字塔

    空间金字塔模型(Spatial Pyramid Matching, SPM)对图像进行不同粒度的切分,构造多个不同尺度的子块(关于尺度的介绍,可以查询小波分析),然后同样按照BOW模型分别统计子块中的特征表达(直方图),最后拼接所有子块中的特征作为图像的特征描述。SPM模型流程如图3所示。

    原始方法是首先提取原图像的全局特征,然后在每个金字塔水平把图像划分为细网格序列,从每个金字塔水平的每个网格中提取出特征,并把它们连接成一个大特征向量。但由于图像中每个局部区域反映的信息量不同,由此提出加权空间金字塔方法,及给每层每网格分配一个权重,按权重把每层每网格特征加权串联在一起。

    图像金字塔:

    金字塔是图像多尺度表示的主要形式,图像金字塔是以多分辨率来解释图像的一种有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像集合。如下图所示。

  • 相关阅读:
    django学习笔记(一)
    Python之函数进阶
    Python之函数初识
    Python之文件操作
    基础补充
    字典
    神奇的列表
    万能的字符串
    Python基础(二)
    使用paramiko进行ssh连接
  • 原文地址:https://www.cnblogs.com/zhulongchao/p/6391670.html
Copyright © 2011-2022 走看看