LATCH: Learned Arrangements of Three Patch Codes

简介

该算法是二值化特征描述方法的一个优化变种,通常的二值化特征描述主要经过计算特征点窗口内n个点对的比较值造成一个bit串,做为该特征点的特征描述子,这样的bit串特征描述子在图像匹配计算时能够经过同或计算汉明码,大大提升计算速度,可是点对的比较会有一个明显的缺点,就是受噪声影响较大,虽而后续的一些算法经过高斯模糊进行滤波,可是滤波后图像信息会有必定减小,创建在此基础上,做者提出了一种经过计算窗口内像素块的比较值造成bit串,同时做者也提出了如何定位像素块的方法。html

该特征的特色web

  1. 此为特征的binary描述子,其特征模式须要学习(可能受限于训练场景,与fast有类似的问题);
  2. 特征描述时能接受特征检测子的方向信息而进行相应旋转,故描述子具旋转不变性;
  3. 耗时介于binary特征和非binary特征之间,判别性也介于binary特征和非binary特征之间;

像素块比较

假设特征点窗口内有3个块 P1 , P2 , P3 ,每一个块包含 m×m 个像素,每一个块能够用一个 m×m 矩阵表示,块之间的比较为Frobenious norm,即两块中各个像素对应位置处像素差的平方和,所以该特征点处该像素块对应的特征能够表示为:
算法

g(W,st)={1ifPt,aPt,12F>Pt,aPt,22F0otherwise

若须要256 bits长的特征描述子,则须要选择256个3像素块,每一个3像素块获得一个bit结果。svg

像素块模式

在像素块比较中须要计算像素块内各个像素点的值,所以计算前提是定位像素快,一个很小的特征窗口可以产生很是多的像素块的组合,有些像素块对图像匹配不重要,有些很是重要,本节主要介绍如何选择像素块的组合方式使得匹配结果最优。本文中像素块位置的肯定是经过有监督学习的方法进行。wordpress

数据集

首先构造一个训练数据集,该数据集来自Learning Local Image Descriptors Data,如下用LLIDD表明该数据集,LLIDD数据集主要对三个场景(Literty, Ntore Dame , Halp Dome)的3D场景构造图像中处理而来,首先经过Noah Snavely’s Photo Tourism算法计算3D构造图初始特征点,再经过立体深度地图匹配不一样图像只可以对应的特征点,而数据集则是特征点领域内64x64的图像块。同时创建标签文件,记录各个图像块是不是来自同一目标。本文做者在LLIDD数据集的基础上建立了一个50k的数据样本对,每对数据样本包括两个图像块,同时有一个标签表示两个图像块是否相同,最终数据集包括一半匹配一半不匹配的图像块。 性能

训练

随机产生56k个3像素快,即
学习

S={St}t=1...T={[Pt,1,Pt,1,Pt,3]}t=1...T      T=56000

再用每一个3像素块去对每一个数据对进行匹配,若匹配结果与标签结果相同则赋予一个值为1的bit,若不相同则赋予一个值为0的bit,这样对数据集中全部数据对匹配后将产生一个长度为50k的bit串,将bit串中每位值相加即为该像素快的匹配能力。对全部像素块都进行该运算后再对匹配能力进行排序,同时删除与前面3像素快相关度大于0.2的3像素快(下降最终triplets之间的相关性)。另外在程序计算描述子的时候3像素块的选取采用增量各点选取的方法(0, 6, 12,…)。这样选取最大的n个做为3像素快候选集。

性能

耗时方面

特征描述计算耗时高于其余binary特征,低于非binary特征,如下是计算一个特征点时的耗时。
这里写图片描述优化

精度方面

匹配精度高于其余binary特征,低于非binary特征。ui

代码

描述子计算伪代码:this

PatchSize = 7 * 7   // 图像块大小
BytesLength = 32    // 每一个特征描述子的长度 单位:Byte
descriptors = Mat(Keypoints.length, BytesLength, Byte) // 描述子初始化 为一个类型类Byte的
grayScale = convertToGray(img)
foreach keyPoint in Keypoints:
    for i = 1 to BytesLength:
    descriptors[k][i] = 0
        for j = 0 to 7
            get one tripet Pathes P1 P2 P3 their position
            rotate the pixel in P1 P2 P3 to the direction of the Keypoint
            compute the bit result: b = (P1-P2) > (P3-P2) ? 1 : 0
            descriptors[k][i] += (Byte)b<<j