论文拜读:大规模3D纹理重建Let There Be Color

论文题目:Let There Be Color! Large-Scale Texturing of 3D Reconstructions

  • 发表于ECCV-2014,第一个用于大规模真实3D重建的综合纹理框架
  • 相关的效率改进有:Efficient convex optimization-based texture mapping for large-scale 3D scene reconstruction(2021)

1 挑战

  • 图像规模 image scale
  • 失焦模糊 (out-of-focus) blur
  • 曝光变化 exposure variation
  • 遮挡 occluders (e.g., moving plants or pedestrians)

2 Texture两步走

2.1 第一步:View Selection

分为blend multiple views per face和 texture each face with
exactly one view:

  • 基于融合的方法可能会因为相机位姿或重建点的误差而造成重影和接缝,另一方面混合时会造成图像模糊、质量变低。一些研究围绕混合权重展开。
  • 基于映射的方法主要使用pairwise Markov random field,以此评估纹理视图的质量和接缝处的平滑度。

2.2 第二步:Color Ajustment

选择视图后,由于曝光和照明差异,甚至不同的相机响应曲线,生成的纹理面片可能具有强烈的颜色不连续性

  • 因此,需要对相邻纹理面片进行测光调整,以便其接缝变得不那么明显。

分为local和global的方法:

  • 图中间Velho的local方法通过将接缝处的颜色设置为左右面片的平均值来进行局部调整。然后,他们使用热扩散来实现向该平均值的平滑颜色过渡,从而显著地使边界处的面片1和3变亮。
  • 图右侧Lempitsky计算global最优亮度校正项,这些项被添加到顶点亮度中,并受到两个直观的约束
    • 调整后接缝处的亮度差应该很小
    • 纹理面片内调整的导数应该很小。

在这里插入图片描述

3 本文方法的理论基础

3.1 输入

一组图片、经过SFM重建场景几何体,并经过三角网格化的后处理。

  • SFM解算的相机位姿可能有误差
  • 重建的几何结构可能不能良好表征真实场景
  • 图像包含强光、曝光和比例差异、还有未构建的遮挡物(如行人)

3.2 马尔可夫随机场(Markov random field)来selection

采用Lempitsky, V., Ivanov, D.: Seamless mosaicing of image-based texture maps. In:CVPR (2007) 的基本思路,使用一个pairwise MRF来确定每个待渲染面片最合适的输入视角l:
在这里插入图片描述

  • 等式右侧的data term表示视图对面片纹理贴图的合适度
  • 第二项smmoth term则是面片接缝可见性的平滑度
  • 作者使用 graph cuts and alpha expansion解算上式
3.2.1 data term

①使用观察方向和面法线之间的夹角作为数据项(也就是尽量选择正视图)

  • 忽视了接近程度、分辨率和离焦模糊的问题

②将面片反投影到视图的大小作为数据项(隐含了图像接近度、角度和图像分辨率),类似的做法还有混合权重视图

  • 无法解决失焦模糊问题,可能特写镜头中物体有较大的投影面积,但是纹理却是模糊的

③作者将面片投影上的图像梯度作为数据项,如果投影面积较大(具有高分辨率的近正交图像)或梯度幅度较大(聚焦图像),则该项较大。

3.2.2 smooth term

①有人引入了x、y两个额外的平移自由度来最小化接缝可见性

  • 使得渲染与输入图像不能很好的对应
  • 计算复杂性增加

②CVPR2007使用了面片与面片接缝处的误差积分来表示平滑性(积分越小平滑度越高)

  • 接缝处的判断依赖于精确的位姿和3D网格,由于误差的存在可能真实的接缝有偏移,导致计算错误
  • 计算量大

③作者使用了简单的相邻面片视图标签是否相等来判断,同视图则为1,反之0
在这里插入图片描述

3.3 color ajustment by left and right

从MRF获得面片对应的视图标签后,调整面片的颜色。

一个面片是由三个顶点构成的。

  • 理论上这三个顶点属于本面片
  • 但实际上它是本面片与相邻面片的交汇点,所以也可以属于相邻面片

由于相邻面片有共享顶点, 所以,可以将共享顶点看作两个顶点

  • 属于接缝左侧面片的顶点vleft和属于接缝右侧面片的顶点vright
  • 在color ajustment前,vleft和vright都可以在对应面片的对应label中获取对应的颜色

调整方法就是对每一个面片加一个颜色调整值gv,可以通过最小化下式获得:
在这里插入图片描述

  • 相邻面片如果用的是一个视图label,它们会组成一个pach简化计算
  • 第一项确保接缝左侧(fvleft+gvleft)和右侧(fvright+gvright)的调整颜色尽可能相似
  • 第二项最小化同一纹理面片内相邻顶点之间的调整差异
    • 这有利于在纹理面片中进行尽可能渐进的调整
  • 在找到所有顶点的最佳gv后,使用重心坐标从其周围顶点的 gv插值每个texel的校正
  • 最后,将校正添加到输入图像中,将纹理paches打包到纹理图谱(texture atlases)中,并将纹理坐标附着到顶点

4 Large-Scale Texturing Approach

4.1 预处理

初始面片(face)对应所有视图(view), 是冗余的

  • 使用背面剔除,视图方向背向面片的被筛掉
  • 使用视锥剔除,视图视场内无面片的被筛掉

4.2 view selection

设计data term、smooth term,并引入了Photo-Consistency Check

4.2.1 data term在这里插入图片描述

计算梯度大小∇

  • 使用Sobel算子计算面片Fi投影区域梯度
  • 对Fi的投影区域φ(Fi,li)内的所有像素梯度求和
  • 如果投影包含少于一个像素,在投影的质心处采样梯度大小,并将其与投影区域相乘
4.2.2 Photo-Consistency Check

上面data term倾向于纹理清晰的视图,但是没有考虑遮挡的影响(通常遮挡的梯度都挺大的),为避免这种情况,基于大多数视图都没有遮挡物的假设筛掉遮挡视图:

  • 前人用颜色中位数或平均值来筛
    • 初始视图和筛出来的视图颜色均值方面差别可能很大
  • 作者使用了改进的均值漂移算法:
    在这里插入图片描述
4.2.3 smooth term

在这里插入图片描述

4.3 color ajustment

先进行全局优化获得颜色调整值gv,再使用Possion editing局部调整

利用公式二全局优化存在的问题:

  • 不可避免的配准误差,顶点并非可以投影到期望的位置
  • If both images have a different scale the looked up pixels span a different footprint in 3D. (怎么理解呢

针对上述问题,使用Color Lookup Support Region,不仅在顶点投影处查找顶点的颜色值,而且沿着所有相邻接缝边查找,从而缓解了此问题:
在这里插入图片描述
即,利用公式三全局优化color:
在这里插入图片描述

  • 使用Eigen’s conjugate gradient
    (CG)求解,终止条件为在这里插入图片描述

4.4 poission editing

在这里插入图片描述
将面片的泊松编辑限制为20像素宽的边界条(如图中的浅蓝色所示)。
我们使用该条带的外缘(深蓝色)和内缘(红色)作为泊松方程边界条件:

  • 将每个外缘像素的值固定为指定给面片的图像和指定给相邻面片的图像中像素颜色的平均值
  • 每个内边缘像素的值固定为其当前颜色
  • 如果补片太小,忽略内缘

泊松方程的引导场是条带的拉普拉斯函数

  • 对于所有面片,使用Eigen的SparseLU分解并行求解得到的线性系统
  • 对于每个面片,只计算一次因式分解,并将其用于所有颜色通道,因为系统的矩阵保持不变
  • 仅调整条带比调整整个面片更节省时间和内存
  • 还要注意的是,不混合两幅图像的拉普拉斯算子,因此仍然避免混合。

耗时

在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
System.arraycopy是Java中的一个方法,用于将一个数组的内容复制到另一个数组中。它的用法是:System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)。其中,src是源数组,srcPos是源数组的起始位置,dest是目标数组,destPos是目标数组的起始位置,length是要复制的元素个数。 System.arraycopy是一种浅拷贝方式,它只是将源数组的引用复制给目标数组,而不会复制源数组中的元素的值。因此,如果原始数组改变了,复制的数组也会发生相应的改变。 关于System.arraycopy的具体实现,可以参考引用中的源码拜读部分。另外,引用中也提到了System.arraycopy是对数组进行复制的常用方法。 在引用的代码示例中,可以看到System.arraycopy的具体用法。首先定义了一个二维数组src,然后使用System.arraycopy将src复制给了dest数组。接着,通过修改src数组的元素,可以观察到dest数组也发生了相应的改变,这正是浅拷贝的特性。 总之,System.arraycopy是Java中用于数组复制的方法,它是一种浅拷贝方式,可以将源数组的内容复制到目标数组中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [System.arraycopy详解](https://blog.csdn.net/yangruidage21/article/details/128519021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值