您好!欢迎来到bbin糖果派对app
当前位置:主页 > 美容 >
Opencv下双线性插值法进行图像放缩

  #include

  #include

  #include

  using namespace std;

  using namespace cv;

  int main(){

  Mat src;

  src=imread("G:/save1.jpg",1); //输入图片;

  if(src.empty()){

  return -1;

  }

  Mat dist=Mat((2*src.rows),(2*src.cols),CV_32FC3); //目标图片,将原图放大两倍;

  //遍历目标图片的点,将目标图片的归溯到原图的点当中,若结果为浮点型,则按照算法计算;

  //归溯算法,原图大小为a*b,目标图大小m*n,i/x=a/m,j/y=b/n;

  float x,y;

  int Q11[2],Q21[2],Q12[2],Q22[2]; //Q11 Q12 Q21 Q22分别对应着与P点最为临近的四个点,P点为目标图点还原到原图的点的对应位置;

  float R1[3],R2[3];

  for(int i=0;i

  for(int j=0;j

  x=(i+0.5)*0.5-0.5; //通过加减0.5,将像素点移到中心点的位置,使放缩效果更好。

  y=(j+0.5)*0.5-0.5;

  Q11[0]=(int)x;

  Q12[0]=(int)x;

  Q21[0]=(int)x+1;

  Q22[0]=(int)x+1;

  Q11[1]=(int) y;

  Q21[1]=(int) y;

  Q12[1]=(int) y+1;

  Q22[1]=(int) y+1;

  // 插值法算法如下:

  // X1=(int)x; X2=(int)x+1; Y1=(int)y; Y2=(int)y+1;

  // f(R1)=(X2-X)/(X2-X1)*f(Q11)+(X-X1)/(X2-X1)*f(Q21);

  // f(R2)=(X2-X)/(X2-X1)*f(Q12)+(X-X1)/(X2-X1)*f(Q22);

  // f(i,j)=(Y2-Y)/(Y2-Y1)f(R1)+(Y-Y1)/(Y2-Y1)*f(R2);

  for(int m=0;m<3;m++){

  R1[m]=((Q21[0]-x)*src.at(Q11[0],Q11[1])[m])+((x-Q11[0])*src.at(Q21[0],Q21[1])[m]);

  R2[m]=((Q21[0]-x)*src.at(Q12[0],Q12[1])[m])+((x-Q11[0])*src.at(Q22[0],Q22[1])[m]);

  dist.at(i,j)[m]=(Q12[1]-y)*R1[m]+(y-Q11[1])*R2[m];

  }

  }

  }

  imwrite("G:/save.jpg",dist); //输出图片;

  }




上一篇:驰骋草原 碎裂星辰 成吉思汗

下一篇:没有了