论坛上收集的,自己有的地方也不是太懂,希望对有需要的人,有所帮助。

 

有一个图像作为标准图像,其它的图像可以看作该图像打印后,扫描生成的图像,可能还有噪声、旋转、缩放、亮度等变化也可能是非刚性变化,怎样对这些图像进行校正, 根据情况的不同,有不同的校正方法。

     1 首先 简单地,可以选取两幅图的两个应该相同的点(一共4个点),得到4个点的坐标,然后用A图的两点线段与B图的两点线段计算出坊射变换的矩阵,再把矩阵应用于整幅图就行了。可以利用opencv现成的API函数.

详细的原理具体求法:

一共是6个参数,坐标轴的变化夹角,旋转夹角,X尺度变化,Y尺度变化,X平移,Y平移。



进行一系列运算过后,可以变成一个线性代数式(具体怎么变换的不用管,比较复杂)
u = Ax + By + C
v = Dx + Ey + F
其中,U,V是目标图的横纵坐标,X,Y是原图横纵坐标
也就是说
u A B C x
v = D E F * y
1 0 0 1 z

具体A-F六个参数的计算可以通过SIFT在两张图中找到足够的尺度不变特征点,然后对这些特征点进行匹配。匹配后就能得到很多特征点对。然后建立
u = Ax + By + C
v = Dx + Ey + F
这样的方程。

一共3对特征点,6个方程,就足够解6个参数了。

但是实际上矩阵空间内三个远远不够。一般要把所有的一起拿来解超定方程组。


u A B C x
v = D E F * y
1 0 0 1 z

其实是先用SIFT算法找出两张图的尺度不变点,然后再对这些点进行匹配,然后把每一对匹配的点用来计算这个方程

    2  其次,找到两幅图像上找到足够的同名点对,然后用多项式模型强行纠正。

   假设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阶就够了。有扭曲或者非线性变化时需要用高阶多项式。

 

对于提取同名点对的注意:


最方便的是特征点的配准,先粗配准,然后再细配。先把所有的伪特征点都去掉,这个技术应该很成熟了,比如ransac算法进行剔除误配点。


 


对于SIFT中,128位特征描述子只有在进行初始配准的时候有用。而且128位空间的欧氏距离计算开销大,一般都用的正交反余弦来逼近。所以干脆不算这个东西,时间开销一下就少了70%以上。那么只知道一些特征点,用什么来进行初始匹配呢?方法就是用特征点之间的灰度相关系数,这个是很轻量级的。

最终, 要做图像配准你必须得考虑3个问题,分别是配准时所用到的空间变换模型、配准的相似性测度准则以及空间变换矩阵的寻优方式。