Latch-Learned Arrangements of Three Patch Codes (1)

来源:互联网 发布:佛山网页美工培训 编辑:程序博客网 时间:2024/05/20 16:44

Latch:Learned Arrangements of Three Patch Codes

1 简介

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

2 像素块比较方法

假设特征点窗口内有3个块P1, P2, P3 ,每个块包含m x m个像元,每个块可以用一个m x m矩阵表示,块之间的比较为两块中各个像素对应位置处像素差的平方和,设

Sst=i=1mj=1m|Ps(i,j)Pt(i,j)|2
因此该特征点处该像素块对应的特征可以表示为:
f(S,k,P1,P2,P3)={10S12>S32S12S32

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

3 像素快位置

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

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

3.2 训练
随机产生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像素快。另外在程序计算描述子的时候3像素块的选取采用增量各点选取的方法(0, 6, 12,…)。这样选取最大的n个作为3像素快候选集。

3.3 描述子计算伪代码:

PatchSize (2*s+1) x (2*s+1) = (2*3+1) x (2*3+1)   //图像块大小BytesLength = 32                                  //每个特征描述子的长度 单位:ByteCompute(Img, KeyPoints):    descriptors = Mat(Keypoints.length, BytesLength, Byte) //描述子初始化 为一个类型类Byte的                                                        //Keypoints.length x BytesLength矩阵    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
0 0