图像镶嵌
目标
程序的基本目标是将一系列的平坦图像连接起来一个连续的全景图像 (镶嵌图像).这里的困难是把一些弯曲(变形)的图像组合起来去适合不同的观察角度. 刚开始的做法通常非常不严密并且在二个图像之间出现了一些污点.那就是为什么我们一定要使错误减到最小限度方法 (Marquardt-Levenberg) 下列各项是我们在工程里用回答的一连串疑问:
1.我们找到为二张图像的投影变换?
2.在二个图像之间,我们如何将错误减到最少?
3.我们如何把图像融合起来?
一些假设:
1.照相机遵照针孔模型照相机 (是的).
2.图像上的一个物体在充分远处看过来,就近似为一个平面(忽略物体的表面凹凸)
3.当定义对应点的时候, 使用者在两张的图像中按完全相同的次序按下四对相对应的点未按照这一项假定将会造成错误 及[或] 内存的泄漏错误
4.当定义对应点的时候, 使用者不能任意的选取三个点在同一张图像里而必需要大致在同一条线上. 因为然后当它难以定义以其中的三个在相同的线上的四点为基础的一个独特的投射变换点阵式的时候,点阵式会是有害形成的,所以这的理由是.
未按照假设的做将会导致奇怪的错误及[或] 内存溢出的错误
方法
我们正在尝试做的基本上是考虑两张图像具有一些共同的特征.如果有一棵树在一张图像里,那么至少在另外一张图像里要有相似的一部分.图像镶嵌是可以做到的,于是就要建立一对图像,其中的一幅图像已经是镶嵌图像的一部分.我们有一个图像镶嵌的累加器,它是从两张图像的结合开始,其他的图像再结合进来然后我们尝试去找一个转化,扭曲一张图像使特征提取还是用同一个方法.在假定之下,两张图像匹配的特征大致都在一个位面上 (如:保持让特征远离照相机和针孔照相机模型), 这将会在其中一张图像中用这种方法改正远景,使扭曲的图像的结合和另一个图像的特征在另外一张图像上描绘出全景镶嵌图像首先,一些为了叙述目的的定义. 图像I是我们谈到的将会扭曲的那张, 用程序去匹配图像I’的特征投射的变换 M.
1.我们如何去找为二个图像的投影变换?
为了找投影变换, 我们呈现给使用者的一对的图像.然后使用者被要求在两张图像中按下四对对应的点. 发现基于四对对应点的转换矩阵是有可能的,这个矩阵描述成几何学上的一维和二维通过牛津大学Andrew Zisserman 机器人研究小组的研究
假设规定点 和点 在 1<=i<=4 是对应点, 那么我们就可以根据8参数的射影矩阵求出 ,再表示
计算出
然后可以产生一个线性等式系统,包括所有的八点:
h33 被假设为1. 依照在几何学一维和二维方面指出, 有一个解决的思路是h_33等于 0. 然后 , 矩阵 H 将会是正确的转换矩阵的一个差的近似估计. 只是基于使用者的输入, 变换并不能保证对另外一张图像的特征的精确的匹配事实上, 错误可能是相当大. 那就是为什么我们需要使用 Marquardt- Levenberg 的减到最小限度纠正矩阵的值产生图像I使它与图像I’的特征匹配的更加精确.
2.在二个图像之间,我们如何将错误减到最少?
问题在于选择投影转换矩阵 H 的叁数 m_i使得结果的平方不同于所有重叠的像素值在两个层次图像中是最小的.
E = sum((I'
- I
)^2)
这是非线性的最小化问题,它可以通过Marquardt and Levenberg提出的迭代的方法求解.
它在每次的迭代中计算Hessian矩阵的近似值.它涉及到有关参数误差偏导数的计算,这就是我们所要解决的,也就是m_i's(转换矩阵的8个参数)
e_i = I'
- I
I
是常量, 导数如下:
偏导数如下:
Hessian矩阵(对称的)和梯度向量b的值由所有的像素通过i累加提供:
A和B通过重叠的像素被规格化因为否则两张图像的最好匹配将会在两张图像没有全部的叠加上发生.在每一步的迭代,下面的等式给出答案:
变量增量m_i's,加在转换矩阵的每个参数上在 Lambda 上的等式是一个参数,它可以调节算法达到最小化的收敛的速度. 这是有用的因为有时会超过和跳过最小的量 这造成误差的增加,这能被发觉, 然后矩阵返回到原先的一个迭代中和lambda除10, 这使得以更小的值去趋于误差的最小值. 如果误差变小,然而,那么 Lambda 可以以更大的增量去趋于最小值.
最终的情况是: 如果误差在一个限度内,如果最大的增量已经被处理, 或误差与原先的误差之间的值小于一个限度.二次插值用来决定像素的颜色每当转换矩阵从I’转换一个像素到I中的非整型的像素, 以及在垂直的和水平的梯度上对图像进行插值.
3.们如何把图像整合起来?
任何两张图像的合成仅仅只是在那些图像像素分量上的组合.如果当我们合成两张图像,我们只是分配了两个图像重叠的地方相同的像素分量,那就会得到一个满意的结果但不幸的是如果恰好在图像特征匹配上有一个非常小的错误,然后在边缘上的不匹配就会显现出是两张不同图像的匹配.为了使边缘成为不可见的,我们让各自的图像的亮度分量降低,使像素的位置更加的贴近它们的边缘.那样, 当平均总和被计算发现图像的最终的亮度值,(亮度值 =(W1*I1+ W2*I2)/(W1+ W2))如果图素的位置接近于一张图像的中心,但在另外一张图像的边缘附近, 然后图素位置在它那张图像的中心的附近,这将会对合成两张图像的像素亮度有很大的帮助在Sclaroff教授的演讲的提议下, 我写了一个程序用来合成两张合适的目标图像,然后创建一张合成的区域它着重于图像的中心位置和在图像的边缘线性下降.它作了一个很不错的项目.
程序
下面就讲述下程序如何工作:
1.加载所有的图像到一个数组里
2.图像数从2开始循环
3.在荧屏上显示图像 1 和 图像i,并让使用者定义四个通信点.
4.在最小限度程序将图像1放入图像 i中.
5.一起合成图像, 将图像保存在数组单元中.
6.为 i 做循环.
最小化的工作原理如下:
1.设定 Lambda小于0.0001
2.当循环的次数小于50,并且它原先的错误和当前错误之间的差别大于500,那我们就不能恢复到原来的delta m 的值,并且此时的最小错误也会超过100.
3.重新设定0的矩阵A,梯度向量B和delta m的值
4.遍历第一张图像的所有像素值,并用转换矩阵对它进行变换,让后看最终的像素值是否会落在第二张图像的边缘.
5.如果它在边界里面, 使用二次插值来计算像素值,水平梯度向量值和垂直梯度向量值
6.同时,增加重叠的像素个数
7.如果位置在边缘的外面, 就跳到下一个图素.
8.计算由A和B所产生的错误用数学的方法描述
9.计算(A+Lambda*i)的共轭复数, 由 B 乘它得到detla M 矢量.
10.清除 " 恢复到原先的 M" 的标志.
11.如果错误已经减少, Lambda除以10.
12如果错误已经增加, 将Lambda乘10, 且不在下一步也不更新delta m的向量值.
13.同时, 设定 " 恢复到原先的 m" 的标志.
14.在转换矩阵中,将delta m的值加到联络点的位置上
15.进入到下一个while循环.