计算机研究与发展
JOURNAL OF COMPUTER RESEARCH AND DEVELOPMENT
1999年　第36卷　第11期　Vol.36　No.11　1999



一种基于轮廓多边形的图像变形算法
王　进　潘志庚　叶澄清
摘　要：文中利用两条任意折线构成两个控制多边形,得到两条Beizer曲线，利用两曲线作为控制线对图像轮廓多边形内的网格控制点进行映射，最后利用一个快速有效的插值算法进行目标-源映射，描绘各个像素点实现变形效果.实验证明，该算法快速有效，结果形象逼真，具有一定的实用价值.
关键词：变形，Bezier 曲线，区域映射，插值
中图法分类号：TP391
AN IMAGE DEFORMATION ALGORITHM BASED ON
POLYGON OF OUTLINE
WANG Jin, PAN Zhi-Geng, and YE Cheng-Qing
（State Key Laboratory of CAD & CG，Zhejiang University，Hangzhou 310027）
（Department of Computer Science，Zhejiang University，Hangzhou 310027）
Abstract　Two Beizer curves from two random control ploygons are obtained firstly in the present paper，which are constituted of two discount lines； then these curves are taken as control lines to map those web control points within a ploygon of outline；Finally, an intuitive and expeditious interpolation algorithm realizing object-source mapping is used to paint every pixel. Experimental results of image deformation using the algorithm prove that this algorithm is intuitive, expeditious, and practical.
Key words　image deformtion, Bezier curves, region mapping, interpolation
1　引　言
　　图像变形技术在影视、广告、娱乐、轻工CAD等领域已有了广泛的应用.电视广告中文字、图片各种各样的形状变换，都是图像变形的有效应用.图像变形分为二维变形、三维变形两种，其中二维变形是对二维平面的图形、图像进行变形处理.本文讨论目前应用较多的二维变形.
2　利用两个控制多边形对图像轮廓多边形进行坐标变化
2.1　由两个控制多边形生成两条Bezier曲线
　　该算法以两条任意折线L1，L2作为输入.设L1由n+1个点p0,p1,p2,p3,…,pn 组成，L2由m+1个点q0,q1,q2,q3,…,qm 组成，则可得到：
n次的Bezier曲线L1′：　
m次的Bezier曲线L2′：　　
其情形如图1所示.


图1
2.2　利用两条Bezier曲线对轮廓多边形进行变化
　　设轮廓多边形Polygon由s+1个顶点u0,u1,u2,u3，…，us组成，则对任一顶点ui(x,y)的坐标进行如下变化（图2）.


图2
2.2.1　对轮廓多边形的各个顶点进行映射
　　假设已知图像的轮廓多边形上任意一点ui（x，y），定义图像的主轴方向为竖直方向（即外接矩形横向边的方向与X轴夹角θ为0），如图2所示.
　　过点ui（x，y）分别作X轴、Y轴的平行线，与矩形4条边的交点设为t（xt，yt），b（xb，yb），l（xl，yl），r（xr，yr）.令：

以点的个数表示Bezier曲线段的长度，在图2中有：

故 

同理可得

这样就得到了与点ui(x,y)相对应的直线段：
同样，在图（2）中有

即可得到：

　　至此，与ui(x,y)相对应的点u′i(x,y)已经求出；应用该算法依次求出与轮廓多边形各个顶点相对应的点.　　
2.2.2　对轮廓多边形的各个顶点进行映射
　　算法再次调用2.1节的思想对映射后的轮廓多边形进行平滑处理.
　　如果图像轮廓由多个多边形组成，则依次对各个多边形进行上述变换；这样就可得到对图像轮廓平滑自由的扭曲变形.图3即是其中的一个应用.


图3
2.3　利用两条Bezier曲线对网格控制点进行坐标变换
　　应用2.2节中的算法，对处于轮廓多边形内部的所有网格控制点进行坐标变换，为利用第3节算法进行各个像素点插值做好准备，如图4所示.


图4
2.4　图像主轴为任意方向的情况
　　上述各种处理的前提均为图像的主轴方向为竖直方向（即外接矩形横向边的方向与X轴夹角θ为0），现在将该算法推广到θ为任意角度的情况.
　　利用冒泡替换法易求出主轴方向为θ度的外接矩形的位置，不妨设4个顶点为LeftTop（xlt，ylt） ，LeftBottom（xlb，ylb），RightTop（xrt，yrt） ，RightBottom（xrb，yrb），如图5所示.


图5
　　对于点lp(x1,y1)易知有关系式：

即可求得x1，y1的值；进而可知：

同样可求出t2；接着的计算完全同2.2节、2.3节.
3　一种快速的插值算法
　　这里利用双线性插值的思想，推导一种便于编程、速度快的插值方法.
　　我们可假想在源图像中有许多网格,在源图像中拖动任一点,将产生如图6的4个区域的源区域和目标区域.对于这4个区域分别进行目标-源映射,即可完成图像变形.
　　如图6所示，假设用户在原图像中的down点拖动到了up点,运用目标-源变形可知，只要求出目标四边形的各点在原来的四边形的相应位置,把目标四边形的灰度值置为原来四边形的相应位置的周围四点灰度值的平均值,即完成了图像变形.这个方法同时完成了映射和插值操作，不管目标四边形比原来的四边形大多少(即不管图像变形扭曲得多么厉害),都可以求出在原来的四边形的相应点.具体的映射算法如图7所示.　


图6　欲变换的4个区域


图7　目标区域映射为源区域的映射图
　　如上图,假设(a,b,c,d)是目标四边形,我们必须求出(a,b,c,d)中所有的点P(x,y)在(aa,bb,cc,dd)中的对应点P′(xx,yy),我们这里所说的点即像素点.
　　我们知道,直线ab上的任一点A可表示为a×(1-α)+b×α, 0≤α≤1;即:
Ax=ax×(1-α)+bx×α , Ay=ay×(1-α)+by×α.
这里，Ax表示A点的横坐标,Ay表示A点的纵坐标.ax表示a点的横坐标, ay表示a点的纵坐标，下同.
　　同理,直线bc上的任一点B可以表示为
Bx=bx×(1-β)+cx×β; By=by×(1-β)+cy×β 0≤β≤1;
由此得到启发:四边形(a,b,c,d)中的任一点P(x,y)可以表示为
x=(1-β)×(1-α)×ax+(1-β)×α×dx+(1-α)×β×bx+α×β×cx　　(1)
y=(1-β)×(1-α)×ay+(1-β)×α×dy+(1-α)×β×by+α×β×cy　　(2)
其中 0≤α≤1, 0≤β≤1.
　　我们要求出P点在(aa,bb,cc,dd)中的相应点P′(xx,yy),即由式(1)和式(2)解出α和β,代入下式：
x0=(1-β)×(1-α)×aax+(1-β)×α×ddx+(1-α)×β×bbx+α×β×ccx　　(3)
y0=(1-β)×(1-α)×aay+(1-β)×α×ddy+(1-α)×β×bby+α×β×ccy　　(4)
　　将x0,y0的值取整即为所求的xx和yy. 这样,就得到了P′点的坐标.
　　解P′点的具体计算过程如下:
　　假设(1-α)×(1-β)为u;设α×(1-β)为v;设β×(1-α)为w;设α×β为t.则
u+v+w+t=1.　　(5)
　　由此假设,经计算得到：
(u+w)×(u+v)=u　　(6)
(v+t)×(v+u)=v　　(7)
(w+t)×(w+u)=w　　(8)
(v+t)×(w+t)=t　　(9)
　　计算式(6)/(7)可得：u/v=(u+w)/(v+t)=(1-α)/α；
　　计算式(8)/(9)可得：w/t=(w+u)/(v+t)=(1-α)/α.
　　由此,我们得到u/v=w/t.假设u/v=1/k，则v=u×k,t=w×k
　　从而式（1）和式(2)可写成：
u×ax+k×u×dx+w×bx+k×w×cx=x，　　(10)
u×ay+k×u×dy+w×by+k×w×cy=y.　　(11)
由式(10)和式(11)可得：
u×(ax+k×dx)+w×(bx+k×cx)=x，
u×(ay+k×dy)+w×(by+k×cy)=y.
所以,我们得到：
　　(12)
　　(13)
由式(5)和v=u×k,t=w×k可得到:
(u+w)×(1+k)=1　　(14)
把式(12)和式(13)代入式(14)得到一个关于k的一元二次方程:
　　(15)
　　从式(15)解出k代入式(12)和式(13)解出u和w,而v和t由v=u×k,t=w×k得到.
　　至此,u,v,w,t全部求出,从而由α=v+t和β=w+t解出了α和β.把解出的α和β代入式(3)和式(4)并进行取整后即解出了P点在源矩形对应点P′.当然,我们并不是简单地把P点的灰度值置为P′点的灰度值.而是把P点的灰度值置为P′点周围4个点的灰度平均值.
　　这样,图像变形算法可以描述如下:
　　　步骤1. 对于目标区域中任一像素点P(x,y)作步骤2.
　　　步骤2. 用方程(1)和(2)解出P点的α和β,将解得的α和β代入式(3)和式（4）求出x0和y0，将x0和y0取整为xx和yy, P′(xx,yy)即为所求的P点在源矩形中的对应点.
　　　步骤3. 将目标区域中的像素点P的灰度值置为步骤2求得的P′点的周围4个点的灰度平均值. 若目标区域中所有的像素点都执行了步骤2,算法结束,否则对没执行过映射的一个点转步骤2.
4　对整幅图像变形的算法
　　现在，变形有以2.3节的结果作为前提，然后逐行、逐列依次对各个网格控制点进行迭代映射，应用第3节的插值算法进行各个像素点的绘制，即可实现对整幅图像的变形.
　　该变形算法的整个流程描述如下：
　　　步骤1． 手工勾勒或系统检测图像边缘，得到图像轮廓的各个多边形；
　　　步骤2． 给出任意两条用于控制变形的折线，进而求出两条相应的Bezier曲线；
　　　步骤3． 从第一个轮廓多边形开始依次处理，直至各个轮廓多边形全部处理完毕；
　　　步骤4． 从当前轮廓多边形区域内的第一行开始依次处理，直至各行全部处理完毕；
　　　步骤5． 从当前行的第一列的网格控制点开始依次处理，直至各列全部处理完毕；
　　　步骤6． 应用2.3节的算法变换当前控制点的坐标值；应用第3节的插值算法依次逐行、逐列进行相邻4个网格内各像素点的插值绘制；
　　　步骤7． 将步骤5的结果记录下来，替换源图像的原像素；
　　　步骤8． 转步骤3.
　　图8 是两个应用结果.

(a)由一张严肃的脸变成一张微笑的脸

图8　各种变形效果
5　结束语
　　本节提出的变形算法，由两条Bezier曲线间接控制，使得变形过程更容易控制、更灵活，结果也很逼真；文中给出的插值算法效率高、简单易行.有兴趣的读者可以很快地用C或C++语言实现此算法.文中控制折线的根据目的效果需要交互地近似画出，如不满意，可比较容易地进一步对控制折线局部调整.
作者简介：王进，博士研究生，主要研究方向为轻工CAD、计算机图形学．
　　　　　潘志庚，博士生导师，主要研究方向为虚拟现实、计算机图形学．
　　　　　叶澄清，博士生导师，主要研究方向为智能计算机系统.
作者单位：王　进　潘志庚　浙江大学CAD & CG国家重点实验室　杭州　310027
　　　　　叶澄清　浙江大学计算机科学系　杭州　310027
参考文献：
1　Hu Xiaoxue. The algorithms for region mapping and their applications. Chinese Journal of Advanced Software Research, 1992, 5(2): 87～95
2　劳志强,潘云鹤. 一个基于特征的图像变形算法. 计算机辅助设计与图形学学报, 1998, 10(1): 1～6
　　(Lao Zhiqiang, Pan Yunhe. A feature-based image deformation algorithm. Journal of Computer-Aided Design & Computer Graphics(in Chinese), 1998, 10(1): 1～6)
3　冯结青, 马利庄, 彭群生. 一种应用参数曲面的动态自由变形方法. 计算机学报, 1997, 20(7): 600～606
　　(Feng Jieqing, Ma Lizhuang, Peng Qunsheng. Animated free-form deformation following the shape of parametric surface. Chinese Journal of Computers(in Chinese), 1997, 20(7): 600～606) 
原稿收到日期：1998-10-27；修改稿收到日期：1999-07-06.
