形状上下文(Shape Context)算法完全解读
前言
一. 轮廓提取(Canny Edge Detection)和轮廓点采样(Jitendra's Sampling)
二. 形状上下文(Shape Context)直方图矩阵的构建及其相似度度量方法
三. 局部外观(Local Appearance)描述矩阵的构建及其相似度度量方法
四. 匈牙利匹配(Hungarian)策略
五. 伪点匹配
六. 薄板样条插值(Thin Plate Spline)进行轮廓点拟合
七. 损失函数计算和k-NN分类器进行分类
八. 总结
九. 一些改进
前言
一般来说,在计算机视觉任务中,形状匹配可以分为
基于特征(Feature-based): 基于傅里叶变化、特征点的、骨架的等等。
基于亮度 (brightness-based): 更偏向于使用像素的灰度值来进行形状匹配。
形状上下文作为一种基于特征的描述子,根据两幅图片轮廓采样点之间的相互关系(如距离、梯度),提供了一种较为鲁棒的形状匹配策略。
下面我们一步一步来探讨形状上下文算法。
一. 轮廓提取(Canny Edge Detection)和轮廓点采样(Jitendra’s Sampling)
轮廓提取
对于轮廓的提取,我们采用canny算子,主要步骤分为
高斯平滑
sobel提取梯度幅值和方向
非极大抑制
双阈值检测以及连接(滞后门限处理)
这里不再细说,下面带大家看一看轮廓采样这一步骤。
轮廓采样
对于一般图像,如果采样给定个数的像素点,我们可以使用均匀采样、随机采样、等间隔采样等方式。但是对于二维轮廓点集来说,因为它的分布并不是均匀的,所以这些方法并不适用。
图1、图2是使用canny算子提取的轮廓,图3、图4是随机采样100个点得到的采样结果,可以看到采样过后轮廓信息出现了一定的丢失。如果我们想得到图5、图6这样的采样结果,该如何去做呢?
一种朴素的想法就是:我们是否可以将轮廓点对之间的欧式距离考虑到采样步骤中,得到一个 相对均匀(或者说是,点对间足够分散) 的的轮廓采样结果呢?比如说,每次剔除最短距离点对中的任意一个点,并解除它与其他点之间的距离关系,依次重复,直至点对只剩下所需数目的点集。
这个就是Jitendra’s sampling的思路,下面附上Jitendra采样的流程:
一些Tips:
第一步需要对轮廓点进行随机重排,这样子可以保证删除点对的随机性,避免删除时产生连锁反应(lab>lbc>lcd>lde,如果每次删除最小点对右值,则删除步骤可能变成了e→d→c→b→a)。
其中阈值(k = 3)主要是针对于轮廓点过多而预设的一个倍数关系。如果轮廓点(I)>3×采样点(N),直接对轮廓点集随机采样,取前3N个就行。
可以先对点对距离进行排序,然后逐一删除符合条件(点对中的每个点都没有被删除)的右值(左值均可,规则统一就行)。
下面附上论文样例中这部分的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
二. 形状上下文(Shape Context)直方图矩阵的构建及其相似度度量方法
对于轮廓中的点对,哪些信息对于形状匹配起到贡献呢?
距离,
角度,
等…
那么对于每个轮廓点,我们可以构建以其为中心的极对数坐标系 log-polar coordinates(包括12个角度区域和5个距离区域,如下图c),再将它周围的轮廓点映射到每个区域内,然后统计落在每个区域的轮廓点数,最后进行归一化处理(即除以落在所有区域中的轮廓点数)。这样子我们就生成了形状上下文直方图矩阵。如下图所示,我们可以直观的看到,相似度d-e > 相似度d-f。
一些Tips:
采用极对数坐标的好处:主要使得描述子对邻近采样点更敏感,强化局部特性。
首先求出点对的距