转自:http://www.cnblogs.com/Lemon-Li/p/3504717.html
图像配准算法一般可分为: 一、基于图像灰度统计特性配准算法;二、基于图像特征配准算法;三、基于图像理解的配准算法。
其中,算法类型二最普遍,基于特征的图像配准算法的核心步骤为:1.特征提取、2.特征匹配、3.模型参数估计、4.图像变换和灰度插值(重采样)。
图像配准必须得考虑3个问题: 分别是配准时所用到的空间变换模型、配准的相似性测度准则以及空间变换矩阵的寻优方式。
1) 空间变换模型 ,是指的这两幅要配准的图像之间的映射模型,比如只有旋转、平移这些操作,那就是刚体变换模型,又比如有缩放操作,甚至X方向和Y方向缩放的幅度都还不一样,那就是仿射变换或者非线性变换模型。总之你要做配准,先要确定这两幅图像之间是一种什么样的映射模型。要是对这个变换模型还不清楚,你就到google上或者万方上搜索“仿射变换”、“刚体变换”这些关键词。帖子里不可能讲的太详细。
2) 配准的相似性测度准则 。在你确定了变换模型后,接下去要做什么?当然是确定模型里的参数了,而要确定这些参数(不同的变换模型参数个数是不一样的,像刚体变换有x平移、y平移和旋转角度sita三个参数,仿射变换有6个参数)你得告诉程序什么参数是最好的,或者说是正确的。那么判断什么参数是正确的一个准则就是我们说的配准的相似性测度准则,也就是告诉程序在某组参数下是配准的程度是多少,显然使得配准程度最好的那组参数就是我们要找的参数。3)空间变换矩阵的寻优方式。因为大多数情况下,模型中的参数不是靠解出来的,而是要靠“尝试-判断”这种方式去寻找,空间变换矩阵的寻优说白了也就是怎么对这些参数进行寻优,找出使得配准程度最好的那一组参数的过程。这里有很多方法,如遗传算法、粒子群优化算法等等,如果你对这些算法都不了解,没办法,你只有用最笨的遍历式搜索方法了,也就是以某一个步距,搜索所有的参数组合方式,然后找出使得按照相似性测度准则配准程度最高的那一组参数。
举例说明:比如有一幅图像A,我将A左移了2个像素,再往下移了3个像素,又顺时针旋转了60度,这时的图像我们称作B。如果我们要对A和B进行配准,其实就是确定2、3、60这三个参数的过程,因为这三个参数一旦确定了,我就知道了B和A的对应关系,换句话说对于B中的任何一个像素点我就知道在A中对应的是哪个点。这里因为我知道这两幅图只有平移和旋转的变换操作,所以我们采用的模型是刚体变换模型(实际情况下,你如果不知道这两幅图像进行了什么变换操作,只有大概根据图像的位置信息揣测了,一般情况下非线性变换模型是最正确的,但是参数也最多)。配准的相似性测度准则这里我们就用简单点的(只是举个例子说明下过程,事实上的许多情况都要复杂的多),以二值化后两幅图像重合的像素点个数为准,也就是说我们认为使得两幅图像重合的像素最多的那组参数就是正确的变换参数,理论上来讲,如果两幅图像严格配准了,那么显然他们所有的像素点都是重合的,否则就有错开的部分。寻优方法比较啰嗦,任何一个优化算法都不是几句话说的明白的,这里直接用遍历搜索法吧。因为有三个参数需要寻优因此,我们对这三个参数的解空间进行遍历,比如对X方向的平移像素个数我们从-100搜索到+100,步距为1像素,对Y方向的平移像素我们也从-100搜索到+100,步距为1像素,对旋转角度我们从0搜索到360度,步距为1度。这样等于说要完成一个200*200*360次的循环,然后在每次循环里面,我们都判断一下,按照当次循环参数进行变换后的A图像与B图像的重合像素个数有多少,找出200*200*360次循环中使得重合像素个数最多的那组循环中所使用的参数,这组参数就是我们所要的结果,如果一切正常,显然我们会在2,3,60这组参数所在循环中得到重合像素个数最多的结果。而所谓优化算法其实就是用一种更为智能的方式得到2,3,60这三个参数的过程。这样就完成了配准的过程。
多项式模型:在两幅图像上找到足够的同名点对,然后用多项式模型强行纠正。大小、旋转、噪声等都不是问题。
自己构造算法的话,可以这样。假设A为正确位置的图像,B是待校正的图像。B图上的任意一点(x,y),在校正后图像上的位置应该为(u,v)有(假设多项式为2阶):
u = a0 + a1*x + a2*y + a3*x2 + a4*y2 + a5*x*y
v = b0 + b1*x + b2*y + b3*x2 + b4*y2 + b5*x*y
在B图上散布取x,y值,在A图的同名点上取u,v值,当点数足够时,解a、b共12个参数。
得到方程后,遍历b图所有像元点x,y带入上述公式,就得到了全部配准后的位置u,v。
自动获取同名点比较困难些,其它容易。这个可以多阶,但如果像你说的非刚性变化一般3阶就够了。
两点线段匹配:选取两幅图的两个应该相同的点(一共4个点),得到4个点的坐标,然后用A图的两点线段与B图的两点线段计算出仿射变换的矩阵,再把矩阵应用于整幅图就行了。看看opencv吧,好多现成的API函数。
六参数配准(仿射变换)具体求法:一共是6个参数,坐标轴的变化夹角,旋转夹角,X尺度变化,Y尺度变化,X平移,Y平移。
进行一系列运算过后,可以变成一个线性代数式(具体怎么变换的不用管,比较复杂)
u = Ax + By + C
v = Dx + Ey + F
其中,U,V是目标图的横纵坐标,X,Y是原图横纵坐标.也就是说
[u v 1]'=[ A B C;D E F;0 0 1]*[x y z]'
具体A-F六个参数的计算可以通过SIFT在两张图中找到足够的尺度不变特征点,然后对这些特征点进行匹配。匹配后就能得到很多特征点对。然后建立
u = Ax + By + C
v = Dx + Ey + F
这样的方程。一共3对特征点,6个方程,就足够解6个参数了。但是实际上矩阵空间内三个远远不够。一般要把所有的一起拿来解超定方程组。
至于特征点匹配,SIFT应该能算出128位特征描述子,用两个点之间的特征描述子的欧式距离可以实现匹配。另外要速度优化的话可以不算这个,直接用灰度相关系数和一些其他算法来排除误匹配,比如ransac。其实128位特征描述子只有在进行初始配准的时候有用。而且128位空间的欧氏距离计算开销大,一般都用的正交反余弦来逼近。所以干脆不算这个东西,时间开销一下就少了70%以上。那么只知道一些特征点,用什么来进行初始匹配呢?方法就是用特征点之间的灰度相关系数,这个是很轻量级的。
总之,配准问题要实验,看结果,分析,再做改动,很难说有个算法能一定解决的。
需要考虑的可能问题包括:
resize分辨率,再做进一步处理的,控制特征点数量。
平滑去噪。
减少亮度对比度差异,用image normalization,就是先求图的mean,std,然后把所有pixel变换,使得最终mean是0,std是1.
surf算法、SIFT算子、Harris角点提取。
关于Image Alignment,推荐论文: Lucas-Kanade 20 years On: compositional algorithm,它是最慢的,不过根据我的经验来看,z在变换并不是特别大的时候,还蛮好用的。它适用于translation,scaling,rotation变换,寻找最优过程类似于用gradient of multi-variable function 寻找 local minimum。 但是假如变换太大,这个方法应该不行。关于代码,http://www.codeproject.com/KB/recipes/ImgAlign.aspx。 Remark:如果图像里有太多非刚性变换,忽略所有的推荐。
Shi-Tomasi角点特征+Lucas-kanade(光流).Harris's original definition involved taking the determinant of H(p), subtracting the trace of H(p) (with some weighting coefficient), and then comparing this difference to a predetermined threshold. It was later found by Shi and Tomasi [Shi94] that good corners resulted as long as the smaller of the two eigenvalues was greater than a minimum threshold. Shi and Tomasi's method was not only sufficient but in many cases gave more satisfactory results than Harris's method