图像特征点、投影变换与图像拼接
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
一、全景拍照中的投影变换
在32. 镜头、曝光,以及对焦(下)中,我给你介绍了各种各样的相机镜头,也介绍了视场角(FOV)这个概念。现在咱们手机上的主摄像头一般FOV是七、八十度左右,有的更小一些。但人类的视觉系统FOV可以达到 。
广角镜头、鱼眼镜头能够让你拍摄出非常大FOV的图像。但它们非常昂贵,而且具有强烈的畸变。
![](https://filescdn.proginn.com/1945c758a9bf1b25d1a943972ff756cb/a1767ddcf02e20e4f948ad4626780e4a.webp)
全景拼接这个功能也能够让你拍摄出很大FOV的图像,你很可能已经使用过这个功能了,它甚至可以拍摄出水平FOV达到360o的图像。我们可以比较下。这样拍摄出来的图像比起鱼眼镜头的畸变小很多。
![](https://filescdn.proginn.com/22c7517c88c47ec813582d6688e64cf9/f6ca7517e953adf555805730c89a3f19.webp)
![](https://filescdn.proginn.com/be6a7356ca002bb76cf8922b3ce2eaca/8419b6789cf35d33e7749284933ea140.webp)
全景拼接是通过先拍摄不同视角的多张图像,然后将它们拼接而成的:
![](https://filescdn.proginn.com/70fc5199511449607c3926d5d77a277f/48ff938c7ad2bc81a0c47982452c18df.webp)
那么,像下面这样几个视角拍摄的图像,我们是不是直接拼接平移这些图像然后拼接就可以了呢?
![](https://filescdn.proginn.com/7d8d8bb9bd2c132a27f76602d7c04bc9/00755c61d74fcf53c77fe0c43953b09b.webp)
很显然,不管我们是把左边的图像摆在上面,还是把右边的图像摆在上面,都会观察到“对不齐”的现象(看看中间栏杆的断裂缝):
![](https://filescdn.proginn.com/0000b0b9c6a4f5ee2566ee157201c060/009410838ced72e20f70a513e2e15b88.webp)
那应该怎么办呢?这时候就要用到我在28. 图像扭曲中介绍的图像的Warping技术。适当的Warp图像然后再做拼接,能够使得我们得到完美的全景图像:
![](https://filescdn.proginn.com/2a799200236bf259f5e357a95970d3d6/ef78a4820ea301977134517711135f8b.webp)
Warping是一种改变图像像素位置的技术
![](https://filescdn.proginn.com/b904d72bb16bd55412b6af7204aab0ef/10fd1de8452dc4da9689144c14eaa958.webp)
各种类型的2D图像变换都可以用变换矩阵来表示,如下图所示,其中包括平移变换(Translation)、刚体变换(Rigid)、相似变换(Similarity)、仿射变换(Affine)、投影变换(Projective)。
![](https://filescdn.proginn.com/85db5aba008b82c5c2033711514276dd/3b8de0c06da5741d3ddf03dd7e09c8ba.webp)
它们具有不同的内核和自由度:
![](https://filescdn.proginn.com/745a71bdec8ec682ffa295e23ec73302/c0da85092e6664e43da0a7466d82d788.webp)
那么,在全景拼接中我们用什么样的变换矩阵呢?事实上,此时我们通常采用的是投影变换,因为它的能力比起上面其他的变换形式都更强。下面是同样两张图像,三种不同变换形式的拼接结果,可以看到投影变换的结果是最自然正确的:
![](https://filescdn.proginn.com/0a2a1a563a4e9572fea283c82f277254/c7d3c76e2d57257b36ae890ed9f377f0.webp)
投影变换不仅仅用于全景拼接,我们还可以使用它来做视角变换,比如把正视图变换为俯视图或侧视图:
![](https://filescdn.proginn.com/35dced220307a45d7467924ea2f11b84/fb90a8ebb14383eab654743acd12e11c.webp)
还可以用来模拟旋转视角:
![](https://filescdn.proginn.com/d7342861e4ea3ec94df11e2071e57add/62d7207d8d0285e0ebdaf961252ee995.webp)
校正多幅图像:
![](https://filescdn.proginn.com/9abf06e7bcc788ae3909d04848ef7aae/df363a47ad9559c3045c6c1994bc3812.webp)
事实上,不仅仅是在数字图像处理时代人们使用投影变换,在平常的生活中人们早就在利用投影变换了。比如,你很可能了解甚至亲眼见过3D绘画,艺术家利用透视原理在地上作画,从而在某一个视角观看时可以有非常逼真的3D效果。这事实上是一种将2D图像反向变换为3D图像的过程。
![](https://filescdn.proginn.com/8007e26bb45de7934b9ac1942d850063/23b1ccec6415ed8fe0c3480391c29cfb.webp)
艺术家也早就将投影变换应用到了画作中,例如下面这幅图左上角的人物脚下踩着的地面,就遵循投影变换中近大远小的规律。
![](https://filescdn.proginn.com/59ec352c581422ab126ed00f279b78bd/db2f3ba717019a7e2a9b2c52c706a172.webp)
而我们甚至可以反向利用投影变换,来看看他们脚下的图案的实际样子。可以想到画作作者倾注了多少心血在细节上:
![](https://filescdn.proginn.com/ab436118ff536dba0c9a9a6b9fd85dfc/1d91092f822b64558778403db87aee11.webp)
文艺复兴时代投影变换刚刚被发现,所以类似上面的这种表现形式在那时候的画作中经常出现:
![](https://filescdn.proginn.com/26a348f561785ba71be8df3121661ac3/02ecd78a33cf4e45ae793d3f2a9084fe.webp)
有一幅著名的油画叫做“大使们”,是画家小汉斯·霍尔拜因的作品。这幅画有非常多的解读,尤其是在画作前景有一个奇怪的、扭曲的物体:
![](https://filescdn.proginn.com/3c2be40189f2a308e218fd1dcf5fef71/4ff3bcf8eb1a6965a26aebf969cfe6a6.webp)
可以利用反向投影变换将这个局部图像校正到正常的视角,原来是一个可怕的头骨:
![](https://filescdn.proginn.com/aa720449be702808325043fd24ecea63/fef10078a99beb3b9ea2fd749b6db3b0.webp)
事实上,还可以利用一些生活中常见的物体,例如一个勺子,来实现图像扭曲,从而理解画作中的物体。(将勺子靠近画作,勺子表面的曲面反射光线,从而可以让你看清画里面的物体)
![](https://filescdn.proginn.com/35dced220307a45d7467924ea2f11b84/1cf34f8af5c12ef5bcfa2bdbae64e95d.webp)
二、什么时候可以使用投影变换
好了,你已经看到在绘画和全景拼接时,我们通常可以采用投影变换(又称为单应变换)来Warp图像,从而得到预期的结果。那么问题来了?投影变换在什么场景下适用,什么情况下不适用呢?
还是让我们看看29. 小孔相机的模型:
![](https://filescdn.proginn.com/4a95d4ac6d28998c6770300b4da86c64/1f826b90db10f3e98d82b013a53e5359.webp)
可以看到小孔成像时,物体方向的光线总是会通过共同的相机中心。这意味着拍照时,我们只是在用图像平面来选择部分光线。
![](https://filescdn.proginn.com/333dba0a3dca649274898453893cc13d/667b348c8cfb1be81c3578e048f5caf3.webp)
当我们用2D投影变换来讲图像变换到新的视角时,情况如下:
![](https://filescdn.proginn.com/6d765ebe072e030fdf7a3a82fd6f6509/16171fd6e81ddc06ae066d6d0314263d.webp)
这里你可以看到,只要新的视角和原始视角有共同的光学中心,并且和原视角有共同的视线范围,就可以将原始视觉的图像利用投影变换变换到新的视角下。
而在全景拼接中,假如我们要把在不同相机中心位置拍摄的图像通过投影变换拼接到一起时,会怎么样呢?比如下图,我们要将图像平面1和2通过投影变换到绿色线表示的共同平面上去,从而实现拼接,此时会怎样呢?
![](https://filescdn.proginn.com/f42922aeb9c988844d72ce8914e7b9c5/8f890a64584a927e17513722c614fda8.webp)
这个时候,你会发现合成平面上的点很可能会出现无法确定来源的情况,这实际上就是由于“视差”导致的。也就是说,在图像拼接时,2D投影变换(也称为单应变换)无法应对相机中心平移导致的视差现象。
![](https://filescdn.proginn.com/cee26c900d79a45776545c2d7aa6be61/62254e8c5391e117805226903d48a9a2.webp)
但在少量的情况下,即便相机中心平移,也可以采用投影变换,如果:
![](https://filescdn.proginn.com/ac797ced2cf35e145b28116043fb8001/917e0739913d16ae6708a86f4a1ecc8c.webp)
如果你使用过微软的Onenote,或者“名片全能王”、“扫描全能王”这样的软件,你可以看到它们能比较好的将名片,或是照片等转换为正视图。其中也就利用了对平面物体采用投影变换的原理——特别要注意的是,采用这种方式,不需要知道实际相机的物理参数,纯粹采用2D图像变换即可做到。
三、投影变换矩阵的计算
投影变换矩阵,正如上面所讲,是一个3X3的矩阵,其中一共有8个自由度。一个图像上的点P变换到另外一个图像上的点P'的过程用下式来描述,其中H是2D投影变换矩阵,也称为单应矩阵。
![](https://filescdn.proginn.com/34d624f94b2e86f826aaf566aa452b01/29711d83f8303c45ad208933cf4172cd.webp)
将矩阵乘法展开可得:
![](https://filescdn.proginn.com/5b531c8ae6e4e13cca42006780341297/d727ee2834a3d423b921294374c29b07.webp)
抛弃尺度量后有:
![](https://filescdn.proginn.com/12689da75ab40d9f03440d4b86f359f1/7e2ca9078a9495f001366ba6527607ab.webp)
再稍加整理有:
![](https://filescdn.proginn.com/043b0de79aa42742f24434630e3eea47/5826d8fec8a98a021c02b16d549d03dd.webp)
所以如果知道原始图像和变换后的图像的一对对应点的坐标,可以构成两个线性方程。因此,如果要确定变换矩阵中的8个未知量,一共需要4对对应点,8个线性方程:
![](https://filescdn.proginn.com/d6c750eb0f390032d34ee1ba8f0ff0ea/de894e94bb19954bcf012d82930cd029.webp)
我们将上式写作矩阵和向量的乘法有:
![](https://filescdn.proginn.com/581d3bd0641db182e00d65e57c58d1f8/09de6c96603a07dacb6fdbb53857af4f.webp)
这样又多个对应点时,就成了:
![](https://filescdn.proginn.com/73f90b9195c7aad7ba4e08e76a4da284/28adb14ef91ca73fb9a2cd813096c7d9.webp)
这里的A可以是正定的(未知数==方程个数),也可以是超定的(未知数<方程个数)。可以简单的利用SVD分解来求解上述方程得到H,从而进行图像的变换。
在上面的过程中,我们忽略了获取不同图像视角对应点坐标的过程,事实上可以手动指定图像的对应坐标点来计算出单应矩阵。比如在“名片全能王”这样的应用中,就是通过检测到名片的四个角位置,然后指定屏幕上的名片框的四个角的位置,从而计算出单应矩阵并进行名片图像的变换的。
但是实际我们要做图像拼接的场景通常比名片更加复杂,没有可以轻易指定的边框角,有没有更智能的方法来获取图像间的对应点呢?这就是下一节所要讲的。
四、图像对齐时的特征点获取
正如上面所讲,要计算图像视角间的变换矩阵,需要确定图像的对应点的位置。那么什么样的点适合这个用途呢?我上面讲过名片全能王这样的应用采用的是名片的四角点,那么对于其他自然场景呢?
![](https://filescdn.proginn.com/af081b64bf827d5630615cdcc1af97df/0cae1b8d72587d892d2361a0e37e40f0.webp)
比如说上图,其中我们选择的点要求:
在两个视角中都很显著
在两个视角中都容易检测
不会和其他的点混淆
我们称这种点为”特征点“。有一种基础的,容易理解的特征点为”角点“,通过下图很容易可以理解:
![](https://filescdn.proginn.com/f806e99200883028f0642af410fdc2ff/dcd518bb005140c550d8228f604c8df8.webp)
有一种著名的角点检测算法是"Harris Corner”检测算法,其过程也非常容易理解:
![](https://filescdn.proginn.com/701b07e9764b516d184903d0825ace0b/c5be74af486169b9b6bc5b42bb68f337.webp)
稍稍解释下期中的关键步骤:
我已经在3. 数码相机内的图像处理-基本图像滤波中介绍过图像的梯度计算方法,而这里我们要求在一个很小的局部窗口内计算每个像素点的梯度值:
![](https://filescdn.proginn.com/0f3103ed60205309f7966daa7375eeb8/e69615e2308482bfd0318d1f2cddf748.webp)
将梯度减去平均值,则是为了做一定程度的归一化. 利用这个归一化的梯度值,我们可以计算协方差矩阵,从而拟合一个抛物面(注意下图的P,代表梯度计算的局部图像块)
![](https://filescdn.proginn.com/b85374fea8fd5adf02b54477ae5cda09/063fc69440becfb67f6a66f635e4397e.webp)
这个协方差矩阵的特征向量有着特殊的意义,它可以写作下式,从而反应出图像局部点的特点:
![](https://filescdn.proginn.com/2221e68f9d9478cca1809a72c06b166a/aea9102b054e0fd75d19f177ac0ce5cc.webp)
![](https://filescdn.proginn.com/a339db1b326870c9c3d73b2b0917d035/b6d6d8ae7ccb78114f5edefdea398b39.webp)
可以看到,只有两个特征值都比较大且没有明显的差距时,才是角点。因此可以通过 来确定是否是角点。更流行的方法则是通过下面的Harris角点检测算子来确定是否是角点,相比使用
这个算子计算量更小。
![](https://filescdn.proginn.com/8db3c9571b6193e0b6d1e60e3e5e9428/df0155b957b8968640a7d10fa1ddf471.webp)
当然两者其实都很相似:
![](https://filescdn.proginn.com/04d2476a292e2b330880b3ad09fac18a/047640b1100187feac41e9f7af05af40.webp)
在实际使用时,会发现局部区域有大量点都满足算子>threshold的条件,因此还需要采用“非极大值抑制”的方法,选择局部区域算子最大的点作为最终的特征点。我们来实际看看在图像中寻找角点的过程:
![](https://filescdn.proginn.com/4e920826735b1b8490dc03ee8986cf93/e06a8a99dddfc5c5405d2ddc5c9a5237.webp)
![](https://filescdn.proginn.com/3bb897549f30cd6dfc14a7885060da14/354e7456641e0e27d23ce21914c02714.webp)
![](https://filescdn.proginn.com/c41e2cb404e48088fac9daa56ae28f33/7ca23d90275be2f4047d2a9d0cf95148.webp)
![](https://filescdn.proginn.com/1a4cce5e680e9930e77a88ec197e5d1d/48d3dc5240e33c6141ff83bc48a8425c.webp)
![](https://filescdn.proginn.com/077c8acf46352cb43be468b6dc2468df/c328906431f28e7d2222190416d80b2b.webp)
五、总结
今天这篇文章从全景拼接开始,讲到了拼接中采用的2D图像变换主要是单应变换(投影变换),然后再讲了单应变换矩阵的直接计算方法。我们看到只需要知道至少4个非共线的点对就可以确定单应变换矩阵。最后讲了一种非常简单直观的获取图像特征点的方式——Harris Corner检测法。
事实上,图像的特征点检测还有很多高级的方法,你一定听说过像SIFT/SURF/ORB等方式,事实上从2003年SIFT的作者D.G.Lowe就另外一名大牛M. Brown合写了文章Recognising Panoramas,其中就用SIFT特征点来作为图像变换关系的计算基础。
由于篇幅原因,本文不再对此做展开,将来有机会时再深入探讨全景拼接中的高级方法。
六、参考资料
今天的主要参考资料为:
CMU 2017 Fall Computational Photography Course 15-463, Lecture 19
M. Brown and D. Lowe,Recognising Panoramas, 2003