双线性插值

最近用到插值算法,使用三次样条插值仿真速度太慢,于是采用算法简单的线性插值。本篇主要介绍一下双线性插值的实现方法。

1. 线性插值

已知坐标 (x0y0) 与 (x1y1),要得到 [x0x1] 区间内某一位置 x 在直线上的值。

由于 x 值已知,所以可以从公式得到 y 的值

已知 y 求 x 的过程与以上过程相同,只是 x 与 y 要进行交换。

 

2. 双线性插值(Bilinear Interpolation)

在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

双线性插值_第1张图片

图中:红色的数据点与待插值得到的绿色点

假如我们想得到未知函数 f 在点 P = (xy) 的值,假设我们已知函数 f 在 Q11 = (x1y1)、Q12 = (x1y2), Q21 = (x2y1) 以及 Q22 = (x2y2) 四个点的值。

首先在 x 方向进行线性插值,得到


然后在 y 方向进行线性插值,得到

这样就得到所要的结果 f(xy),

双线性插值在三维空间的延伸是三线性插值。

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 双线性插值 对像素点位置进行线性加权 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        nearest = (int  *)malloc(sizeof(int) *  k);     // k: cells 的大小
        w       = (float*)malloc(sizeof(float) * (k * 2));
        
        for(i = 0; i < k / 2; i++)
        {
                nearest[i] = -1;
        }/*for(i = 0; i < k / 2; i++)*/
        for(i = k / 2; i < k; i++)
        {
                nearest[i] = 1;
        }/*for(i = k / 2; i < k; i++)*/
        //双线性插值 http://blog.csdn.net/zyh821351004/article/details/50730097
        // 示意图 http://pan.baidu.com/s/1i5bGZE9
        float temp;
        for(j = 0; j < k / 2; j++)
        { 
                temp = k / 2 + j + 0.5f;
                w[j * 2] = 1.0f * temp / (float)k;
                w[j * 2 + 1] = 1 - w[j * 2];
        }/*for(j = 0; j < k / 2; j++)*/
        for(j = k / 2; j < k; j++)
        {
                temp = k - (j - k / 2 + 0.5f);
                w[j * 2] = 1.0f * temp / (float)k;
                w[j * 2 + 1] = 1 - w[j * 2];
        }/*for(j = k / 2; j < k; j++)*/
        for(i = 0; i < sizeY; i++)  //
        {
          for(j = 0; j < sizeX; j++) //        
          {
                for(ii = 0; ii < k; ii++)  //
                {
                  for(jj = 0; jj < k; jj++)  //
                  {
                        // 过滤掉原图像矩阵的最外层
                        if ((i * k + ii > 0) && (i * k + ii < height - 1) && (j * k + jj > 0) && (j * k + jj < width  - 1))
                        {
                          d = (k * i + ii) * width + (j * k + jj); // 索引下标 
                          // alfa[d * 2    ] 无符号binID索引
                          // alfa[d * 2 + 1] 有符号binID索引
                          (*map)->map[ i * stringSize + j * (*map)->numFeatures + alfa[d * 2    ]] += r[d] * w[ii * 2] * w[jj * 2];
                          (*map)->map[ i * stringSize + j * (*map)->numFeatures + alfa[d * 2 + 1] + NUM_SECTOR] += r[d] * w[ii * 2] * w[jj * 2];
                          // nearest[0] = nearest[1] = -1, nearest[2] = nearest[3] = 1
                          if ((i + nearest[ii] >= 0) && (i + nearest[ii] <= sizeY - 1))
                          {
                                (*map)->map[(i + nearest[ii]) * stringSize + j * (*map)->numFeatures + alfa[d * 2]] += r[d] * w[ii * 2 + 1] * w[jj * 2 ];
                                (*map)->map[(i + nearest[ii]) * stringSize + j * (*map)->numFeatures + alfa[d * 2 + 1] + NUM_SECTOR] += r[d] * w[ii * 2 + 1] * w[jj * 2 ];
                          }
                          if ((j + nearest[jj] >= 0) && (j + nearest[jj] <= sizeX - 1))
                          {
                                (*map)->map[i * stringSize + (j + nearest[jj]) * (*map)->numFeatures + alfa[d * 2]] += r[d] * w[ii * 2] * w[jj * 2 + 1];
                                (*map)->map[i * stringSize + (j + nearest[jj]) * (*map)->numFeatures + alfa[d * 2 + 1] + NUM_SECTOR] += r[d] * w[ii * 2] * w[jj * 2 + 1];
                          }
                          if ((i + nearest[ii] >= 0) && (i + nearest[ii] <= sizeY - 1) && (j + nearest[jj] >= 0) && (j + nearest[jj] <= sizeX - 1))
                          {
                                (*map)->map[(i + nearest[ii]) * stringSize + (j + nearest[jj]) * (*map)->numFeatures + alfa[d * 2]] += r[d] * w[ii * 2 + 1] * w[jj * 2 + 1];
                                (*map)->map[(i + nearest[ii]) * stringSize + (j + nearest[jj]) * (*map)->numFeatures + alfa[d * 2 + 1] + NUM_SECTOR] += r[d] * w[ii * 2 + 1] * w[jj * 2 + 1];
                          }
                        }
                  }/*for(jj = 0; jj < k; jj++)*/
                }/*for(ii = 0; ii < k; ii++)*/
          }/*for(j = 1; j < sizeX - 1; j++)*/
        }/*for(i = 1; i < sizeY - 1; i++)*/
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 双线性插值 对像素点位置进行线性加权 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



你可能感兴趣的:(视觉相关)