考试培训

双线性插值算法

作者:admin 来源:原创 时间:2020年06月13日 03:14:38浏览:

  #include

  using namespace std;

  using namespace cv;

  bool mlinear_interpolation(Mat &src, Mat &dst)

  {

  if (!src.data)

  {

  return false;

  }

  //源/目的图像每行所占字节数

  int nSrcWidthStep=src.step;

  int nDstWidthStep=dst.step;

  //源和目的几何中心对齐

  double scaleX=static_cast(src.cols) / static_cast(dst.cols);

  double scaleY=static_cast(src.rows) / static_cast(dst.rows);

  for (int i=0; i < dst.rows; i++) {

  //原图中对应的纵坐标

  double y=(static_cast(i) + 0.5)*scaleY - 0.5;

  //指向目标图像中的行数据

  unsigned char *pDstLine=dst.data + i*nDstWidthStep;

  for (int j=0; j < dst.cols; j++) {

  //原图中对应的横坐标

  double x=(static_cast(j) + 0.5)*scaleX -0.5;

  //u和v为y,x的小数部分,并放大2048倍避免浮点运算

  int u=static_cast((y - static_cast(y)) * 2048);

  int v=static_cast((x - static_cast(x)) * 2048);

  //dx和dy分别存储x和y的整数部分

  int dx=int(x);

  int dy=int(y);

  //调整dx,dy和u,v

  //dy=std::min(dy, dst.rows - 2);

  //dy=std::max(0,dy);

  //进行插值计算f(p)=f(0,0)*(1-u)(1-v)+f(1,0)*(1-y)x+f(0,1)*(1-x)y+f(1,1)*xy

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

  pDstLine[j * 3 + k]=(src.data[dy*nSrcWidthStep + dx * 3 + k] * (2048 - u)*(2048 - v)

  + src.data[dy*nSrcWidthStep + (dx + 1) * 3 + k] * (2048 - u)*(v)

  +src.data[(dy + 1)*nSrcWidthStep + dx * 3 + k] * (2048 - v)*(u)+

  +src.data[(dy + 1)*nSrcWidthStep + (dx + 1) * 3 + k] * (v)*(u)) >> 22;

  }

  }

  }

  return true;

  }

  int main()

  {

  cv::Mat matSrc, matDst, check;

  matSrc=cv::imread("lena.png", 2 | 4);

  //自己插值算法的结果

  matDst=cv::Mat(cv::Size(1000, 1000), matSrc.type(), cv::Scalar::all(0));

  //opecv resize的结果

  check=cv::Mat(matDst.size(), matSrc.type(), cv::Scalar::all(0));

  mlinear_interpolation(matSrc, matDst);

  cv::imwrite("linear_1.jpg", matDst);

  cv::resize(matSrc, check, matDst.size(), 0, 0, 1);

  cv::imwrite("linear_2.jpg", check);

  }

(来源:原创   admin)  

1.bbin遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本网的原创文章,请转载时务必注明文章作者和"来源:bbin",不尊重原创的行为bbin或将追究责任;3.作者投稿可能会经bbin编辑修改或补充。

阅读延展