双线性插值是一种常见的插值模型。本文就图像自由缩放功能来简单介绍双线性插值技术。
图像映射插值技术(image warping)是计算机图形学中的关键技术之一。图像映射插值可采用下面的模型简单描述(引自introduction to 3D computer vision)。
坐标变换包括常见的投影变换(Homography)(类比仿射、相似、欧氏、平移等)、柱面(类似球面、极坐标、多面体、多项式等)变换等形式。包括镜头畸变矫正和双目立体矫正过程所涉及的变换,均可以归纳为图像的坐标映射。
经过坐标映射之后的图像点为浮点坐标,需要借助插值模型来获取映射后的图像像素。常见的插值模型包括最邻近插值、双线性插值、双立方插值等。双线性插值效果好,计算量相对小,得到广泛的应用。
双线性插值原理如下图所示,右图为目标图像,经过逆映射在源图像(左图)中提取像素值。目标点像素值由源图像中浮点坐标附近的四个点的像素值按距离权重插值得到。
-
#include"iostream"
-
#include"cv.h"
-
#include"highgui.h"
-
using namespace std;
-
int main()
-
{
-
-
IplImage*image=cvLoadImage("lena.jpg ",1);
-
int width=image->width;
-
int height=image->height;
-
-
double wscale=0.8;
-
double hscale=0.3;
-
int newwidth=(int)(width * wscale);
-
int newheight=(int)(height * hscale);
-
IplImage*newimage=cvCreateImage(cvSize(newwidth,newheight),8,3);
-
-
uchar *Pcur = (uchar *)newimage->imageData;
-
-
uchar *Dcur= (uchar *)newimage->imageData;
-
-
uchar *Scur = (uchar *)image->imageData;
-
-
int i=0,j=0;
-
for(i=0;iwidthStep,i++)
-
{
-
Dcur=Pcur;
-
for(j=0;jnChannels,j++)
-
{
-
-
float newx=j/wscale;
-
float newy=i/hscale;
-
float coex=newx- floor(newx);
-
float coey=newy- floor(newy);
-
-
float LU = (1-coex)*(1-coey);
-
float LD = (1-coex)*coey;
-
float RU = coex*(1-coey);
-
float RD = coex*coey;
-
-
int xx = floor(newx);
-
int yy = floor(newy);
-
-
int ind00=yy*image->widthStep+xx*image->nChannels;
-
int ind01=(yy+1)*image->widthStep+xx*image->nChannels;
-
int ind10=yy*image->widthStep+(xx+1)*image->nChannels;
-
int ind11=(yy+1)*image->widthStep+(xx+1)*image->nChannels;
-
-
Dcur[0]=(uchar)(Scur[ind00]*LU+Scur[ind10]*RU+Scur[ind01]*LD+Scur[ind11]*RD);
-
Dcur[1]=(uchar)(Scur[ind00+1]*LU+Scur[ind10+1]*RU+Scur[ind01+1]*LD+Scur[ind11+1]*RD);
-
Dcur[2]=(uchar)(Scur[ind00+2]*LU+Scur[ind10+2]*RU+Scur[ind01+2]*LD+Scur[ind11+2]*RD);
-
}
-
}
-
cvShowImage("image",image);
-
cvShowImage("newimage",newimage);
-
cvWaitKey(0);
-
return 0;
-
}
输入:
输出:
阅读(816) | 评论(0) | 转发(0) |