双三次插值及优化.doc

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
. . 1.数学模型 对于一个目的像素,其坐标通过反向变换得到的在原图中的浮点坐标为(i+u,j+v),其中i、j均为非负整数,u、v为[0,1)区间的浮点数,双三次插值考虑一个浮点坐标(i+u,j+v)周围的16个邻点,目的像素值f(i+u,j+v)可由如下插值公式得到: f(i+u,j+v) = [A] * [B] * [C] [A]=[ S(u + 1) S(u + 0) S(u - 1) S(u - 2) ]   ┏ f(i-1, j-1) f(i-1, j+0) f(i-1, j+1) f(i-1, j+2) ┓ [B]=┃ f(i+0, j-1) f(i+0, j+0) f(i+0, j+1) f(i+0, j+2) ┃   ┃ f(i+1, j-1) f(i+1, j+0) f(i+1, j+1) f(i+1, j+2) ┃   ┗ f(i+2, j-1) f(i+2, j+0) f(i+2, j+1) f(i+2, j+2) ┛   ┏ S(v + 1) ┓ [C]=┃ S(v + 0) ┃   ┃ S(v - 1) ┃   ┗ S(v - 2) ┛    ┏ 1-2*Abs(x)^2+Abs(x)^3      , 0=Abs(x)1 S(x)={ 4-8*Abs(x)+5*Abs(x)^2-Abs(x)^3 , 1=Abs(x)2    ┗ 0                , Abs(x)=2 S(x)是对 Sin(x*Pi)/x 的逼近(Pi是圆周率——π),为插值核。 2.计算流程 1. 获取16个点的坐标P1、P2……P16 2. 由插值核计算公式S(x) 分别计算出x、y方向的插值核向量Su、Sv 3. 进行矩阵运算,得到插值结果 iTemp1 = Su0 * P1 + Su1 * P5 + Su2 * P9 + Su3 * P13 iTemp2 = Su0 * P2 + Su1 * P6 + Su2 * P10 + Su3 * P14 iTemp3 = Su0 * P3 + Su1 * P7 + Su2 * P11 + Su3 * P15 iTemp4 = Su0 * P4 + Su1 * P8 + Su2 * P12 + Su3 * P16 iResult = Sv1 * iTemp1 + Sv2 * iTemp2 + Sv3 * iTemp3 + Sv4 * iTemp4 4. 在得到插值结果图后,我们发现图像中有“毛刺”,因此对插值结果做了个后处理,即:设该点在原图中的像素值为pSrc,若abs(iResult - pSrc) 大于某阈值,我们认为插值后的点可能污染原图,因此用原像素值pSrc代替。 3. 算法优化 由于双三次插值计算一个点的坐标需要其周围16个点,更有多达20次的乘法及15次的加法,计算量可以说是非常大,势必要进行优化。 我们选择了Intel的SSE2优化技术,它只支持在P4及以上的机器。测试当前CPU是否支持SSE2,可由CPUID指令得到,代码为: BOOL g_bSSE2 = FALSE; __asm { mov eax, 1; cpuid; test edx, 0 jz NotSupport; mov g_bSSE2, 1 NotSupport: } 支持SSE2的CPU引入了8个128位的寄存器,这样一个寄存器中就可以存放4个点(RGB),有利于并行计算。 详细代码见Transform.cpp中函数Optimize_Bicubic。 优化中遇到的问题: 1. 图像每个点由RGB通道组成,由于1个SSE2寄存器有16个字节,这样读入4个像素点后,要浪费4个字节,同时要花费时间将数据对齐,即由BRGB | RGBR | GBRG | BRGB对齐成 0RGB | 0RGB | 0RGB | 0RGB ; 2. 读16字节数据到寄存器时,由于图像地址不能保证是16字节对齐,因此需用更多时钟周期的MOVDQU指令(6个以上时钟周期);如能使地址16字节对齐,则可用MOVDQA指令(1个时钟周期) ; 3. 为了消除除法及浮点运算,对权值放大256倍,这样在计算插值核时,必须用2Bytes来表示1个系数,而图像数据都是1Byte,这样在对齐做乘法时,要浪费一半的SSE2寄存器的空间,导致运算时间变长;而若降低插值核的精度,使其在1Byte表示范围内时,运算的精度又大为下降 ; 4. 对各指令的周期以及 若干行指令是否能够并行流水缺乏经验和认识。 附:SSE2指令整

文档评论(0)

ygxt89 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档