龚云璐,李大军*,郭丙轩,刘 波
(1. 东华理工大学测绘工程学院,330013,南昌; 2. 武汉大学测绘遥感信息工程国家重点实验室,430079,武汉)
倾斜摄影三维建模技术以其建模成本低、效率高、纹理模型数据获取一体化等优点,现已发展为主流的城市三维建模方法。其中,纹理映射作为倾斜影像三维建模的重要组成,能够加强模型的可读性,决定着模型细节表达[1]。而三维建筑模型的自动纹理映射,因建筑物遮挡以及多视影像纹理融合导致的纹理遮挡变形、模糊、映射错误等问题,目前主要依靠作业员利用第三方图像编辑工具手工进行纹理编辑修改,这一过程将耗费大量的时间和人力,已成为建筑物精细三维重建的一大痛点和难点。
本质上,手动纹理修复属于单幅图像修复,利用纹理相似性为待修复块寻找可替换的样本块。许多学者针对基于样本块的图像填充算法进行了研究。Criminisi等[2]提出基于样本匹配的图像修复算法,该算法通过计算图像块的优先级以决定块填充次序,是一种贪心算法。Barnes等[3]提出的PatchMatch算法利用图像的连续性快速寻找图像块之间的近似图像邻居匹配,降低了搜索过程中的内存消耗和计算成本,但算法收敛性差、计算时间长。Wexler等[4]利用一个全局性的目标函数求全局最优来完成图像的填充,采样一种投票加权的方式修复图像。He等[5]发现了相似图像块之间偏移量的稀疏性,进一步提高了算法的运行速度。Musialski等[6]提出了一种利用相似性传播去除单张近似正射图像不规则性的方法,根据检测到的相似性进行结构传播。Peng Zhao和Long Quan[7]提出了一种利用图像中的平移相似性自动检测任意形状的多个未知重复模式的方法。Liu等[8]提出了一个可以检测图像自相关函数中的峰值,以确定纹理模式的周期性的计算模型。Park等[9]使用平均移位信念传播来稳健地检测真实图像中高度重复的二维壁纸图案。Ceylan等[10]提出了一种使用对称线作为先验信息,从多幅图像中准确重建城市建筑的方法。
尽管上述方法能够较好地利用图像中的相似性结构进行纹理修复,自动化程度高,但应用于实际场景中仍然存在以下不足:1)纹理重复性过高,修复效果失真;2)适用于小范围图像内部纹理修复,对于图像边缘大面积遮挡修复效果差;3)主要处理数据为立面元素排列较为规则的欧式建筑,与实际生产处理的数据场景不同。
针对实景三维建筑模型自动纹理映射后产生大片具有复杂结构和纹理的错误映射区域的情况,以上修复方法均存在一定的局限性。受到Barnes等[3]提出的基于引导线的PatchMatch算法启发,结合作业员的作业习惯,本文提出了一种顾及立面元素排列特性的图像修复方法。该方法首先检测出不同层中的立面元素特征线,并将其作为引导线来指导修复,最佳修复偏移量的确定由全局随机搜索变为在不同层中对应位置的引导搜索,极大缩短了计算时间。
大片纹理受损区域的图像修复是一项具有挑战性的任务。在多数情况下,受损区域的边界无法为图像修复提供较多参考信息,导致修复后区域内外产生纹理及结构上的不一致。本文从立面上各元素的规则排列特性出发,通过引导线对计算出相邻层元素重复间隔即层高,结合受损区域周围特征寻找最佳纹理替换位置。
图1展示了顾及立面元素排列特性的立面纹理修复过程。假设l1、l2为立面F上的一对引导线对,间隔为h(h>0)。根据立面元素排列的重复性,对受损区域Ω,可选择的修复偏移量为h、2h及3h,分别对应修复纹理块P1、P2、P3。结合受损区域周围特征(无其它立面元素),综合判断纹理块P2为最佳修复块,进行纹理替换,完成图像修复。
图1 顾及立面元素排列特性的纹理修复原理
在实际生产中受损区域往往因树、屋檐及建筑等遮挡位于图像边缘,从而失去了较多用于推理内部结构的外部参考信息,降低了作业员推理结果的准确性,导致修复效果不理想。因此,本文基于立面元素的排列特性提出了一种能够自动检测图像中引导线对的立面纹理修复方法,减少了修复过程中的人为干预,提高了图像修复的自动化进程。
1.2.1 算法流程 考虑到图像修复的关键在于确定修复区域到待修复区域的最佳偏移量,本文提出一种顾及立面元素排列特性的图像修复方法,通过层特征匹配实现最佳偏移量的自动搜索。首先,根据用户在立面图像上圈出的受损区域自动检测出区域外的层特征线,通过将相邻层最相似的层特征线两两配对来估计建筑立面的层高,并以此为单位进行最佳偏移量的搜索,替换受损纹理块,最后利用泊松算法对修复区域内外进行匀色,完成立面纹理修复。算法流程如图2所示。
图2 顾及立面元素排列特性的纹理修复方法
1.2.2 自适应层特征线检测 中式建筑尤其是老住宅区,同一层楼各户对于阳台、厨房等布局改造空间较大,彼此之间相似性低,但每层总体结构保持一致,由此,本文提出了层特征线的理论,用于引导破损区域的纹理修复。判断一条线为层特征线需要符合以下条件:1)为特征显著的线;2)为近似水平线;3)可以在相邻层找到特征相同的线。
根据层特征线的水平特征,本实验只检测水平方向上的特征线。本文采用Canny边缘检测算法结合LSD线段检测算法提取出符合要求的层特征线(图2(b))。
本文在Canny算法基础上做出以下改进。首先在一阶偏导算子的选择上,为了检测出水平方向特征更明显的层特征线,本文设置2种9×3的层特征线检测算子如图3,左侧算子用于检测由上到下呈暗到亮的层特征线、右侧算子用于检测由上到下呈亮到暗的层特征线,相比原Sobel算子抗噪性更强。
图3 自定义层特征线检测算子
其次,在二值化方法上,为了提高算法自动化程度,选择自适应阈值算法代替原双阈值算法。自适应阈值算法思想如下:令mxy和σxy是图像中以(x,y)为中心的邻域Sxy所包含像素集合的均值和标准差,局部阈值Txy计算公式为:
Txy=a×σxy+b×mxy
(1)
式中:a和b是非负常数,计算得到的二值图像g(x,y)为:
(2)
式中:f(x,y)是输入图像,对图像中所有像素应用该公式,则获取分割后的二值图。
1.2.3 基于二次匹配的层特征线配对 为了建立立面各层相似纹理之间的联系,需求出立面上重复元素的排列间隔,即立面层高。本文在检测出的层特征线的基础上,通过将相邻层中重复元素对应位置的层特征线配对,用线对竖直间隔近似表示立面层高。首先,本文设置一个初始层高范围3.0~5.5 m[11]用于粗筛图像中所有可能的层特征线对。其次,利用SIFT(尺度不变特征转换)描述子对图像中的特征点进行预检测,对所有可能的层特征线对附近相同范围内的特征点集合进行相似度匹配,最后将匹配相似度最高的层特征线对作为最终输出结果(图2(c))。
本文采用结构相似度(structural similarity index,SSIM)[12]作为相似度评价指标。对输入图像x和y,结构相似度的数学定义如下:
SSIM(x,y)=[l(x,y)]α[c(x,y)]β[s(x,y)]γ
(3)
其中:l(x,y)为平均亮度相似性,是图像x的区域平均亮度ux和图像y的区域平均亮度ux的相似度;c(x,y)为对比度相似性,是图像x的区域标准差σx和图像y的区域标准差σy的相似度;s(x,y)为结构相似性。以上3个分量的计算公式为:
(4)
其中:σxy为x,y的协方差,C1、C2、C3为常数。一般将式(1)中的α、β、γ设为1,得到最终计算公式:
(5)
1.2.4 基于估计层高的纹理替换 考虑到立面各层结构虽然相似,但纹理可能具有差异性。为了得到受损区域到修复区域的最佳偏移量,本文将结构相似度前3的层特征线对之间的相似度加权平均间隔作为立面层高。以此为单位在受损区域上下各层进行最佳偏移量搜索(图2(d)),匹配得到最相似区域来替换受损区域从而实现纹理修复(图2(e))。立面层高计算公式如下:
(6)
式中:FH为计算得到的层高,ωk为第k对层特征线对的结构相似度,Sk为第k对层特征线对中点的垂直间隔,n=3。
1.2.5 泊松融合 由于太阳光照射导致立面整体亮度不均,纹理替换后修复区域与周围亮度不一致,需要进行匀光处理。本文采用主流的泊松融合算法对修复后区域进行匀光匀色处理(图2(f))。泊松融合的核心在于保证梯度域上连续的同时利用插值重建融合区域的像素值[13]。融合步骤如下。
1)利用差分运算计算出图像梯度场。
2)计算背景图像的梯度场。
3)计算融合图像的梯度场。把待融合图像的梯度场赋值于拼接图像对应区域梯度场,得到一个待重建的完整梯度场。
4)计算融合图像的散度场。对步骤3)得到的待重建梯度场,对梯度求偏导,计算得到融合图像的散度。
5)计算系数矩阵。泊松重建方程Ax=b,其中b为图像散度,x是融合图像的像素值。只要构建系数矩阵A就能融合图像。
泊松融合的关键在于利用重建方程计算出待修复区域内的像素值,使修复边缘及内部区域梯度场平滑过渡,从而达到纹理融合的目的。图4中左图为纹理替换后的图像,右图是泊松融合后的结果,对比矩形框内可以发现右图更加自然。
图4 图像泊松融合结果对比
本文从陕西省安康市某地区的单体化模型中抽取了10张经过自动纹理映射后的立面图像作为实验数据集,包括住宅、办公和商业建筑立面3类,结合人工圈出的受损区域掩膜图像共同作为算法输入。
本文算法在3.2 GHz Intel CPU的电脑上以Microsoft Visual Studio 2019为开发平台,基于C++编程语言结合OpenCV 3.4.15库进行实现。
为了直观地验证本文方法的有效性,本实验根据不同遮挡物在立面上的位置将数据集分为屋檐、树木及建筑物3类遮挡,分别应用本文方法与Criminisi[2]、PatchMatch[3]、PixMix[14]方法进行图像修复效果对比。其中,综合考虑算法的运行时间与修复效率,将PatchMatch[2]和PixMix[14]方法的迭代次数均设置为20次,此外未对算法做任何加速处理。
通过图5中不同方法修复某写字楼立面屋檐遮挡的结果对比可知,采用Criminisi[2]方法只能修复下边缘纹理。PixMix[14]方法修复结果错乱、不合逻辑。PatchMatch[3]方法修复结果在整体上符合图像上下文结构和内容,但仍存在部分窗户错位、墙面纹理模糊的现象,且修复区域内外存在色调差异。本文方法修复结果较好地还原了屋檐下的窗户和墙壁的纹理,且修复区域边缘纹理衔接自然,整体色调均匀。
图5 修复屋檐遮挡结果对比
通过图6中不同方法修复某学校立面建筑物遮挡的结果对比可知,Criminisi[2]方法恢复出部分窗户纹理,但无法与已知区域的窗户对齐。PixMix[14]方法部分还原了被建筑物遮挡的立面纹理及结构,但存在墙面凸起的问题,整体纹理连续性较差。PatchMatch[3]方法整体上还原了被建筑物遮挡的窗户和墙面纹理,但仍存在直线断开、窗户残缺的问题。本文方法能够较好地修复被建筑物遮挡的立面纹理,得到纹理清晰、上下结构一致的立面图像。
图6 修复建筑物遮挡结果对比
通过图7中不同方法修复某居民楼立面树木遮挡的结果对比可知,Criminisi[2]方法修复了部分已知区域附近的窗户与墙面纹理。PixMix[14]方法无法得到合理的修复结果。PatchMatch[3]方法可以修复部分雨棚的纹理和结构,但无法修复被遮挡的复杂窗户纹理。本文方法能够较为完整地修复被树木遮挡的复杂立面元素结构和纹理,且在视觉上无明显缝隙感。
图7 修复树木遮挡结果对比
为了从修复精度方面进一步验证本文方法的有效性,以作业员在实际生产中修复的立面图像为评价标准,选取结构相似度(SSIM)、峰值信噪比(PSNR)2个评价指标对Criminisi[2]、PatchMatch[3]、PixMix[14]方法以及本文方法在5张立面上的修复精度进行统计,结果如表1所示。
表1 不同图像修复方法的精度对比
根据表1中不同立面修复方法的精度对比可知,PatchMatch[3]和本文方法有较高的修复精度。本文方法在大部分实验图像上结构相似度高于0.6,较Criminisi[2]和PixMix[14]方法有明显提高,较PatchMatch[3]方法也有一定提高,表明应用本文方法修复图像结果与标准图像较为相似;在峰值信噪比方面,本文方法均高于其它3种方法,减少了图像失真现象。由于wall4的待修复区域位于建筑第1层楼,被遮挡的单元门等立面要素无法在立面中找到,故应用本文方法修复精度较低。
为了验证本文方法在修复效率上的高效性,对Criminisi[2]、PatchMatch[3]、PixMix[14]方法以及本文方法在10张立面上的修复耗时进行统计,结果如表2所示。
表2 不同图像修复方法的耗时对比/s
根据表2中不同立面修复方法的耗时对比可知,PixMix[14]和本文方法有较高的修复效率,但PixMix[14]方法的修复效果较差。PatchMatch[3]方法和本文方法有较好的修复效果,但PatchMatch[3]方法的修复效果受制于算法迭代次数,要想达到好的修复效果必然产生高耗时。综上,对于立面边缘的大区域遮挡修复,本文方法可以在较短的时间内达到最佳的效果。
本文提出了一种顾及立面元素排列特性的纹理修复算法。实验表明,利用建筑立面元素在各层规律地排列组合特性能较好地估算出立面层高,从而较为精准地找到受损区域的替换纹理区域,利用泊松融合算法进行匀光处理后,可以有效地恢复受损区域的纹理和结构。通过与已有方法的比较,本文方法对受损区域较大且位于边缘的立面图像具有更好的修复效果。
目前本文算法在检测层特征线时受预设层高范围的限制,对于少部分层高不在范围内的立面检测效果较差,影响了后续处理。下一步的研究可以在处理前对立面进行分类,对不同类别的立面分别设置不同的层高范围,提高层特征线检测在不同立面上的鲁棒性。