Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96214
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 221
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-08 16:03
个人简介

一万年太久,只争朝夕

文章分类
文章存档

2016年(4)

2015年(19)

2014年(2)

我的朋友

分类: 其他平台

2015-02-09 20:53:21

双线性插值是一种常见的插值模型。本文就图像自由缩放功能来简单介绍双线性插值技术。

     图像映射插值技术(image warping)是计算机图形学中的关键技术之一。图像映射插值可采用下面的模型简单描述(引自introduction to 3D computer vision)。

        坐标变换包括常见的投影变换(Homography)(类比仿射、相似、欧氏、平移等)、柱面(类似球面、极坐标、多面体、多项式等)变换等形式。包括镜头畸变矫正和双目立体矫正过程所涉及的变换,均可以归纳为图像的坐标映射。

     经过坐标映射之后的图像点为浮点坐标,需要借助插值模型来获取映射后的图像像素。常见的插值模型包括最邻近插值、双线性插值、双立方插值等。双线性插值效果好,计算量相对小,得到广泛的应用。

    双线性插值原理如下图所示,右图为目标图像,经过逆映射在源图像(左图)中提取像素值。目标点像素值由源图像中浮点坐标附近的四个点的像素值按距离权重插值得到。


  1. #include"iostream"  
  2. #include"cv.h"  
  3. #include"highgui.h"  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     /*******************读入一张图片***********************/  
  8.     IplImage*image=cvLoadImage("lena.jpg ",1);  
  9.     int width=image->width;  
  10.     int height=image->height;  
  11.     /********************创建一张新图片********************/  
  12.     double wscale=0.8;  
  13.     double hscale=0.3;  
  14.     int newwidth=(int)(width * wscale);  
  15.     int newheight=(int)(height * hscale);  
  16.     IplImage*newimage=cvCreateImage(cvSize(newwidth,newheight),8,3);  
  17.     /*********************获取新创建图片的像素值****************/  
  18.     uchar *Pcur = (uchar *)newimage->imageData;  
  19.   
  20.     uchar *Dcur= (uchar *)newimage->imageData;  
  21.       
  22.     uchar *Scur = (uchar *)image->imageData;  
  23.     /***********************取像素值******************************/  
  24.     int i=0,j=0;  
  25.     for(i=0;iwidthStep,i++)  
  26.     {     
  27.         Dcur=Pcur;  
  28.         for(j=0;jnChannels,j++)  
  29.         {      
  30.   
  31.             float newx=j/wscale;  
  32.             float newy=i/hscale;  
  33.             float coex=newx- floor(newx);  
  34.             float coey=newy- floor(newy);  
  35.   
  36.             float LU = (1-coex)*(1-coey);  
  37.             float LD = (1-coex)*coey;  
  38.             float RU = coex*(1-coey);  
  39.             float RD = coex*coey;  
  40.   
  41.             int xx = floor(newx);  
  42.             int yy = floor(newy);  
  43.   
  44.             int ind00=yy*image->widthStep+xx*image->nChannels;  
  45.             int ind01=(yy+1)*image->widthStep+xx*image->nChannels;  
  46.             int ind10=yy*image->widthStep+(xx+1)*image->nChannels;  
  47.             int ind11=(yy+1)*image->widthStep+(xx+1)*image->nChannels;  
  48.   
  49.             Dcur[0]=(uchar)(Scur[ind00]*LU+Scur[ind10]*RU+Scur[ind01]*LD+Scur[ind11]*RD);  
  50.             Dcur[1]=(uchar)(Scur[ind00+1]*LU+Scur[ind10+1]*RU+Scur[ind01+1]*LD+Scur[ind11+1]*RD);  
  51.             Dcur[2]=(uchar)(Scur[ind00+2]*LU+Scur[ind10+2]*RU+Scur[ind01+2]*LD+Scur[ind11+2]*RD);  
  52.         }     
  53.     }  
  54.     cvShowImage("image",image);  
  55.     cvShowImage("newimage",newimage);  
  56.     cvWaitKey(0);  
  57.     return 0;  
  58. }  




输入:


输出:

阅读(828) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~