-
2021-04-23 23:09:42
MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,'method')
其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量, 'method'表示采用的插值方法,MATLAB提供的插值方法有几种: 'method'是最邻近插值, 'linear'线性插值; 'spline'三次样条插值; 'cubic'立方插值.缺省时表示线性插值
注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。
例如:在一 天24小时内,从零点开始每间隔2小时测得的环境温度数据分别为
12,9,9,1,0,18 ,24,28,27,25,20,18,15,13,
推测中午12点(即13点)时的温度.
x=0:2:24;
y=[12 9 9 10 18 24 28 27 25 20 18 15 13];
a=13;
y1=interp1(x,y,a,'spline')
结果为: 27.8725
若要得到一天24小时的温度曲线,则:
xi=0:1/3600:24;
yi=interp1(x,y,xi, 'spline');
plot(x,y,'o' ,xi,yi)
更多相关内容 -
双线性内插值算法
2021-08-01 15:20:04在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较...引出
在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。
越是简单的模型越适合用来举例子,我们就举个简单的图像:3*3 的256级灰度图。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):234 38 22 67 44 12 89 65 63
这个矩阵中,元素坐标(x,y)是这样确定的,x从左到右,从0开始,y从上到下,也是从零开始,这是图象处理中最常用的坐标系。
如果想把这副图放大为 4*4大小的图像,那么该怎么做呢?那么第一步肯定想到的是先把4*4的矩阵先画出来再说,好了矩阵画出来了,如下所示,当然,矩阵的每个像素都是未知数,等待着我们去填充(这个将要被填充的图的叫做目标图,Destination):? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
然后要往这个空的矩阵里面填值了,要填的值从哪里来来呢?是从源图中来,好,先填写目标图最左上角的象素,坐标为(0,0),那么该坐标对应源图中的坐标可以由如下公式得出srcX=dstX* (srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight)
好了,套用公式,就可以找到对应的原图的坐标了(0*(3/4),0*(3/4))=>(0*0.75,0*0.75)=>(0,0),找到了源图的对应坐标,就可以把源图中坐标为(0,0)处的234象素值填进去目标图的(0,0)这个位置了。
接下来,如法炮制,寻找目标图中坐标为(1,0)的象素对应源图中的坐标,套用公式:
(1*0.75,0*0.75)=>(0.75,0) 结果发现,得到的坐标里面竟然有小数,这可怎么办?计算机里的图像可是数字图像,象素就是最小单位了,象素的坐标都是整数,从来没有小数坐标。这时候采用的一种策略就是采用四舍五入的方法(也可以采用直接舍掉小数位的方法),把非整数坐标转换成整数,好,那么按照四舍五入的方法就得到坐标(1,0),完整的运算过程就是这样的:(1*0.75,0*0.75)=>(0.75,0)=>(1,0) 那么就可以再填一个象素到目标矩阵中了,同样是把源图中坐标为(1,0)处的像素值38填入目标图中的坐标。
依次填完每个象素,一幅放大后的图像就诞生了,像素矩阵如下所示:234 38 22 22 67 44 12 12 89 65 63 63 89 65 63 63
这种放大图像的方法叫做最临近插值算法,这是一种最基本、最简单的图像缩放算法,效果也是最不好的,放大后的图像有很严重的马赛克,缩小后的图像有很严重的失真;效果不好的根源就是其简单的最临近插值方法引入了严重的图像失真,比如,当由目标图的坐标反推得到的源图的的坐标是一个浮点数的时候,采用了四舍五入的方法,直接采用了和这个浮点数最接近的象素的值,这种方法是很不科学的,当推得坐标值为 0.75的时候,不应该就简单的取为1,既然是0.75,比1要小0.25 ,比0要大0.75 ,那么目标象素值其实应该根据这个源图中虚拟的点四周的四个真实的点来按照一定的规律计算出来的,这样才能达到更好的缩放效果。
双线型内插值算法就是一种比较好的图像缩放算法,它充分的利用了源图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此缩放效果比简单的最邻近插值要好很多。双线性内插值算法描述
对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:
f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。
比如,像刚才的例子,现在假如目标图的象素坐标为(1,1),那么反推得到的对应于源图的坐标是(0.75 , 0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个象素,那么目标图的象素(1,1)的取值不能够由这个虚拟象素来决定,而只能由源图的这四个象素共同决定:(0,0)(0,1)(1,0)(1,1),而由于(0.75,0.75)离(1,1)要更近一些,那么(1,1)所起的决定作用更大一些,这从公式1中的系数uv=0.75×0.75就可以体现出来,而(0.75,0.75)离(0,0)最远,所以(0,0)所起的决定作用就要小一些,公式中系数为(1-u)(1-v)=0.25×0.25也体现出了这一特点。计算方法
首先,在X方向上进行两次线性插值计算
然后在Y方向上进行一次插值计算:
在图像处理的时候,我们先根据srcX = dstX * (srcWidth/dstWidth), srcY = dstY * (srcHeight/dstHeight)
来计算目标像素在源图像中的位置,这里计算的srcX和srcY一般都是浮点数,比如f(1.2, 3.2)这个像素点是虚拟存在的,先找到与它临近的四个实际存在的像素点:
(1,4) (2,4) (1,3) (2,3)
写成f(i+u,j+v)的形式,则u=0.2,v=0.2, i=1, j=3
假设他们的值为:100 200 300 400
根据上面公式:
x1=1 x=1.2 x2=2 y1=3 y=3.2 y2=4 f(Q12)=100 f(Q22)=200 f(Q11)=300 f(Q21)=400 f(R1)=( (2-1.2)/(2-1) )*300 + ( (1.2-1)/(2-1) )*400 = 0.8*300 + 0.2*400 = 320 f(R2)=( (2-1.2)/(2-1) )*100 + ( (1.2-1)/(2-1) )*200 = 0.8*100 + 0.2*200 = 120 f(P)=( (4-3.2)/(4-3) )*f(R1) + ( (3.2-3)/(4-3) )*f(R2) = 0.8*320 + 0.2*120 = 280
也可以一步直接计算:
f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
加速以及优化策略
单纯按照上文实现的插值算法只能勉强完成插值的功能,速度和效果都不会理想,在具体代码实现的时候有些小技巧。参考OpenCV源码以及网上博客整理如下两点:
- 源图像和目标图像几何中心的对齐。
- 将浮点运算转换成整数运算
源图像和目标图像几何中心的对齐
在计算源图像的虚拟浮点坐标的时候,一般情况:
srcX = dstX * (srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight)
中心对齐(OpenCV也是如此):
SrcX = (dstX+0.5) * (srcWidth/dstWidth) - 0.5 SrcY = (dstY+0.5) * (srcHeight/dstHeight) - 0.5
原理:
将公式变形:srcX=dstX* (srcWidth/dstWidth)+0.5*(srcWidth/dstWidth-1)
相当于我们在原始的浮点坐标上加上了
0.5*(srcWidth/dstWidth-1)
这样一个控制因子,这项的符号可正可负,与srcWidth/dstWidth的比值也就是当前插值是扩大还是缩小图像有关,有什么作用呢?看一个例子:
假设源图像是3*3,中心点坐标(1,1),目标图像是9*9,中心点坐标(4,4),我们在进行插值映射的时候,尽可能希望均匀的用到源图像的像素信息,最直观的就是(4,4)映射到(1,1),现在直接计算srcX=4*(3/9)=1.3333 != 1,也就是我们在插值的时候所利用的像素集中在图像的右下方,而不是均匀分布整个图像。现在考虑中心点对齐,srcX=(4+0.5)*3/9-0.5=1,刚好满足我们的要求。将浮点运算转换成整数运算
直接进行计算的话,由于计算的srcX和srcY 都是浮点数,后续会进行大量的乘法,而图像数据量又大,速度不会理想,解决思路是:
浮点运算→→整数运算→→”<<左右移按位运算”。放大的主要对象是u,v这些浮点数,OpenCV选择的放大倍数是2048“如何取这个合适的放大倍数呢,要从三个方面考虑:
- 第一:精度问题,如果这个数取得过小,那么经过计算后可能会导致结果出现较大的误差。
- 第二,这个数不能太大,太大会导致计算过程超过长整形所能表达的范围。
- 第三:速度考虑。假如放大倍数取为12,那么算式在最后的结果中应该需要除以12*12=144,但是如果取为16,则最后的除数为16*16=256,这个数字好,我们可以用右移来实现,而右移要比普通的整除快多了。”我们利用左移11位操作就可以达到放大目的。
opencv代码
cv::Mat matSrc, matDst1, matDst2; matSrc = cv::imread("lena.jpg", 2 | 4); matDst1 = cv::Mat(cv::Size(800, 1000), matSrc.type(), cv::Scalar::all(0)); matDst2 = cv::Mat(matDst1.size(), matSrc.type(), cv::Scalar::all(0)); double scale_x = (double)matSrc.cols / matDst1.cols; double scale_y = (double)matSrc.rows / matDst1.rows; uchar* dataDst = matDst1.data; int stepDst = matDst1.step; uchar* dataSrc = matSrc.data; int stepSrc = matSrc.step; int iWidthSrc = matSrc.cols; int iHiehgtSrc = matSrc.rows; for (int j = 0; j < matDst1.rows; ++j) { float fy = (float)((j + 0.5) * scale_y - 0.5); int sy = cvFloor(fy); fy -= sy; sy = std::min(sy, iHiehgtSrc - 2); sy = std::max(0, sy); short cbufy[2]; cbufy[0] = cv::saturate_cast<short>((1.f - fy) * 2048); cbufy[1] = 2048 - cbufy[0]; for (int i = 0; i < matDst1.cols; ++i) { float fx = (float)((i + 0.5) * scale_x - 0.5); int sx = cvFloor(fx); fx -= sx; if (sx < 0) { fx = 0, sx = 0; } if (sx >= iWidthSrc - 1) { fx = 0, sx = iWidthSrc - 2; } short cbufx[2]; cbufx[0] = cv::saturate_cast<short>((1.f - fx) * 2048); cbufx[1] = 2048 - cbufx[0]; for (int k = 0; k < matSrc.channels(); ++k) { *(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + sy*stepSrc + 3*sx + k) * cbufx[0] * cbufy[0] + *(dataSrc + (sy+1)*stepSrc + 3*sx + k) * cbufx[0] * cbufy[1] + *(dataSrc + sy*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[0] + *(dataSrc + (sy+1)*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[1]) >> 22; } } } cv::imwrite("linear_1.jpg", matDst1); cv::resize(matSrc, matDst2, matDst1.size(), 0, 0, 1); cv::imwrite("linear_2.jpg", matDst2);
-
采用GWR模型和Krige插值法进行预测
2020-09-29 11:30:33根据影响因子实际影响作用,本文运用GWR模型从岩性、土壤厚度、海拔、坡度、气温、降水量7个方面对yj市的Y_krd指标进行空间建模,分析了影响因子在哪些区域具有显著的影响,并确定影响方向。同时利用了克里格插值法... -
单片机与DSP中的实际滤波器的插值器
2020-11-15 07:31:04实践中,在如图1所描述的插值过程中,在时间序列的样本值之间起插值或平滑作用的是可实现的模拟低通滤波器。若低通滤波器的通带和截止频率已确定,那么就可以使用前述的基于运算放大器的固定系数滤波器。对采样频率... -
【图像超分辨(SR)】通俗直观彻底理解双线性插值、双三次插值及其作用
2022-02-11 11:24:14在讲细节之前,我们要先明白插值的作用是什么 插值简单来说就是resize,改变图像的尺寸(不是简单的成比例扩大和缩小,可以理解为基于旧图片生成新的图片,总像素数量发生变化)。这样就意味着,插值实际上可以实现...写在前面的一点话
网上讲解基本双线性插值、双三次线性插值的文章很多,但大部分都是只在讲为什么是这样,并不算非常通俗(起码对我来说需要额外查很多资料来补充理解)。很少有文章能够给初学者一些比较直观的理解,因此在经过痛苦的学习过程后,希望把自己的一点理解分享给大家。(如有错误欢迎讨论指正)
在讲细节之前,我们要先明白插值的作用是什么
插值简单来说就是resize,改变图像的尺寸(不是简单的成比例扩大和缩小,可以理解为基于旧图片生成新的图片,总像素数量发生变化)。这样就意味着,插值实际上可以实现两种功能:upscaling(升维)和downscaling(降维)。直观来说可以让图像更清晰或者让图像更模糊。(刚学习的时候以为插值做的是超分辨的工作,只能让图片升维,后来看论文发现生成LR图片的时候也会使用插值)
还有点迷糊?没关系,我们先讲细节,最后再回头来看为什么插值有这样的作用。
双线性插值
实际使用:利用4个像素点计算出一个像素点的值。
理解:为什么叫双线性插值,双表示的对两个轴都要做插值。其步骤可以理解为,先对某个轴做一次线性插值,再对另一个轴做线性插值,最后得到预测点的值。关于双线性插值的公式,其实表示的就是这个过程,大家实际只需要知道是通过周围四个点来算出一个点即可。
具体过程:先通过AD、BC分别算出P0、P1的值。再通过P0和P1算出P的值。落实起来就是,周围四个点带进公式算算某个点的值。双三次插值
实际使用:利用周围16个像素点计算出一个像素点的值。
理解:这个双其实依旧是对两个轴的操作。其本质上和双线性插值没有区别,只是插值公式更加复杂而已。双三次插值的重点在于,为什么要使用这种插值方法?其原因是线性插值效果不好(废话)。三次插值实际上是对像素做了平滑处理。我们可以理解为,不同像素点的值,实际上是一个函数的采样点。那么显然我们如果用曲线拟合这个函数去插值,比用直线要好。十六个像素点实际提供了比四个像素点更为准确的信息。比如:对于AB两个点,我们可以画直线和曲线。但如果三个点在一条直线上,那么他们是直线采样出来的概率就更高,点数越多,估计就越准确。曲线同理,这也就是为什么双三次差值效果会更好。
对曲线的拟合实际可以用梯度来理解,某个像素点提供该点的值和梯度,多个点多个梯度就可以近似预测出一个曲线。
具体过程:说了这么多,其实过程就是用这个公式算算某个点的值而已。。。。具体这个点的确定是由放大倍数决定的。
图片来源:https://blog.csdn.net/caomin1hao/article/details/81092134比较直观的一个对比图:
图片来源:https://blog.csdn.net/eurus_/article/details/102755898插值如何做升维(超分辨)和降维(退化)?
看论文就是这个把我看迷糊的,为什么很多超分辨生成数据会用插值来产生LR,插值不是产生HR的吗?其实这个方法既可以产生LR也可以产生HR。
我们回过头来看,插值的本质是通过几个点计算出一个点的值,那么被计算的点是如何确定的呢?
直观来理解就是由我原始图像和目标图像分辨率的关系来确定的(听君一席话,如听一席话hhh)。简单来说就是由原始图像像素总数和目标图像像素总数来确定的。
那么回过头来看这个问题,就很好理解为什么插值可以同时做升维和降维了。
因为实际上这个方法并不只可以生成更多的值,它还可以合并已有的值(即让像素点总数减少)!例如:初始分辨率是200x200,如果目标分辨率是100x100,插值依旧可以计算对应点的值,只是把总像素数减少了!
通俗一点来说就是:让图像总像素变少,相当于把合并了部分像素点,有信息丢失了;让图像总像素变多,相当于生成了部分像素点,生成了更多信息。从另一个角度来理解插值(感谢肖老师耐心讲解)
(肖老师主页:http://people.ucas.ac.cn/~0066872 感兴趣的朋友欢迎报考)
假设我们实际某个物体的图像频谱如下图Truth,那么我们得到的数字图像频谱可以假设为下图Image红色部分所示(也可以理解为高分辨和低分辨图像的频谱)。实际上低分辨图像可以近似看成是高分辨图像的采样(只不过采样函数我们并不清楚),实际情况下采样后的频谱发生了失真,导致无法完美恢复出高分辨图像。那么插值在做的事情,实际上是假设了像素点大概满足的函数是什么样子的(双三次插值之所以用多项式函数是因为,通过傅立叶变换推导出来的公式大概是sinx/x的形式,无穷远处的值也会某个像素点有贡献,因此通过多项式函数截断,只考虑局部对某个点的影响),而后通过在这个函数来预测缺失部分的频谱。
从这个角度来理解升维和降维,本质上其实都是基于拟合的函数来做预测。升维实际上可以理解为是对频谱缺失部分做预测,而降维则可以理解为对已有部分又做了截断,在更小的范围内做预测。因而升维会生成一些高频信息,而降维则会丢失很多高频信息。
来自肖老师的一点补充:
插值的本质我理解是计算没有采集到的位置的值。本来没有点现在要增加一个点,所以叫“插”。如果这个位置在数据点包围(例如凸包)的范围内则叫内插,否则叫外插。
插值可以用于upscaling和downscaling,因为计算过程中可能会用到未采样的点的值。
Downscaling 时,为了避免 aliasing 产生的假象(如摩尔纹),通常会综合使用插值和滤波,即重新采样。当然如果为了简单和计算效率起见,偶尔(尤其是自己写实验性程序时)也会直接使用最临近点插值,或者直接使用双线性插值和点采样(忽略滤波)。
Upscaling 时,传统插值的算法是临近像素值的线性组合,当然组合的权重函数本身可以是线性或者非线性的(例如双三次)。线性组合插值计算出的图像可以理解为采样图像(即许多delta函数在网格点上)与权重函数的卷积,在傅里叶变换的观点下看即为周期的图像频谱与权重频谱的乘积,这一过程无法恢复出真正的高频(>1/2采样频率)信息。如果我们走出线性组合,更多使用图像的“内容”信息来尝试构造高频信息,那么就是超分辨了。
-
Vue插值、表达式、分隔符、指令知识小结
2020-12-29 07:08:45插值 基本用法 <span>Text:{{text}} <span v-text=text></span> 这个属于指令 <li data-id={{id}}></li> 有时候只需要渲染一次数据,后续数据变化不再关心,可以通过“*”实现 <span>Text:{{*text}}</span> 如果... -
Android动画之插值器简介和系统默认插值器
2021-05-27 02:18:361 插值器(Interpolator)简介插值器(Interpolator)是设置动画运行过程中的变化规律,类似匀速变化,加速变化,回弹等。补间动画Animation设置插值器的两个函数:public void setInterpolator(Context context, @...1 插值器(Interpolator)简介
插值器(Interpolator)是设置动画运行过程中的变化规律,类似匀速变化,加速变化,回弹等。
补间动画Animation设置插值器的两个函数:
public void setInterpolator(Context context, @AnimRes @InterpolatorRes int resID) ;
public void setInterpolator(Interpolator i) ;
xml动画配置文件中设置插值器代码:
android:interpolator="@android:anim/linear_interpolator"
上面的setInterpolator函数和 android:interpolator属性就是设置动画的插值器。
实际使用动画过程中,有时可能不完全都是要求动画匀速运动,类似加速运动,仿抛物线运动等,都需要插值器的配合。
2系统提供的默认插值器
可以看到除了BaseInterpolator(抽象类,不讨论)外有10种系统提供的插值器。下面从xml中引用插值器的字段和插值器对应的具体类和插值器的作用三方面来介绍系统提供的插值器。
@android:anim/linear_interpolator 对应 LinearInterpolator
作用:动画匀速改变
@android:anim/decelerate_interpolator 对应 DecelerateInterpolator
作用:动画运行越来越慢,减速运行 ,说明开始的时候是最高速。
@android:anim/accelerate_interpolator 对应 AccelerateInterpolator
作用:动画加速进行,动画开始运行时变化很慢,越到后面越快,最后突然结束。
@android:anim/accelerate_decelerate_interpolator 对应java类AccelerateDecelerateInterpolator
作用 :动画先加速再减速,相当于view速度从0一直加速,最后又减速到0,默认插值器。
@android:anim/anticipate_interpolator 对应 AnticipateInterpolator
作用:先退后再加速前进 ,类似投掷标枪,先往后一点,然后加速运行。
@android:anim/anticipate_overshoot_interpolator 对应java类AnticipateOvershootInterpolator
作用:先退后再加速前进,超出终点后再回终点
@android:anim/bounce_interpolator 对应 BounceInterpolator
作用:最后阶段弹球效果,就是会在到达终点后,类似弹球回弹几次。
@android:anim/cycle_interpolator 对应CycleInterpolator
作用:周期运动,动画可以不到终点就回弹,也可以到了终点后在回弹,还可以回弹多次,小于1.0f不到终点就回弹,大于1.0f会到了终点后回弹,如果大于2,则会回弹多次。下面的例子会设置5次,大家可以看效果。
@android:anim/overshoot_interpolator 对应 OvershootInterpolator
作用:快速完成动画,会超出一点然后再回到结束样式。
@android:anim/path_interpolator 对应 PathInterpolator,
作用:根据路径来控制动画的执行快慢,路径可以是贝塞尔曲线,也可以是普通Path。
系统提供的插值器里前面的九个都比较简单,只有最后一个PathInterpolator,是api21添加的新的插值器,而且其有三个构造函数,相对较复杂会单独讲解。
3 插值器的使用
如何使用插值器
xml动画文件,直接指定
XML动画文件使用插值器时,需要设置系统设置的对应的插值器资源ID,上面已给出。
java代码中两种方式:
Java代码使用插值器时,只需创建对应的插值器对象,然后设置给动画对象;也可以加载xml文件中配置的插值器。然后利用view的setInterpolator(Context context, @AnimRes @InterpolatorRes int resID)设置插值器。
xml设置插值器例子:
xmlns:android="http://schemas.android.com/apk/res/android">
代码演示插值器
这里只用Translate动画来演示插值器的效果:
android:fromXDelta="-300"
android:toXDelta="500"
android:fromYDelta="-300"
android:toYDelta="1000"
android:duration="3000"
android:fillBefore="true">
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn1:
if (imageView.getAnimation() != null && !imageView.getAnimation().hasEnded()){
imageView.getAnimation().cancel();
}
mTranslateAnimation.setInterpolator(new AccelerateInterpolator());
imageView.startAnimation(mTranslateAnimation);
break;
case R.id.btn2:
if (imageView.getAnimation() != null && !imageView.getAnimation().hasEnded()){
imageView.getAnimation().cancel();
}
mTranslateAnimation.setInterpolator(new DecelerateInterpolator());
imageView.startAnimation(mTranslateAnimation);
break;
case R.id.btn3:
if (imageView.getAnimation() != null && !imageView.getAnimation().hasEnded()){
imageView.getAnimation().cancel();
}
mTranslateAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
imageView.startAnimation(mTranslateAnimation);
break;
case R.id.btn4:
if (imageView.getAnimation() != null && !imageView.getAnimation().hasEnded()){
imageView.getAnimation().cancel();
}
mTranslateAnimation.setInterpolator(new LinearInterpolator());
imageView.startAnimation(mTranslateAnimation);
break;
case R.id.btn5:
if (imageView.getAnimation() != null && !imageView.getAnimation().hasEnded()){
imageView.getAnimation().cancel();
}
mTranslateAnimation.setInterpolator(new AnticipateInterpolator());
imageView.startAnimation(mTranslateAnimation);
break;
case R.id.btn6:
if (imageView.getAnimation() != null && !imageView.getAnimation().hasEnded()){
imageView.getAnimation().cancel();
}
mTranslateAnimation.setInterpolator(new OvershootInterpolator());
imageView.startAnimation(mTranslateAnimation);
break;
case R.id.btn7:
if (imageView.getAnimation() != null && !imageView.getAnimation().hasEnded()){
imageView.getAnimation().cancel();
}
mTranslateAnimation.setInterpolator(new AnticipateOvershootInterpolator());
imageView.startAnimation(mTranslateAnimation);
break;
case R.id.btn8:
if (imageView.getAnimation() != null && !imageView.getAnimation().hasEnded()){
imageView.getAnimation().cancel();
}
mTranslateAnimation.setInterpolator(new BounceInterpolator());
imageView.startAnimation(mTranslateAnimation);
break;
case R.id.btn9:
if (imageView.getAnimation() != null && !imageView.getAnimation().hasEnded()){
imageView.getAnimation().cancel();
}
mTranslateAnimation.setInterpolator(new CycleInterpolator(5));
imageView.startAnimation(mTranslateAnimation);
break;
}
}
image
4 PathInterpolator 路径插值器
image
作用说明:
路径插值器在动画运行过程中,会遍历整个路径,路径必须从(0,0)开始到(1,1)点结束。它会在一个1*1的坐标系内部指定动画的运动轨迹,路径可以是贝塞尔曲线或者是普通的path。
兼容版本可以用PathInterpolatorCompat类,在v4包中。
构造函数:
PathInterpolator(Path path):利用Path构造插值器。
PathInterpolator(float controlX, float controlY):传入一个控制点,构造二维贝塞尔曲线插值器。
PathInterpolator(float controlX1, float controlY1, float controlX2, float controlY2):传入两个控制点,构造三维贝塞尔曲线插值器。
PathInterpolator(Context context, AttributeSet attrs),加载xml定义的插值器。
其中X坐标轴表示时间进度,动画进行了多长时间,0表示刚开始,1表示动画运行完了。
Y坐标表示动画完成程度,0表示动画初始状态,0.5表示动画完成一半时的状态,1表示动画结束时的状态。
举个例子:
Path path = new Path();
path.lineTo(0.25f, 0.25f);
path.moveTo(0.25f, 0.5f);
path.lineTo(1f, 1f);
解释:上面的代码生成的PathInterpolator得含义为,首先按照动画完成度和时间1:1的比例,在1/4的时间内达到动画完成1/4的效果,然后突然让动画变成完成1/2的状态此时动画运行时间依然才过了1/4,然后在接下来的时间让动画运行到结束,状态也变成动画结束后的状态。所以展示的效果就是先匀速变化,然后突然变化,然后在匀速变化。
示意图:
image
贝塞尔曲线的应用
PathInterpolator(float controlX, float controlY) 传入一个控制点,这个函数内部会生成贝塞尔曲线,就可以生成对应的插值器。
PathInterpolator pathInterpolator = new PathInterpolator(0.9f, 0.1f);
mTranslateAnimation.setInterpolator(pathInterpolator);
imageView.startAnimation(mTranslateAnimation);
android:fromXDelta="-300"
android:toXDelta="500"
android:fromYDelta="-300"
android:toYDelta="1000"
android:duration="3000"
android:fillBefore="true">
时间与速度变化示意图,从贝塞尔曲线可以看出首先动画变化速度缓慢,然后大概动画运行了80%时快速完成动画。
5 support v4 包中新提供的插值器
FastOutLinearInInterpolator ,FastOutSlowInInterpolator,LinearOutSlowInInterpolator,这三个是在v4 22.1.0中添加的动画插值器,基本原理和PathInterpolator一样,都是利用贝塞尔曲线来描述动画运行过程。
FastOutLinearInInterpolator 效果和AccelerateInterpolator 类似,都是一个持续加速的运动路线,只是刚开始阶段LinearOutSlowInInterpolator更快。
FastOutSlowInInterpolator 是先加速再减速,类似AccelerateDecelerateInterpolator ,但FastOutSlowInInterpolator 前期比AccelerateDecelerateInterpolator 快很多。
LinearOutSlowInInterpolator 和DecelerateInterpolator 的效果类似。
FastOutLinearInInterpolator举例:
FastOutLinearInInterpolator fastOutLinearInInterpolator = new FastOutLinearInInterpolator();
mTranslateAnimation.setInterpolator(fastOutLinearInInterpolator);
imageView.startAnimation(mTranslateAnimation);
image
-
插值算法
2021-03-13 09:00:21常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求,这就是插值的作用,另... -
MATLAB三次样条插值之三转角法.docx
2020-11-19 14:58:45PAGE / NUMPAGES 非常类似前面的三弯矩法,这里的sanzhj函数和intersanzhj作用相当于前面的sanwanj和intersanwj,追赶法程序通用,代码如下 % function [newu,w,newv,d]=sanzhj(x,y,x0,y0,y1a,y1b) % 三转角样条插值 % ... -
Python:插值interpolate模块
2021-01-14 00:14:25插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。与拟合不同的是,要求曲线通过所有的已知数据。SciPy的interpolate模块提供了许多对数据进行插值运算的函数... -
视频编解码器的分辨率自适应插值滤波器
2021-03-05 20:22:02由于分数像素运动补偿在视频编码器中起着重要作用,因此分数像素像素的插值可以改进和设计。更好地提高编码效率。 本文首先提出了插值滤波器系数的生成算法,并测试了四个抽头滤波器,分别为4抽头,6抽头,8抽头和10... -
OpenCV图像缩放插值之BiCubic双三次插值
2022-03-30 14:37:27在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值(立体插值),兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,... -
ArcGIS教程:了解插值分析
2015-11-26 10:22:52插值可以根据有限的样本数据点预测栅格中的像元值。它可以预测任何地理点数据(如高程、降雨、化学物质浓度和噪声等级)的未知值。 -
二维曲面的 Hermite 主插值函数(更新:24-07-07):二次形函数-matlab开发
2021-06-01 19:03:38在弯曲或扭曲作用下,薄板单元的符合形状函数是帕斯卡三角形上的导数基位移函数。 这种求解技术是非一致的 [1] 高阶次板单元的形状函数和板的弯曲和扭曲运动。 例如 [1]; (9node-27Dof 板单元) 排名 27(不合格) ... -
Unity3d:实现自己的Dotween,C#扩展方法,插值旋转,插值移动
2022-01-14 22:02:52C#扩展方法第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 public static class ExtendMethods { public static tween DoRotate(this Transform transform, Vector3 target, float time) ... -
基于插值的非等间距GM(1,1)建模方法
2020-04-29 02:11:59非等间距GM(1,1)模型因其对非等间距观测数据的处理能力,在变形观测的预测方面发挥着越来越重要的作用。为了更加准确地进行变形预测,提高其实用性,对非等间距GM(1,1)模型进行改进。首先分析不同插值方法对非等间距... -
图像插值
2019-06-18 20:40:39在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛... -
三次样条插值函数matlab程序
2021-01-13 07:30:44对三次样条插值函数的m文件,下载可直接可用,用于matlab编程设计和课程作用 对三次样条插值函数的m文件,下载可直接可用,用于matlab编程设计和课程作用 -
Matlab数据插值-内插、外插
2018-06-22 13:59:19插值就是已知一组离散的数据点集,在集合内部某两个点之间预测函数值的方法。 一、一维插值 插值运算是根据数据的分布规律,找到一个函数表达式可以连接已知的各点,并用此函数表达式预测两点之间任意位 -
【路径插值处理】轨迹点线性插值方法
2021-11-05 12:36:23文章目录系列文章目录前言一、纯跟踪(pure_persuit)算法内置的插值算法1.源代码(补充注释了~)2.插值原理解释3.算法优点4.算法缺点二、普通的线性插值算法1.源代码(补充注释了~)2.源代码解释3.算法优点4.算法... -
【数学建模算法】(26)插值和拟合:埃尔米特(Hermite)插值和样条插值
2021-05-26 05:37:191.埃尔米特(Hermite)插值1.1.Hermite插值多项式如果对插值函数,不仅要求它在节点处与函数同值,而且要求它与函数有相同的一阶、二阶甚至更高阶的导数值,这就是 Hermite 插值问题。本节主要讨论在节点处插值函数与... -
Pandas的插值方法
2022-03-01 18:47:36pandas线性插值 DataFrame.interpolate(method=‘linear’, axis=0, limit=None, inplace=False, limit_direction=None, limit_area=None, downcast=None, **kwargs) method : str,默认为‘linear’使用插值方法... -
vue.js 插值
2020-12-20 13:27:18文本数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值:Message: {{ msg }}Mustache 标签将会被替代为对应数据对象上 msg 属性的值。无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的... -
常用线性插值的介绍和应用(双线性插值,三线性插值,平滑曲线插值)
2020-05-13 14:53:38常用线性插值的介绍和应用 线性插值 插值是计算机图形学中非常常用的技术。通常,数据是在常规网格上指定的(值写在2D或3D网格的顶点位置)或在线上(在一维的情况下),但是程序需要在该网格上的随机位置求值。... -
线性插值(Linear Interpolation):线性插值、双线性插值
2021-05-25 19:00:101.关于插值: 2.线性插值: 3.线性插值举例: 4.双线性插值法 1.关于插值: 插值,是根据已知的数据序列(可以理解为你坐标中一系列离散的点),找到其中的规律,然后根据找到的这个规律,来对其中尚未有数据... -
插值法(内插法)
2017-12-12 15:48:00今天做题需要用到插值法,... 作用 求出的插值函数P(X)用于估计原函数F[X]。 (但如果原函数可以由多项式表示(既不是一个相关函数),且告诉了图像上其最高次项次数+1个点,就可以通过插值法得出该函数F[x],即求得的插值... -
克里金插值(arcgis克里金插值步骤)
2021-04-24 16:15:361. 克里格方法概述 克里格方法(Kriging)又称空间局部插值法,是以变异函数理论和结构分析为基础, 在有限区域内对区域化变量进行无偏最优估计的一种方法,是地.克里金差值最后的出来的克里金误差有什么意义?是说... -
三角形插值技术
2019-07-11 09:45:571.最懒的方法——Nearest Neighbor 对于三角形内的点,离三...总而言之,我们通过三角形每个顶点到点P的距离来混合定点颜色,从而定义点P的插值颜色。 这个方法简单,易于实现,而且相当直观,在一些应用中表现良好... -
单线性插值与双线性插值详解
2020-01-08 14:03:42线性插值函数其实就是一次多项式的插值方式,其几何意义就是用来拟合两点之间的一些点的数值;具体意义可以查阅百度https://baike.baidu.com/item/%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC/19113392?fr=aladdin 现在... -
基于双线性插值模型的高程异常值的获取 (2013年)
2021-06-14 01:23:10以已知的离散数据点坐标和高程异常为研究对象,讨论了基于双线性内插模型的高程异常值获取的方法,通过内插模型建立高精度、高分辨率的区域高程异常数字模型,从而内插出该区域内任何一点或一小片区域的高程异常值,有助...