三维图形的产生方法
本发明涉及一种三维图形的产生方法,是利用电脑将数字化的平面图形,以重新处理其前景像素亮度的方式,使之在视觉上具有立体效果的技术。
传统产生三维图形的先决条件是先要在三维空间建立一标准的三维模型,然后为这个三维模型选定一欲呈现的材质,并设定投射于三维模型的光源与三维模型的相对位置,再以一三维引擎依据前述设定好的条件对三维模型进行渲染,方可获得一具立体效果的图形。虽然这种方法的准确度佳,但是过程复杂,所产生的三维图形也会占用较多的存储空间。然而对于仅具有平面信息(X、Y轴方向的参数)的二维图形而言,想使之具有三维图形的立体效果,若以上述方法便不适了。这是因为在一般的二维图形中,缺少了产生三维图形所需的第三座标轴(Z轴方向)的参数,因此无法将一个只有平面信息的二维图形,直接通过光源投射方向的设定以及三维引擎的渲染程序,使其具有与三维图形相同的立体效果。
本发明的主要目的在于提供一种将二维图形转换为视觉上的三维图形的方法,应用在目前的电脑工作平台中,用以将一幅原本只具有平面效果的图片,藉由本发明所揭示的方法,直接转换成一幅在视觉观感上具有立体效果的图片。
为使在描述本发明的技术时更为详尽、准确,先将本文用到的名词先作如下说明:
底平面:目的图形所在的平面。
法线:对于立体空间中曲面上的一点,该点的法线是一条经过该点,并且与该点的切面垂直的直线。
法线方向:某一点的法线是一条向两端无限延伸的直线,并没有单一的方向。本文所指的法线方向特指法线朝向物体外部的延伸方向。
法线投影方向:在本文中,法线投影方向是指法线方向在底平面上的投影,它的值可以用一个二维向量来表示。
向量:用于表示空间中具有方向和大小的量,在二维空间中的向量有两个分量,包括有X轴方向与Y轴方向,以M[x][y]表示;在本文中以Dx[x][y]、Dy[x][y]表示法线投影方向在x轴与y轴方向上的分量。
图像:泛指未经处理的二维图形,在本文中以O[x][y]表示。
目的图形:被包含在图像之中,是由前景像素所构成,且为转换成三维图形的主角。
二色图:是由前景像素与前景图像所组成以I[x][y]表示之,其中前景图像用以表示图像中目的图形的像素(如:中文字形);背景像素则是用以表示图像中非目的图形的像素(即为目的图形的背景部分)。
亮度:目前颜色表示的格式有多种,本文所提的HLS是一种常用的格式,其中H表示色调,S表示饱和度,L表示亮度,亮度表是颜色的明暗程度,当一个像素受到光线的直射的时候,它会具有较高的亮度;当它处于阴影中时,其亮度就较低。
一般而言,对于一个只有漫反射的平面来说,它的反射光强度(亮度)I漫射与观察角度无关,而是与入射光强度I入射及光的入射角A有关,其关系可用公式(A)表示:
I漫射=KI入射cosA (A)
其中K为常数,入射光强度I入射为一定值,所以,在物体表面上某一点漫射光的强度主要与入射光方向及与该点法线方向的夹角有关。
本发明中图形转换的基本原理:
对于一帧只具有平面效果的数字化图像O[x][y]10,在其底平面11上的任一像素的法线方向12a都为垂直向上的(如图1所示);但是当它经处理而使其中央部分向上隆起时,在中央部分13的像素的法线方向12b则会向四周倾斜(如图2所示),因此要计算边缘部分14的像素的亮度值,就需要计算出这些改变了的法线方向12b。由于我们目前仅有的信息是一幅只具有平面效果的数字化图像o[x][y]10,因此,要准确计算这些法线方向12b是不可能的。现实的方法是计算这些法线方向12b在底平面11上的投影(法线投影方向15),然后,根据法线投影方向15与光线投影方向(即光线在底平面上的投影)所形成的夹角值α151,来计算像素的亮度,以代替前述公式(A)中的光的入射角A。
在下文中,将揭示本发明所提的平面图像的处理方法,用以计算法线投影方向;首先是将一数字化的图像O[x][y]转为二色图I[x][y],其转换方式是将原图像O[x][y]中属于背景的像素以“0”表示,属于前景的像素以“1”表示,产生一与原图像O[x][y]对应的二色图I[x][y];然后再根据每一个值为“1”的像素的法线方向,计算出它的法线投影方向。当然,只有边缘部分上的点才是有意义的法线投影方向(因为中央部分上的像素的法线投影是一个点),边缘部分的范围则是由宽度值ω控制。
请参照图3,当边缘部分上的某一像素的法线投影的夹角值为α=0时,表示该像素的法线投影方向15a正好背离光源,因此该像素有最小的亮度值(即最暗,IO=Imin)。当边缘部分上的某一像素的法线投影的夹角值为α=π,表示该像素的法线投影方向15b正好面对光源,因此,该像素有最大的亮度值(最亮,Iπ=Imax),当边缘部分上的某一像素的法线投影的夹角值为α=θ,表示该像素的法线投影方向15c介于0与π之间,则该亮度值是介于最大值与最小值之间,可由公式(1)所示的线性插值法求得:
至于中央部分的点,因为它们没有法线投影方向,所以可将它们的亮度值设为最大亮度值与最小亮度值之和的一半。于是在经过前述的处理后,可以得到基本的立体隆起效果,但边缘会显得比较僵硬,不够圆滑,此时可利用点到边界的最短以对边缘部分上的点的亮度进行修正。最后再将计算所得的代表原图像前景的新值代替原图上的各前景点的亮度值,即可获得一具有立体效果图像。
有关本发明的详细内容及技术,兹配合附图说明如下。
图1为在平面图中法线方向的示意图。
图2为平面图经处理转为立体图后,法线方向改变情形的示意图。
图3是本发明图像在经光源投射后,在图像上形成漫射的反射光的亮度计算实施例的示意图。
图4为本发明处理数字化二维图形的流程图。
图5为本发明用以计算每一前景图像的权值总和,所需的由图像中某一像素在以宽度为ω所形成的十字形区域的示意图。
图6为本发明的亮度修正曲线示意图。
图7为本发明修正原图像中属性为前景的图素的颜色及亮度的流程图。
图4所揭示的技术为根据图形转换的基本原理,将图5中含有“t”字形的数字化的图像O[x][y]10处理成具有立体效果的图像的处理流程图,其包括有:
步骤111:设定图像O[x][y]10中投射于其目的图形上的一假想投射光源的投射方向,找出光源投射方向与法线投影方向所形成的夹角α;
步骤112:设定图像O[x][y]10中目的图形的边缘宽度值ω,亦即藉由边缘宽度值ω的设定,使得目的图形在经处理后,在图像中浮起一相应的高度;
步骤113:将图像O[x][y]10转换成二色图I[x][y],也就是将图像O[x][y]10中属于背景上的各像素的值为“0”,属于前景上的各像素的值置为“1”,同时并产生维度与二色图I[x][y]的维度相同的资料矩阵Buffer[x][y](例如,若二色图为一50×100的图像,则资料矩阵也将是一个[50][100]的矩阵),而且在资料矩阵Butter[x][y]中的每个数值均与二色图I[x][y]的每一个像素呈一对一的对应关系;
步骤114:计算在二色图I[x][y]中属于图像O[x][y]10的前景的各像素的权Weight[n],其方法是依公式(2),分别把图像O[x][y]10中每个属性为前景的像素(即在二色图I[x][y]中为“1”的数值),以边缘宽度ω为宽度值,所构成的十字形区域16内每个像素的密度(如图5所示),或是以每个属性为前景的像素为中心点,边缘宽度ω为宽度值,所构成的区域,以计算在区域内每个像素的密度:
在公式(2)中,e为自然对数,n为区域内每一个像素到中心点的距离,a取适当的值,用以确保在n>=ω时,使Weight[n]可以小到忽略不计。
步骤115:根据公式(3),计算每个属性为前景的像素在所涵盖的范围内权的总和,并将之存储在先前建立的维度与二色图I[x][y]相同的资料矩阵Buffer[x][y]中,用以反映在像素以边缘宽度ω为宽度的范围内,每一属性为前景的像素的密度:
步骤116:根据图像中属于前景的各像素,依公式(4),计算每个像素在法线投影方向的X分量,并存储在一X分量矩阵Dx[x][y]中;
步骤117:根据图像中属于前景的各像素,依公式(5),计算每个像素在法线投影方向的Y分量,并存储到X-Y分量矩阵Dx[x][y]中;
(Dy为与Buffer等大小的数组)
步骤118:根据X分量矩阵、Y分量矩阵以及夹角α,利用公式(1)的线性插值法计算图像中属于前景的各像素的亮度值,并逐一记录在一维度与资料阵Buffer[x][y]相同的像素亮度矩阵Light[x][y]中,表一所示为产生图像亮度矩阵Light[x][y]的虚拟码。
表一:产生像素亮度矩阵Dx[x][y的虚拟码
//Imin为最小亮度值,Imax为最大亮度值for 9y=0;y<100;y++)for(x=0;x<50;x++){if(I[x][y]==1){//对于图I上任一值为1的点if((Dx[x][y]==0&& (Dy[x][y])==0){Light[x][y]=(Imin+Imax)/2;//最大度小亮度的平均值}else{alpha=计算夹角(光线投影方向,Dx[x][y],Dy[x][y]);//D(x[x][y],Dy[x][y]为法线投影方向)Light[x][y]=Imin+(ahlha/n)*(Imax-Imin)}} |
步骤119:计算图像中属于前景的各像素至其边界的最短距离d,并根据最短距离d的值修正在像素亮度矩阵Light[x][y]中对应的亮度值;以及
步骤120:根据像素亮度矩阵Light[x][y]修正图像O[x][y]中每一像素的颜色与亮度,以产生一具有立体效果的新图。
在上述步骤119中,在对像素亮度矩阵Lignt[x][y]中的每个数值进行修正前,会先根据原数值,建立一修正曲线17,如图6所示,图中,In为由法线投影方向与光线投影方向的夹角α所计算出的该像素的亮度,也就是目前正在处理中的像素原有的亮度;In’为非边缘区域的亮度;r为0至1之间的常数;ω为边缘区域的宽度;ω0为0至ω之间的常数;然后再依计算所得的最短距离d,在图6的修正曲线中对应出新的亮度值In”,最后再将新的亮度值In”取代像素亮度矩阵中的亮度值I,便完成此像素的亮度修正。
有关步骤120修正图像O[x][y]的方法是依表二的虚拟码来进行,请同时参阅图7,其转换的步骤如下:
步骤211:取得属性为前景的像素的颜色值,其中颜色值的格式为RGB;
步骤212:将颜色值的格式转换为具有色调(H),饱和度(L),亮度(S)的HLS格式;
步骤213:读取像素亮度矩阵Light[x][y]中与图像O[x][y]中属性为前景的各像素相应位置的亮度值,并将之取代图像O[x][y]中各前景像素原来的亮度值;
步骤214:再把取代后的像素的HLS格式转换为RGB格式:
步骤215:判断是否已全部将图像O[x][y]内前景像素的亮度值以像素亮度矩阵Light[x][y]内对应的新值取代完毕;若为是执行步骤217,若为否执行下一步骤;
步骤216:找出图像O[x][y]内下一个属性为前景的像素的位置,并取出其RGB格式的颜色值,跳至步骤212;
步骤217:产生一种在观感上具有立体效果的图像。
表二:修正原图的颜色值的虚拟码
for(y=0;y<100;y++)for(x=0;x<50;x++){if(I[x][y]==1){color RGB=O[x][y];//原图的RGB值RGB to HLS(colRGB,h,l,x);//转为HLS格式L=Light[x][y];//用计算出的亮度值代替原值ColorRGB=HLS to RGB(h,l,s);//转回RGB格式O[x][y]=colorRGB;}} |
综上所述,本发明虽藉由实施例来描述,为符合实际的需要,仍可变化其形式和细节部分,但这些变化亦不脱离本发明的精神。
本发明产生三维图形的方式,不必在三维空间中预先建立一标准的三维模型,仅藉由一平面图像,即可将图像中的目的图形转换成一种具立体视觉效果的图像。