二维图像的三角形变形算法

       最近在工程的技术过程中不断的遇到图像变形的问题,特别的是三角形变形问题。前一段时间为了图省事,偷工减料,采用了OpenGL的纹理映射后渲染的方法来得到变形后的图像,当然这是一种投机取巧的方法,而且对于要得到大尺寸的图像来说,由于OpenGL的窗口限制,通常需要根据尺寸的大小动态分块渲染然后组合(或者采用FBO离屏渲染的方式),这带来了相当的弊端,实际上,这应该是图像处理上的一个基本算法。在参照别人提出的方法后,我决定自己实现了这个三角形变形算法。在整个变形过程中,采取的是四像素双线性插值的方法实现的变形效果。

      难得闲暇,于是趁此时整理出来,也可供有同样需求的朋友参考指正。

      下面概述该方法的主要过程,鉴于文字表述的局限,结合图形并伪码的方式介绍:

      1. 确定三角形的映射关系

      对于熟悉矩阵的朋友来说,两个空间位态的变换用矩阵的表示是再简便不过了,矩阵在图形图像中大量使用,这里也利用矩阵来表示两个三角形的映射关系。

      用齐次坐标来表示一个二维点坐标,比如A点的坐标为(x0, y0),则其齐次坐标为(x0, y0, 1),对于三角形变形来说,如下图所示,矩阵的变换相当于将△ABC中的每个点映射到△A'B'C',由于已经存在了三个顶点的对应关系,即A->A',B->B',C->C',则可以定义一个3×3的矩阵M,则有M•(A, B, C) = (A', B', C'),由于三角形的三个顶点不共线,因此(A, B, C)组成的矩阵存在逆矩阵,从而得到矩阵M=(A', B', C') •(A, B, C)-1 ,该矩阵M决定了△ABC到△A'B'C'的映射关系。

      有了变换矩阵后,△A'B'C'中的任何一点在△ABC都存在原象,也就是说,△A'B'C'中存在的任意一个像素都能匹配到△ABC中的某一点,由于该点未必恰好为某个像素位置,因此还需要进行插值得到适合的颜色值,下面介绍如何插值。

      2. 双线性插值

      因为三角形变形后不能保证像素之间的一一对应关系,因此采取一定的插值方式可以尽可能的保证图像像素的连续性。这里采用较为常见的四像素双线性插值。

 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值