一种基于场景夜景图的光源自动排列方法技术领域
本发明涉及一种基于场景夜景图的光源自动排列方法,属于计算机图形学领域。
背景技术
在日常生活中,我们可以看到各种漂亮绚丽的建筑夜景。在三维世界中,为了渲染
漂亮的夜景图,需要对场景进行灯光编辑。一般情况下,由美术工作者对场景进行手工编
辑。但是,在大型模型中,点光源有数千甚至上万个,单纯的手工编辑,鼠标点选,不仅繁琐,
而且效率低下,需要一种自动化的方法来完成此项工作。
基于夜景图来布置光源的核心在于相机标定。目前的相机标定方法包括基于主动
视觉的相机标定方法是在已知相机的某些运动信息的情况下进行标定相机,这些信息有定
性的和定量的,由于知道了一些相机的运动信息,基于主动视觉的相机标定方法求解相机
的参数是线性的,所以算法具有较高的鲁棒性。由于传统相机标定方法要求高精度的设备,
张正友在1998年提出了一种新方法,其求解相机参数的初值时采用相机成像的线性模型,
然后给出考虑了非线性模型中的分线性畸变因素的目标函数,通过非线性最优化的方法可
以求得相机参数的最优解。这种标定方法具有较好的鲁棒性、实用性和较高的精度,避免了
传统方法需要高精度设备的要求,适合办公、家庭使用的桌面视觉系统。不足之处在于该方
法不能给非线性最优化提供一个比较理想的初始值,因其在第一步求解相机参数初始值时
采用的是整幅图像的像点。至今,相机标定技术还在不断的研究和发展中。但是,目前为止,
基于单张图片进行相机标定,利用以往的方法并未体现出较好的效果。
发明内容
本发明要解决的技术问题是:提供一种基于场景夜景图对三维场景多光源自动排
列方法。并利用GPU硬件的计算能力,提高了计算与绘制效率。该方法主要是采用一种自适
应的方法,建立单张二维彩色夜景图同真实三维模型的映射关系,从而恢复单方向的光源
信息。然后利用模型本身特征,进行可控数量的全方位采样,根据单方向恢复的光源信息重
建三维方向的光源信息,并利用光照模型在GPU加速下进行绘制。
本发明解决上述技术问题的技术方案为:一种基于场景夜景图的光源自动排列方
法,该方法包括如下步骤:
步骤(1)、针对输入的RGB建筑物彩色夜景图,进行裁切、提取轮廓、灰度化、二值化
预处理,生成比对的目标图像;
步骤(2)、利用模拟退火原理,采用贪心的思路从不同位置对场景进行相机采样,
同目标图像对比,估计相机模型参数,找到三维模型和二维夜景图的对应关系;
步骤(3)、在模型表面进行数量可控的均匀采样,由于从二维图片到三维的映射产
生的点位置存在误差,分布不均匀,数量不可控等原因,需要对样本点进行进行重采样,采
用泊松盘碟采样算法重采样的样本点应具有分布较均匀,数量可控制的特点;
步骤(4)、步骤(2)和步骤(3)生成的采样点作为多光源进行绘制,查看绘制的效
果。
进一步的,所述步骤(1)中具体步骤如下:
步骤(1a)、从输入图片中选取包含建筑物主体部分,按照设定的宽高width,
height对模型进行裁剪,裁剪的大小将是最终在OpenGL搜索时的窗口大小;
步骤(1b)、在步骤(1a)基础上提取轮廓,生成轮廓矩阵,存储位置和颜色信息;
步骤(1c)、在步骤(1a)和步骤(1b)基础上,对图像使用三通道色值的平均值作为
灰度值,将彩图转化为灰度图,设定阈值,进行二值化分割,生成目标比对图像。
进一步的,所述步骤(2)中具体步骤如下:
步骤(2a)、初始化参数,从X,Y,Z正负轴方向设置6个相机,进行投影通过设定好的
步长,进行相机参数遍历,选择在裁剪面的结果作为种子节点,进行延伸;
步骤(2b)、大范围搜索,在步骤(2a)基础上对种子节点进行随机延伸,经过模型视
图变换,视口变换,投影变换找到局部最优值,加入局部最优值队列,减小参数随机步长;
步骤(2c)、在步骤(2b)基础上缩小搜索范围,精细搜索,采用控制变量的原则,缩
小变量的改变范围,固定某一变量,改变其他变量,在小范围搜索找到近似的全局最优值。
进一步的,所述步骤(3)包括:对模型进行Poisson圆盘采样,采用K近邻的方法,针
对每个再采样点,取具体它最近的K个原来采样点的颜色信息,加权平均算出该光源信息。
进一步的,所述步骤(4)包括:采用Lambert反射模型,计算的多光源信息进行多源
绘制,并在GPU上进行加速,查看绘制效果。
总之,我们提出了一种新的方法来根据单张二维夜景图对三维模型进行多光源布
置,与之前手动方法和利用脚本语言编写相比,具有优点如下:
(1)工作效率效率大大提高。传统的手动布置光源方法时间慢,工作强度大,采用
此方法自动化布置光源,并且具有较好的效果。
(2)具有可编辑性。可根据实际情况对光源位置,光源强度,光源数量进行自动更
改,更加灵活。
(3)具有可扩展性。在已有的基础上,可以添加新的场景,扩展新的属性,并设计光
源信息动态变更方案。
附图说明
图1为一种基于场景夜景图的光源自动排列方法整体流程图;
图2为夜景图像预处理效果图,其中,图2(a)为原始夜景图;图2(b)为经裁剪分割
出的目标夜景图;图2(c)为经二值化的目标图;
图3为相机模型示意图;
图4为相机搜索过程结构图;
图5为自适应搜索相机模型原理图,其中图5(a)为自适应局部小范围搜索示意图;
图5(b)为加入随机过程搜索示意图;
图6为相机模型搜索过程效果图,其中,图6(a)为大范围搜索过程效果图;图6(b)
为小范围精细搜索过程效果图;
图7为根据夜景图对模型全局布光效果图,其中,图7(a)为单侧布光效果图;图7
(b)为经对称全局布光效果图;
图8为对模型重采样后布光效果图,其中,图8(a)为原始图像;图8(b)为恢复采样
点示意图;图8(c)为重采样(500)示意图;图8(d)为重采样(1000)示意图。
具体实施方式
下面结合附图以及本发明的具体实施方式进一步说明本发明。
如图1所示,本发明的实施过程主要分成四个步骤:二维彩色夜景图的预处理、相
机参数估计、光源数据重采样、多光源绘制。
步骤(1)二维彩色夜景图的预处理
相机模型恢复的输入数据是RGB彩色夜景图,目标图像是网络图片库查找而来,所
以除主景之外,包含许多辅景,特效等杂乱信息,需要剔除。如图2所示为夜景图像预处理效
果图样例,其中图2(a)为原始夜景图;图2(b)为经裁剪分割出的目标夜景图;图2(c)为经二
值化的目标图。具体过程如下:
a)裁切
首先从输入图片中选取包含建筑物主体部分,按照设定的宽高width,height对模
型进行裁剪。裁剪的大小将是最终在OpenGL搜索时的窗口大小,从搜索速度和准确度考虑,
裁切的大小需要适中。
b)提取轮廓
经过裁剪后,我们进行轮廓的手动提取,在提取的过程中要保持轮廓准确。在提取
时,会有部分轮廓不清晰或者遮挡,我们将根据模型进行适当的推测,尽可能提取正确。在
提取轮廓之后,对于轮廓外的区域填充黑色,按照原有的尺寸保存。分别保存两份,一份是
填充黑色的,一部分是未填充的原图。填充后的将用作提取轮廓,未填充的将作为后续的颜
色提取。
c)图像二值化
夜景图为三通道的图片,大小为height(高度)*width(宽度)*3,将得到一个三维
的矩阵,存储位置和颜色信息。使用三通道色值的平均值作为灰度值,将彩图转化为灰度
图。
M′(i,j)=(M(i,j,1)+M(i,j,2)+M(i,j,3))/3 (1)
经过转换后,我们将得到一个height*width的新矩阵,记录了原图片的灰度信息。
然后对灰度值进行阈值分割以转化为二值矩阵。假定阈值为k,进行阈值分割:
遍历整张图片,对于每个点,如果该点的灰度值大于k,我们认为该点为模型中的
点,将该点标记为255,否则标记为0。通过遍历,我们得到了模型轮廓的二值矩阵,大小为
hight*width。
步骤(2)相机参数估计。如图3所示,为相机模型示意图,我们简化为相机位置,相
机视点中心,相机头顶方向,裁剪面长宽比四个变量。我们采用了一种模拟退火的原理,利
用贪心思想,加入随机因素,先在大范围内找到一些局部的最优解,然后根据这些最优解逐
步细化,找到近似的全局最优解。
恢复过程是通过遍历相机参数,将模型位置固定,改变相机参数。计算每次改变参
数后的投影图形,通过比对目标图形的轮廓数据,建立衡量函数,计算得分,选取得分高的
做为优秀的相机参数。在搜索策略上,我们引用了模拟退火的思想采取了两级搜索的方式,
首先进行步长较大的搜索,在确定较好的搜索效果后,以最优搜索点为中心,减小步长,在
小范围里进行搜索,得到更为准确的结果。
该解决方案是利用模拟退火的思想,用来在一个大的搜寻空间内找寻命题的最优
解。具体步骤如下所示:
(1)初始化:初始解空间队列(优先队列)Q,初始解状态S(是算法迭代的起点),每
个T值的迭代次数L。
初始化pos_MaxStep(相机位置改变步长),target_Step(目标朝向改变步长),
headDir_Step(相机头顶方向改变步长)等参数,其中步长参数充分大。如图4所示,根据模
型包围盒,从模型包围盒上、下、左、右、前、后六个方向进行查找,每个对应方向做为相机朝
向。同时改变相机头顶朝向和位置。相机头顶朝向只在上、下、左、右、前、后进行改变。选取
场景投影在裁剪面范围内的相机模型,做为生长种子放入初始解空间队列Q。每个T值的迭
代次数Iter_num。
(2)对k=1,……,Iter_num做第(3)至第(8)步:
(3)若k>Detail_num(细搜索迭代值),进行精细查找,否则跳至(4)。如图5(a)所
示,采用固定变量法,小范围内改变Wh_Rate(长宽比),HeadDir(相机头朝向),Camra_pos
(相机位置)。
(4)产生新解S′。根据扰动生成个数step_nums,如图5(b)所示,同时向多个方向随
机改变随机Camra_pos(相机位置),Wh_Rate(长宽比),HeadDir(相机朝向)。
(5)计算增量Δt′=C(S′)-C(S),其中C(S)为评价函数,用来计算投影产生的二值
图同目标二值图的比较产生的的错误率。
评价函数的评判标准是目标图像和投影轮廓的重合度。如图6所示为相机模型搜
索过程效果图,其中,图6(a)为大范围搜索过程示意图;图6(b)为小范围精细搜索过程示意
图。对目标图像和投影轮廓图对每一个像素每一个像素值进行比较。综合考虑错误的部分
和正确的部分,对搜索结果进行反馈。
(6)若Δt′<0则接受S′作为新的当前解,加入队列Q,更新最优解;
(7)如果满足终止条件则输出当前解作为最优解,结束程序。
终止条件通常取为连续若干个新解都没有被接受时终止算法。
(8)更新队列的解的数目,T逐渐减少,且T>0,然后转第2步。
(9)接收队列Q的头元素作为相机参数。
步骤(3)光源数据重采样。在恢复相机参数后,我们将该形状的二值掩膜M保存在
一个矩阵中,然后根据绘制结果,从输入图片取得点的颜色信息。通过建立一个width*
height*3的颜色矩阵,根据绘制的二值轮廓,在像素值为255的绘制结果位置,在RGB图中的
对应取出颜色,并将颜色写入颜色矩阵的对应位置上。
根据OpenGL的屏幕坐标计算该点投影前的三维坐标,在OpenGL中深度被定义为近
裁剪面near和远裁剪面far之间的z值,z的范围是(-1.0,1.0)。经过DepthRange()进行映
射我们得到新的z′值,范围是(0.0,1.0),近裁剪面的深度值为0,远裁剪面的深度值是1,远
近裁剪面之间是0到1之间的值,如果读取该点的深度值是1,则代表该点位于远裁剪面或者
没有被绘制到。计算方法如下:
在读取该点的深度值时,我们要注意的是屏幕坐标的原点是左上角,OpenGL中使
用的是不同的坐标系,它的原点是是左下角,因此需要做以下变化:
winX=(float)n;
winY=(WindowHeight-(float)m; (4)
绘制过程中经历了模型视图变换,投影变换,视口变换,由屏幕坐标计算世界坐标
就是OpenGL绘制的反向过程,进行反变换我们就能计算得到世界坐标。假设屏幕坐标为
(winZ,winY,winZ,1),世界坐标为(objZ,objY,objZ,w),M,V,P分别代表此时OpenGL中的模
型视图变换,视口变换,投影变换,则有:
其中,winZ代表的是对应屏幕点上的深度值。
在导入模型后,我们已经计算了模型的包围盒和各个方向上的中心xyz方向上的
中心点(centerx,centery,centerz)。包围盒包括三个方向的六个极值,包括(xmin,xmax,
ymin,ymax,zmin,zmax)。我们可以得到模型的对称中心和对称轴。
a)对于球形的模型,我们采取中心对称
我们假设点的坐标为(x0,y0),变换后的坐标为(x1,y1),一般性的,我们假设旋转
的角度为θ,则对应的变换为:
我们假设AC弧是面向我们的面,则在AC面上可以读取到颜色信息,当上式中的旋
转角为180度时即为中心对称,此时将AC弧上的颜色信息对称到AB弧上,即可得到360度的
颜色信息。
b)对于长方体等轴对称模型,我们将采用轴对称。我们假设点的坐标为(x0,y0),变
换后的坐标为(x1,y1),直线方程为Ax+By+c=0,则对应的变换为:
我们将含有颜色的坐标点对进行轴对称,得到各个面的颜色信息。以下就是对称
前后的对比图,可以明显的看出经过对称后,点的数量和分布更加完善,各个面都有点分
布,覆盖360度。
经过采样点颜色恢复,我们恢复了三维网格各个面的采样点信息,如图7所示,为
根据夜景图对模型全局布光效果图,其中,图7(a)为单侧布光效果图;图7(b)为经对称全局
布光效果图。但是,由于模型本身同真实的目标存在一些外形的误差,以及采样恢复的不准
确,导致实际采样出的点分布不均匀,且数量不可控。我们采用一种蓝噪声采样方法,对模
型本身进行了泊松圆盘重采样,通过参数改变调节采样点数量。Poisson圆盘采样是一种由
最小距离准则限制的一致性采样过程,在一定的空间随机分布的采样点,点与点之间的距
离大于某个阈值,同时也不能再加入一个点,否则该点必然与某个现存其他点的距离小于
阈值,导致违背最小距离准则。在采样的过程中保证进行检测,保证任意两点的距离不超过
规定的距离2r。上升到网格层面,我们使用测地线距离代替使用欧几里得距离完成采样结
果。如图8所示为对模型重采样后布光效果图,其中,图8(a)为原始图像;图8(b)为恢复采样
点示意图;图8(c)为重采样(500)示意图;图8(d)为重采样(1000)示意图。
步骤(4)多点光源渲染。我们采用Lambert反射模型计算,即漫反射光的光强仅与
入射光的方向和反射点处表面法向夹角的余弦成正比。Ia环境光,Ka为环境光参数,Id表示
物Id为点光源,Kd(0<Kd<1)表示物体表面该点对漫反射光的反射属性,θ是入射光线的方向
与物体表面该点处法线N的夹角。
I0=IaKa+IdKd cosθ (8)
计算点光源衰减系数时候,常使用下面的公式:它包括3个因子,常量因子,线性因
子和二次因子。A为常数,dis为点到光源位置。
在世界坐标系中,计算点(像素)到光源的方向,做为光源的方向向量。计算像素到
光源的距离,用来计算衰减因子,把环境光、漫反射光加起来,然后乘以衰减因子。