一般来说,在计算机视觉任务中,形状匹配可以分为
形状上下文作为一种基于特征的描述子,根据两幅图片轮廓采样点之间的相互关系(如距离、梯度),提供了一种较为鲁棒的形状匹配策略。
下面我们一步一步来探讨形状上下文算法。
轮廓提取
对于轮廓的提取,我们采用canny算子,主要步骤分为
这里不再细说,下面带大家看一看轮廓采样这一步骤。
轮廓采样
对于一般图像,如果采样给定个数的像素点,我们可以使用均匀采样、随机采样、等间隔采样等方式。但是对于二维轮廓点集来说,因为它的分布并不是均匀的,所以这些方法并不适用。
图1、图2是使用canny算子提取的轮廓,图3、图4是随机采样100个点得到的采样结果,可以看到采样过后轮廓信息出现了一定的丢失。如果我们想得到图5、图6这样的采样结果,该如何去做呢?
一种朴素的想法就是:我们是否可以将轮廓点对之间的欧式距离考虑到采样步骤中,得到一个 相对均匀(或者说是,点对间足够分散) 的的轮廓采样结果呢?比如说,每次剔除最短距离点对中的任意一个点,并解除它与其他点之间的距离关系,依次重复,直至点对只剩下所需数目的点集。
这个就是Jitendra’s sampling的思路,下面附上Jitendra采样的流程:
下面附上论文样例中这部分的Matlab源码:
function [xi,yi,ti]=get_samples_1(x,y,t,nsamp);
% [xi,yi,ti]=get_samples_1(x,y,t,nsamp);
%
% uses Jitendra's sampling method
N=length(x);
k=3;
Nstart=min(k*nsamp,N);
ind0=randperm(N);
ind0=ind0(1:Nstart);
xi=x(ind0);
yi=y(ind0);
ti=t(ind0);
xi=xi(:);
yi=yi(:);
ti=ti(:);
d2=dist2([xi yi],[xi yi]);
d2=d2+diag(Inf*ones(Nstart,1));
s=1;
while s
% find closest pair
[a,b]=min(d2);
[c,d]=min(a);
I=b(d);
J=d;
% remove one of the points
xi(J)=[];
yi(J)=[];
ti(J)=[];
d2(:,J)=[];
d2(J,:)=[];
if size(d2,1)==nsamp
s=0;
end
end
对于轮廓中的点对,哪些信息对于形状匹配起到贡献呢?
那么对于每个轮廓点,我们可以构建以其为中心的极对数坐标系 log-polar coordinates(包括12个角度区域和5个距离区域,如下图c),再将它周围的轮廓点映射到每个区域内,然后统计落在每个区域的轮廓点数,最后进行归一化处理(即除以落在所有区域中的轮廓点数)。这样子我们就生成了形状上下文直方图矩阵。如下图所示,我们可以直观的看到,相似度d-e > 相似度d-f。
一些Tips:
% use a log. scale for binning the distances
r_bin_edges=logspace(log10(r_inner),log10(r_outer),5);
角度矩阵的求法也是如上图,相对简单。
求解完距离矩阵和角度矩阵就可以做区域映射了,统计各个区域内点数。如果这里我们采样100个轮廓点,将会生成100×60大小的矩阵。
别忘了做归一化处理。
此时,形状上下文直方图矩阵就构建完成了。下面我们使用卡方统计χ2 来计算点输入图与点模板图的相似度。
经过之前的计算,我们获得了输入图像 和模板图像 的N(100)×K(60)的形状上下文直方图矩阵,对于输入图像和模板图像中的每一个点,都有K维的直方图向量,分别记作 g(k) 和 h(k), 并代入卡方公式计算相似度度量矩阵:
这里解释一下为什么是N×N的矩阵:输入和模板图像均采样N个轮廓点(也可以采样不同的轮廓点数,再通过后续我们所说的伪点策略做匹配),然后对于两张图片每个点对,将 g(k) 和 h(k) 带入卡方公式,可以计算出一个Cs。所以一共生成了N×N的矩阵。
根据形状上下文直方图矩阵,我们获得到了全局信息,即全局点对目标点的一个方位矩阵,类似于在不同方向、角度轮廓上点集的密度。那么接下来,我们考虑再添加一个局部外观信息来约束局部特征。
局部外观信息有很多,例如
我们在这里考虑使用局部方向(local orientation) 作为形状上下文的局部外观信息。
为什么可以这么定义呢,我们来看下图,假设有一个半径为1的圆,那么对于 θ1,θ2,通过余弦和正弦将其转化到欧氏空间中,再计算它们的欧式距离,就可以衡量两个角度的相似性了。
一些Tips:
可以对切向角非相似性函数做变换,得到一个简单的计算公式:
最后一步就是将两个相似度度量矩阵进行加权求和,输出总相似度度量矩阵:
Cs对应于形状上下文(Shape Context), CA对应于局部外观(local Appearance),论文给的 β=0.1。
匈牙利匹配是一种常见的二部图匹配,复杂度O(N3),常用的场景有:
在这里我们将之前的相似度度量矩阵抽象成距离矩阵,使用匈牙利算法的目的就是求出使得总损失最小的点对匹配。具体步骤如下:
下面给出两个例子:
我们想一想为什么可以这么做:
下面链接是匈牙利算法在线测试的链接:
经过匈牙利算法后,两幅图片(digit-0,digit-3)的对应关系就找到了,我们将对应关系用白线连接起来:
由上图可以直观的发现,大部分的点对关系已经找到。但是仍然有一部分(中间)点对硬生生的进行了匹配。这是我们不太希望的。我们是不是可以添加一个阈值,使得这些匹配损失非常大的点对不进行匹配呢?
下面我们引入了伪点匹配。
通过添加伪点,
下面我们具体看一看如何实现伪点匹配。
这意味着,对于点A,如果此时没有其损失小于阈值的匹配点可用时,将被分配一个伪点。
下图展示了伪点匹配对于匹配结果的影响,左为不添加伪点的情况,右为添加伪点的情况:其中伪点个数为轮廓点的0.25,且损失为0.25。
通过匈牙利以及伪点匹配策略,我们从2N个轮廓点中获得了S个匹配度很高的匹配点对。我们又萌发了一种想法:就是能不能通过这S个匹配点对,将输入轮廓做一次变形,使其更加接近于模板轮廓呢?然后对于变形后的轮廓与模板轮廓,再次寻找匹配度高的匹配点对呢?
于是我们引入了薄板样条插值(TPS)函数来对输入轮廓做变形,使得总弯曲能量达到最小。
薄板样条插值是一种常见的插值方法,经常用于二维图像配准中。通过将N个主点(Dominant Point)变形到对应位置,求出相应的位移场,然后计算其他区域点变换后坐标。如下图:
对于一般插值方法而言,插值的首要约束就是:
给定插值点(rj, tj),设法构造一个连续光滑的函数y = f(x),使得函数曲线(面)通过所有插值点,即f(rj)=tj。于是目标函数可以写成一下形式:
对于多谐波样条插值(Polyharmonic Spline)而言,添加基于梯度的平滑项(正则项):
薄板样条插值是多谐波样条插值的特例(m=2)
我们将正则化项中λ称为正则化参数,积分部分称为弯曲能量,即:
我们可以把薄板样条插值函数想象成一个弯曲的薄钢板,使它穿过顶点,找到使得弯曲能量最小的插值函数。
其中Φ( r ) = r2lnr 是TPS的径向基核函数,其二维图片如下:
经[1]证明,f(x)上述函数是使得弯曲能量最小的插值函数。它可以看成非变形项/线性项(a0+a1x+a2x)加上变形项(后面部分)构成。线性项定义了一个平面对于所有控制点的最佳匹配,可以看成最小二乘拟合,而非线性项可以看作与控制点提供的弯曲率有关。如下图,当正则化参数λ越大时,越接近于最小二乘拟合。
由于插值函数有N+3个条件,而我们有N个(点对)约束,于是我们再添加3个约束条件,如下:
这三个条件连同插值条件一起,可以写成如下矩阵形式:
最终求得
下面附上论文样例中TPS/Bookstein 的Matlab源码并给出注释:
function [cx,cy,E,L]=bookstein(X,Y,beta_k);
% [cx,cy,E,L]=bookstein(X,Y,beta_k);
%
% Bookstein PAMI89
N=size(X,1); % 轮廓点集1
Nb=size(Y,1); % 轮廓点集2
if N~=Nb % 判断轮廓点集是否相同
error('number of landmarks must be equal')
end
% compute distances between left points
r2=dist2(X,X) % 求距离
K=r2.*log(r2+eye(N,N)); % add identity matrix to make K zero on the diagonal 求A矩阵(径向基部分)
P=[ones(N,1) X]; % 构造B矩阵
L=[K P
P' zeros(3,3)]; % 构造L矩阵 (Lc = V)
V=[Y' zeros(2,3)]; % 构造V矩阵
if nargin>2
% regularization
L(1:N,1:N)=L(1:N,1:N)+beta_k*eye(N,N); %如果有正则化项
end
invL=inv(L); % 求L的逆
c=invL*V'; % 求c矩阵 这里c = [c a]T
cx=c(:,1); % x方向
cy=c(:,2); % y方向
if nargout>2
% compute bending energy (w/o regularization)
Q=c(1:N,:)'*K*c(1:N,:);
E=mean(diag(Q)); % 求解弯曲能量
end
在多轮迭代过程中求取经TPS变形后的图像与模板图像之间的形状上下文,再使用匈牙利匹配寻找点对关系。如下图(左为变形过程及各个损失的输出值,右为匈牙利算法求得的匹配点对):
经过多轮(n = 5)迭代之后,我们就可以计算总损失来判断输入图像和模板图像的相似度了:
形状上下文距离Dsc:
形状上下文距离通过使用对称加和来得到,即对于总相似度度量矩阵,加权每行最小损失值除以列数以及每列最小损失值除以行数。公式如下:
其中T为Q(输入图像)
的TPS变换。
外观距离Dac:
通过高斯窗函数,求出以P(模板图像
)中轮廓点及经过TPS变换后的Q(输入图像)
中轮廓点为中心及周边的亮度差平方的均值。
最后使用经验公式来求出模板和输入图像的相似度,公式如下:
也可以用该相似度作为k-NN分类器的分类指标来进行数字识别。
最后给出形状上下文(Shape Context)的流程:
以及,形状上下文论文以及matlab实现的地址
如果想深入理解薄板样条插值及推导过程,附上薄板样条插值源论文(1篇)以及对应公式的推导(2篇)的下载链接
[1] Kent, J. T. and Mardia, K. V. (1994a). The link between kriging and thin-plate splines. In: Probability, Statistics and Optimization: a Tribute to Peter Whittle (ed. F. P. Kelly), pp 325–339. John Wiley & Sons, Ltd, Chichester. page 282, 287, 311
[2] Belongie S , Mori G , Malik J . Matching with shape contexts[C]// IEEE Workshop on Content-based Access of Image & Video Libraries. IEEE Computer Society, 2000.
[3] Belongie S , Malik J , Puzicha J . Matching Shapes[C]// IEEE International Conference on Computer Vision. IEEE, 2001.
[4] Belongie, S, Malik, J, Puzicha, J. Shape matching and object recognition using shape contexts[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2002, 24(4):509-522.