双三次插值及优化.docx

  1. 1、本文档共79页,可阅读全部内容。
  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.计算流程 获取 16 个点的坐标 P1 、 P2 ?? P16 2. 由插值核计算公式 S(x) 分别计算出 x、 y 方向的插值核向量 Su 、 Sv 进行矩阵运算,得到插值结果 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 在得到插值结果图后, 我们发现图像中有“毛刺”,因此对插值结果做了个后处理, 即: 设该点在原图中的像素值为 pSrc ,若 abs(iResult - pSrc) 大于某阈值,我们认为插值后的 点可能污染原图,因此用原像素值 pSrc 代替。 算法优化 由于双三次插值计算一个点的坐标需要其周围 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 个 精品资料 ____________________________________________________

文档评论(0)

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

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

1亿VIP精品文档

相关文档