优品红酒可以赚钱吗:双线性插值旋转图象 高人帮帮忙

来源:百度文库 编辑:高校问答 时间:2024/04/29 13:59:01
什么是双线性插值?
怎么用双线性插值旋转图象?
求助原理或源码 希望能详细说明下,不要太复杂了,谢谢!
我是初学,看过下书,但还是不懂怎么回事!

我的理解:
计算新图宽度高度,计算旋转角度后的坐标,再用坐标计算出在源图的坐标,如果在源图坐标是浮点坐标就插值.不是浮点坐标当然就不用插值了!
假设:
新坐标 10,10
源坐标 8.5,12.7

插值:
因为旋转后的点,并不能和原来的图片的点完全对应, 比如旋转后的10,10坐标点,对应原图的可能是8.5, 12.7这样的位置
这个时候就要根据8 12, 9 12, 9 11, 8 11这四个点的数值进行差值生成,这样就得出10.10坐标点的插值像素.
假设某浮点坐标要插值的四点像素值分别是:15091019 、 24918886 、 16777215 、17499482
求源码?不是RGB的值,是从画板取值~明白吗? 代码能注释吗?

为了方便理解,先考虑一维情况下的线性插值
对于一个数列c,我们假设c[a]到c[a+1]之间是线性变化的
那么对于浮点数x(a<=x<a+1),c(x)=c[a+1]*(x-a)+c[a]*(1+a-x);
这个好理解吧?

把这种插值方式扩展到二维情况
对于一个二维数组c,我们假设对于任意一个浮点数i,c(a,i)到c(a+1,i)之间是线性变化的,c(i,b)到c(i,b+1)之间也是线性变化的(a,b都是整数)
那么对于浮点数的坐标(x,y)满足(a<=x<a+1,b<=y<b+1),我们可以先分别求出c(x,b)和c(x,b+1):
c(x,b) = c[a+1][b]*(x-a)+c[a][b]*(1+a-x);
c(x,b+1) = c[a+1][b+1]*(x-a)+c[a][b+1]*(1+a-x);
好,现在已经知道c(x,b)和c(x,b+1)了,而根据假设c(x,b)到c(x,b+1)也是线性变化的,所以:
c(x,y) = c(x,b+1)*(y-b)+c(x,b)*(1+b-y)
这就是双线性插值,不知道我这么讲是否将明白了

我不太明白画板取值是什么意思
如果直接理解成亮度值的话就这么写:
//返回x,y的像素值,c[a][b]表示(a,b)的像素值
int getColor(double x,double y,int[][] c){
int a = (int)x;
int b = (int)y;
double dx = x-a;
double dy = y-b;
return (int)((c[a][b]*(1-dx)+c[a+1][b]*dx)*(1-dy)+(c[a][b+1]*(1-dx)+c[a+1][b+1]*dx)*dy);
}
我觉得这样的代码好像写不了注释