本發(fā)明涉及一種基于場景夜景圖的光源自動排列方法,屬于計算機圖形學領域。
背景技術:
在日常生活中,我們可以看到各種漂亮絢麗的建筑夜景。在三維世界中,為了渲染漂亮的夜景圖,需要對場景進行燈光編輯。一般情況下,由美術工作者對場景進行手工編輯。但是,在大型模型中,點光源有數(shù)千甚至上萬個,單純的手工編輯,鼠標點選,不僅繁瑣,而且效率低下,需要一種自動化的方法來完成此項工作。
基于夜景圖來布置光源的核心在于相機標定。目前的相機標定方法包括基于主動視覺的相機標定方法是在已知相機的某些運動信息的情況下進行標定相機,這些信息有定性的和定量的,由于知道了一些相機的運動信息,基于主動視覺的相機標定方法求解相機的參數(shù)是線性的,所以算法具有較高的魯棒性。由于傳統(tǒng)相機標定方法要求高精度的設備,張正友在1998年提出了一種新方法,其求解相機參數(shù)的初值時采用相機成像的線性模型,然后給出考慮了非線性模型中的分線性畸變因素的目標函數(shù),通過非線性最優(yōu)化的方法可以求得相機參數(shù)的最優(yōu)解。這種標定方法具有較好的魯棒性、實用性和較高的精度,避免了傳統(tǒng)方法需要高精度設備的要求,適合辦公、家庭使用的桌面視覺系統(tǒng)。不足之處在于該方法不能給非線性最優(yōu)化提供一個比較理想的初始值,因其在第一步求解相機參數(shù)初始值時采用的是整幅圖像的像點。至今,相機標定技術還在不斷的研究和發(fā)展中。但是,目前為止,基于單張圖片進行相機標定,利用以往的方法并未體現(xiàn)出較好的效果。
技術實現(xiàn)要素:
本發(fā)明要解決的技術問題是:提供一種基于場景夜景圖對三維場景多光源自動排列方法。并利用GPU硬件的計算能力,提高了計算與繪制效率。該方法主要是采用一種自適應的方法,建立單張二維彩色夜景圖同真實三維模型的映射關系,從而恢復單方向的光源信息。然后利用模型本身特征,進行可控數(shù)量的全方位采樣,根據(jù)單方向恢復的光源信息重建三維方向的光源信息,并利用光照模型在GPU加速下進行繪制。
本發(fā)明解決上述技術問題的技術方案為:一種基于場景夜景圖的光源自動排列方法,該方法包括如下步驟:
步驟(1)、針對輸入的RGB建筑物彩色夜景圖,進行裁切、提取輪廓、灰度化、二值化預處理,生成比對的目標圖像;
步驟(2)、利用模擬退火原理,采用貪心的思路從不同位置對場景進行相機采樣,同目標圖像對比,估計相機模型參數(shù),找到三維模型和二維夜景圖的對應關系;
步驟(3)、在模型表面進行數(shù)量可控的均勻采樣,由于從二維圖片到三維的映射產生的點位置存在誤差,分布不均勻,數(shù)量不可控等原因,需要對樣本點進行進行重采樣,采用泊松盤碟采樣算法重采樣的樣本點應具有分布較均勻,數(shù)量可控制的特點;
步驟(4)、步驟(2)和步驟(3)生成的采樣點作為多光源進行繪制,查看繪制的效果。
進一步的,所述步驟(1)中具體步驟如下:
步驟(1a)、從輸入圖片中選取包含建筑物主體部分,按照設定的寬高width,height對模型進行裁剪,裁剪的大小將是最終在OpenGL搜索時的窗口大??;
步驟(1b)、在步驟(1a)基礎上提取輪廓,生成輪廓矩陣,存儲位置和顏色信息;
步驟(1c)、在步驟(1a)和步驟(1b)基礎上,對圖像使用三通道色值的平均值作為灰度值,將彩圖轉化為灰度圖,設定閾值,進行二值化分割,生成目標比對圖像。
進一步的,所述步驟(2)中具體步驟如下:
步驟(2a)、初始化參數(shù),從X,Y,Z正負軸方向設置6個相機,進行投影通過設定好的步長,進行相機參數(shù)遍歷,選擇在裁剪面的結果作為種子節(jié)點,進行延伸;
步驟(2b)、大范圍搜索,在步驟(2a)基礎上對種子節(jié)點進行隨機延伸,經(jīng)過模型視圖變換,視口變換,投影變換找到局部最優(yōu)值,加入局部最優(yōu)值隊列,減小參數(shù)隨機步長;
步驟(2c)、在步驟(2b)基礎上縮小搜索范圍,精細搜索,采用控制變量的原則,縮小變量的改變范圍,固定某一變量,改變其他變量,在小范圍搜索找到近似的全局最優(yōu)值。
進一步的,所述步驟(3)包括:對模型進行Poisson圓盤采樣,采用K近鄰的方法,針對每個再采樣點,取具體它最近的K個原來采樣點的顏色信息,加權平均算出該光源信息。
進一步的,所述步驟(4)包括:采用Lambert反射模型,計算的多光源信息進行多源繪制,并在GPU上進行加速,查看繪制效果。
總之,我們提出了一種新的方法來根據(jù)單張二維夜景圖對三維模型進行多光源布置,與之前手動方法和利用腳本語言編寫相比,具有優(yōu)點如下:
(1)工作效率效率大大提高。傳統(tǒng)的手動布置光源方法時間慢,工作強度大,采用此方法自動化布置光源,并且具有較好的效果。
(2)具有可編輯性。可根據(jù)實際情況對光源位置,光源強度,光源數(shù)量進行自動更改,更加靈活。
(3)具有可擴展性。在已有的基礎上,可以添加新的場景,擴展新的屬性,并設計光源信息動態(tài)變更方案。
附圖說明
圖1為一種基于場景夜景圖的光源自動排列方法整體流程圖;
圖2為夜景圖像預處理效果圖,其中,圖2(a)為原始夜景圖;圖2(b)為經(jīng)裁剪分割出的目標夜景圖;圖2(c)為經(jīng)二值化的目標圖;
圖3為相機模型示意圖;
圖4為相機搜索過程結構圖;
圖5為自適應搜索相機模型原理圖,其中圖5(a)為自適應局部小范圍搜索示意圖;圖5(b)為加入隨機過程搜索示意圖;
圖6為相機模型搜索過程效果圖,其中,圖6(a)為大范圍搜索過程效果圖;圖6(b)為小范圍精細搜索過程效果圖;
圖7為根據(jù)夜景圖對模型全局布光效果圖,其中,圖7(a)為單側布光效果圖;圖7(b)為經(jīng)對稱全局布光效果圖;
圖8為對模型重采樣后布光效果圖,其中,圖8(a)為原始圖像;圖8(b)為恢復采樣點示意圖;圖8(c)為重采樣(500)示意圖;圖8(d)為重采樣(1000)示意圖。
具體實施方式
下面結合附圖以及本發(fā)明的具體實施方式進一步說明本發(fā)明。
如圖1所示,本發(fā)明的實施過程主要分成四個步驟:二維彩色夜景圖的預處理、相機參數(shù)估計、光源數(shù)據(jù)重采樣、多光源繪制。
步驟(1)二維彩色夜景圖的預處理
相機模型恢復的輸入數(shù)據(jù)是RGB彩色夜景圖,目標圖像是網(wǎng)絡圖片庫查找而來,所以除主景之外,包含許多輔景,特效等雜亂信息,需要剔除。如圖2所示為夜景圖像預處理效果圖樣例,其中圖2(a)為原始夜景圖;圖2(b)為經(jīng)裁剪分割出的目標夜景圖;圖2(c)為經(jīng)二值化的目標圖。具體過程如下:
a)裁切
首先從輸入圖片中選取包含建筑物主體部分,按照設定的寬高width,height對模型進行裁剪。裁剪的大小將是最終在OpenGL搜索時的窗口大小,從搜索速度和準確度考慮,裁切的大小需要適中。
b)提取輪廓
經(jīng)過裁剪后,我們進行輪廓的手動提取,在提取的過程中要保持輪廓準確。在提取時,會有部分輪廓不清晰或者遮擋,我們將根據(jù)模型進行適當?shù)耐茰y,盡可能提取正確。在提取輪廓之后,對于輪廓外的區(qū)域填充黑色,按照原有的尺寸保存。分別保存兩份,一份是填充黑色的,一部分是未填充的原圖。填充后的將用作提取輪廓,未填充的將作為后續(xù)的顏色提取。
c)圖像二值化
夜景圖為三通道的圖片,大小為height(高度)*width(寬度)*3,將得到一個三維的矩陣,存儲位置和顏色信息。使用三通道色值的平均值作為灰度值,將彩圖轉化為灰度圖。
M′(i,j)=(M(i,j,1)+M(i,j,2)+M(i,j,3))/3 (1)
經(jīng)過轉換后,我們將得到一個height*width的新矩陣,記錄了原圖片的灰度信息。然后對灰度值進行閾值分割以轉化為二值矩陣。假定閾值為k,進行閾值分割:
遍歷整張圖片,對于每個點,如果該點的灰度值大于k,我們認為該點為模型中的點,將該點標記為255,否則標記為0。通過遍歷,我們得到了模型輪廓的二值矩陣,大小為hight*width。
步驟(2)相機參數(shù)估計。如圖3所示,為相機模型示意圖,我們簡化為相機位置,相機視點中心,相機頭頂方向,裁剪面長寬比四個變量。我們采用了一種模擬退火的原理,利用貪心思想,加入隨機因素,先在大范圍內找到一些局部的最優(yōu)解,然后根據(jù)這些最優(yōu)解逐步細化,找到近似的全局最優(yōu)解。
恢復過程是通過遍歷相機參數(shù),將模型位置固定,改變相機參數(shù)。計算每次改變參數(shù)后的投影圖形,通過比對目標圖形的輪廓數(shù)據(jù),建立衡量函數(shù),計算得分,選取得分高的做為優(yōu)秀的相機參數(shù)。在搜索策略上,我們引用了模擬退火的思想采取了兩級搜索的方式,首先進行步長較大的搜索,在確定較好的搜索效果后,以最優(yōu)搜索點為中心,減小步長,在小范圍里進行搜索,得到更為準確的結果。
該解決方案是利用模擬退火的思想,用來在一個大的搜尋空間內找尋命題的最優(yōu)解。具體步驟如下所示:
(1)初始化:初始解空間隊列(優(yōu)先隊列)Q,初始解狀態(tài)S(是算法迭代的起點),每個T值的迭代次數(shù)L。
初始化pos_MaxStep(相機位置改變步長),target_Step(目標朝向改變步長),headDir_Step(相機頭頂方向改變步長)等參數(shù),其中步長參數(shù)充分大。如圖4所示,根據(jù)模型包圍盒,從模型包圍盒上、下、左、右、前、后六個方向進行查找,每個對應方向做為相機朝向。同時改變相機頭頂朝向和位置。相機頭頂朝向只在上、下、左、右、前、后進行改變。選取場景投影在裁剪面范圍內的相機模型,做為生長種子放入初始解空間隊列Q。每個T值的迭代次數(shù)Iter_num。
(2)對k=1,……,Iter_num做第(3)至第(8)步:
(3)若k>Detail_num(細搜索迭代值),進行精細查找,否則跳至(4)。如圖5(a)所示,采用固定變量法,小范圍內改變Wh_Rate(長寬比),HeadDir(相機頭朝向),Camra_pos(相機位置)。
(4)產生新解S′。根據(jù)擾動生成個數(shù)step_nums,如圖5(b)所示,同時向多個方向隨機改變隨機Camra_pos(相機位置),Wh_Rate(長寬比),HeadDir(相機朝向)。
(5)計算增量Δt′=C(S′)-C(S),其中C(S)為評價函數(shù),用來計算投影產生的二值圖同目標二值圖的比較產生的的錯誤率。
評價函數(shù)的評判標準是目標圖像和投影輪廓的重合度。如圖6所示為相機模型搜索過程效果圖,其中,圖6(a)為大范圍搜索過程示意圖;圖6(b)為小范圍精細搜索過程示意圖。對目標圖像和投影輪廓圖對每一個像素每一個像素值進行比較。綜合考慮錯誤的部分和正確的部分,對搜索結果進行反饋。
(6)若Δt′<0則接受S′作為新的當前解,加入隊列Q,更新最優(yōu)解;
(7)如果滿足終止條件則輸出當前解作為最優(yōu)解,結束程序。
終止條件通常取為連續(xù)若干個新解都沒有被接受時終止算法。
(8)更新隊列的解的數(shù)目,T逐漸減少,且T>0,然后轉第2步。
(9)接收隊列Q的頭元素作為相機參數(shù)。
步驟(3)光源數(shù)據(jù)重采樣。在恢復相機參數(shù)后,我們將該形狀的二值掩膜M保存在一個矩陣中,然后根據(jù)繪制結果,從輸入圖片取得點的顏色信息。通過建立一個width*height*3的顏色矩陣,根據(jù)繪制的二值輪廓,在像素值為255的繪制結果位置,在RGB圖中的對應取出顏色,并將顏色寫入顏色矩陣的對應位置上。
根據(jù)OpenGL的屏幕坐標計算該點投影前的三維坐標,在OpenGL中深度被定義為近裁剪面near和遠裁剪面far之間的z值,z的范圍是(-1.0,1.0)。經(jīng)過DepthRange()進行映射我們得到新的z′值,范圍是(0.0,1.0),近裁剪面的深度值為0,遠裁剪面的深度值是1,遠近裁剪面之間是0到1之間的值,如果讀取該點的深度值是1,則代表該點位于遠裁剪面或者沒有被繪制到。計算方法如下:
在讀取該點的深度值時,我們要注意的是屏幕坐標的原點是左上角,OpenGL中使用的是不同的坐標系,它的原點是是左下角,因此需要做以下變化:
winX=(float)n;
winY=(WindowHeight-(float)m; (4)
繪制過程中經(jīng)歷了模型視圖變換,投影變換,視口變換,由屏幕坐標計算世界坐標就是OpenGL繪制的反向過程,進行反變換我們就能計算得到世界坐標。假設屏幕坐標為(winZ,winY,winZ,1),世界坐標為(objZ,objY,objZ,w),M,V,P分別代表此時OpenGL中的模型視圖變換,視口變換,投影變換,則有:
其中,winZ代表的是對應屏幕點上的深度值。
在導入模型后,我們已經(jīng)計算了模型的包圍盒和各個方向上的中心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,則對應的變換為:
我們將含有顏色的坐標點對進行軸對稱,得到各個面的顏色信息。以下就是對稱前后的對比圖,可以明顯的看出經(jīng)過對稱后,點的數(shù)量和分布更加完善,各個面都有點分布,覆蓋360度。
經(jīng)過采樣點顏色恢復,我們恢復了三維網(wǎng)格各個面的采樣點信息,如圖7所示,為根據(jù)夜景圖對模型全局布光效果圖,其中,圖7(a)為單側布光效果圖;圖7(b)為經(jīng)對稱全局布光效果圖。但是,由于模型本身同真實的目標存在一些外形的誤差,以及采樣恢復的不準確,導致實際采樣出的點分布不均勻,且數(shù)量不可控。我們采用一種藍噪聲采樣方法,對模型本身進行了泊松圓盤重采樣,通過參數(shù)改變調節(jié)采樣點數(shù)量。Poisson圓盤采樣是一種由最小距離準則限制的一致性采樣過程,在一定的空間隨機分布的采樣點,點與點之間的距離大于某個閾值,同時也不能再加入一個點,否則該點必然與某個現(xiàn)存其他點的距離小于閾值,導致違背最小距離準則。在采樣的過程中保證進行檢測,保證任意兩點的距離不超過規(guī)定的距離2r。上升到網(wǎng)格層面,我們使用測地線距離代替使用歐幾里得距離完成采樣結果。如圖8所示為對模型重采樣后布光效果圖,其中,圖8(a)為原始圖像;圖8(b)為恢復采樣點示意圖;圖8(c)為重采樣(500)示意圖;圖8(d)為重采樣(1000)示意圖。
步驟(4)多點光源渲染。我們采用Lambert反射模型計算,即漫反射光的光強僅與入射光的方向和反射點處表面法向夾角的余弦成正比。Ia環(huán)境光,Ka為環(huán)境光參數(shù),Id表示物Id為點光源,Kd(0<Kd<1)表示物體表面該點對漫反射光的反射屬性,θ是入射光線的方向與物體表面該點處法線N的夾角。
I0=IaKa+IdKd cosθ (8)
計算點光源衰減系數(shù)時候,常使用下面的公式:它包括3個因子,常量因子,線性因子和二次因子。A為常數(shù),dis為點到光源位置。
在世界坐標系中,計算點(像素)到光源的方向,做為光源的方向向量。計算像素到光源的距離,用來計算衰減因子,把環(huán)境光、漫反射光加起來,然后乘以衰減因子。