图像重映射算法浅谈

作者|三井寿 编辑|3D视觉开发者社区

在CV领域,常常会涉及到图像的重映射操作,典型应用场景为:

  1. 已知某个相机的内参和几何畸变模型,需要对其采集到的实际图片进行去畸变处理,从而恢复图像中的几何信息;
  2. 双目视觉系统经过标定后,需对图片进行变换,实现极线对齐,从而支持沿图像X方向的一维匹配操作。

为了方便描述,我们在接下来的说明部分以图像去畸变为例,向大家介绍如何实现高效的实现图像重映射。

基于pinhole camera model和central projection,我们可以通过下面公式描述相机对三维点成像的过程:

x − i ∼ K ∗ ∗   L ( [ R ∣ t ] ∗ X − w / d ) \mathrm{x}_{-} \mathrm{i} \sim \mathrm{K}^{*}{ }^{*} \mathrm{~L}\left([\mathrm{R} \mid \mathrm{t}]{ }^{*} \mathrm{X}_{-} \mathrm{w} / \mathrm{d}\right) xiK L([Rt]Xw/d)

其中:

  1. X_w 为三维点在世界坐标系中的位置,而且为了方便运算,我们使用homogeneous coordinates来表达 X_w,这样 X_w 是一个4 x 1的列向量,且最后一个元素值等于1;
  2. R 和 t 分别是3 x 3旋转矩阵和3 x 1平移向量,用来将三维点从世界坐标系转到相机坐标系下;
  3. 标量 d 是三维点在相机坐标系下的深度,即三维点在相机坐标系Z轴上的位置。通过除以深度 d,[R|t] * X_w / d
    的结果是一个3 x 1的向量,且最后一个元素值等于1,这就是我们通常所说的normalized camera coordinates,即归一化相机坐标系下的点坐标;
  4. L()描述的是相机几何畸变模型,也就是我们通常所说的畸变模型。由此可以看出,畸变模型是定义在归一化相机坐标系下的,即畸变会改变视线方向。这会导致三维点在图像上的投影点,偏离由三维点与相机中心所定义的直线。因此也就无法由投影点与相机中心回溯三维点所在的真正方位。
  5. K 是相机的3 x 3内参矩阵,一般包含用像素值所表达的镜头焦距:如果考虑X和Y方向像素尺寸的非一致性,用 f_x 和 f_y 分别表示镜头焦距在X和Y方向的像素值;此外还包含 principal point,即图像主点在图像坐标系下的位置;如果考虑像素倾斜,还会再额外包含 skewness;
  6. x_i 是三维点在图像上投影点的位置,为了方便运算,同样使用homogeneous coordiantes来进行表达。在射影几何中,我们一般不关心实体的缩放,即 x_i 和 x_i 乘以某个系数 c为等效实体,因此我们用相似性符号 ~ 来表达,x_i 和 K * L([R|t] * X_w / d) 仅区别于某个特定系数这一事实。

在去畸变时,我们需要从 x_i 中恢复出无畸变坐标 x’_i:

X ′ i ∼ K ∗ L ∧ − 1 ( K ∧ − 1 ∗ X − i ) X^{\prime} \mathrm{i} \sim K^{*} L^{\wedge}-1\left(K^{\wedge}-1{ }^{*} X_{-} i\right) XiKL1(K1Xi)

其中:

K ∧ − 1 K^{\wedge}-1 K1 K K K 的逆阵
L ∧ − 1 ( ) L^{\wedge}-1() L1() L ( ) L() L()的反函数

我们用 I(x_i) 表示含有畸变的原始图片中位置 x_i 处的像素值,用 I’(x’_i) 表示去畸变后图片中位置 x’_i 处的像素值。如果考察去畸变操作 x_i -> x’_i,对原图像中的某个像素点 I(x_i),经过去畸变运算,得到去畸变后图像中的对应像素点 I’(x’_i)。如果直接进行上述运算,存在两个挑战:

  1. 畸变模型一般由高次非线性函数描述,为了从 x_i 中计算出 x’_i,需要复杂算法来求解高次非线性函数。考虑到图像中含有大量的像素点,这会让图像去畸变操作产生极高的运算要求,不符合实际应用需要;
  2. x_i -> x’_i 操作往往导致非整数像素坐标 x’_i,为了最终获得只包含整数坐标上像素值的目标图像,需要对 I’(x’_i)再进行一次插值,从irregular grid中恢复出regular grid上的像素值。这种操作往往要求极高运算量,同样会导致去畸变操作无法获得很好的实际应用。

为了避免上述问题,在实现图像重映射时往往采取逆运算方式,即给定目标图像I’中的某个整数像素坐标 x’_i,我们在原图像I中寻找与其对应的像素点位置 x_i及其像素值 I(x_i),然后将 I(x_i) 赋给 I’(x’_i)。当我们为目标图像中的每个像素点都找到其对应的原始图像值,也就完成了最终的图像去畸变操作。具体算法如下:

  1. 对目标图像I’中的每个像素坐标(x’_i)执行以下操作
  2. 通过 x_i ~ K * L(K^-1 * x’_i),找到 x’_i 在原始图像I中对应点的像素坐标 x_i
  3. 通过插值的方式,如四邻域线性插值,计算出 I(x_i)
  4. 将 I(x_i) 赋值给 I’(x’_i)
  5. 结束

如果相机的参数保持不变,我们还可以将 x’_i -> x_i 的对应关系和相关的线性插值表保存下来,避免在对每幅图像去畸变时重复计算这些关系,进一步提升图像重映射速度。

版权声明:本文为奥比中光3D视觉开发者社区特约作者授权原创发布,未经授权不得转载,本文仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。

3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。

快来[3D视觉开发者社区]和开发者们一起讨论分享吧~

猜你喜欢

转载自blog.csdn.net/limingmin2020/article/details/127508176