通过访问像二维阵列这样的二维阵列的双线性插值概念确实如此

时间:2016-06-07 13:38:54

标签: c++ arrays bmp bilinear-interpolation

在二维数组中,有bmp文件的像素。它的大小是我缩放的宽度(3 * 65536)*高度(3 * 65536)。 就是这样。

<div>
    <div class="item"
      ng-repeat="version in versions"
      ng-class="{active: version.isActive}"
      ng-class="{active: }">
      <a ng-show = "Your condition for showing or not" ng-click="setDiffed(version)"
        ng-class="{active: version.isDiffActive}"
        name="compare-type"><i></i>
      </a>
      <h4 ng-click="setMaster(version)">{{ version.label }}</h4>
    </div>
    <button type="button" ng-show = "Your condition for showing or not" class="btn btn-primary">
      back to home
    </button>

  </div>

在1和2之间,当我放大原始的2-d阵列时,有2个孔。 (乘以3)

我使用像这样的1-d数组式访问方法。

  

array [y * width + x]

1   2   3   4 

5   6   7   8

9  10  11  12

现在我可以像这个解决方案那样修补漏洞。 在双循环中,条件(j%3 == 1)

index
0 1 2 3 4 5 6 7 8 9...   
1     2     3     4    5    6    7    8    9    10    11    12
(this array is actually 2-d array and is scaled by multiplying 3)

在另一个条件下(j%3 == 2)

Image[i*width+j] = Image[i*width+(j-1)]*(1-1/3) + Image[i*width+(j+2)]*(1-2/3)

这就是我知道我可以修补所谓的&#34; Bilinear Interpolation&#34;的方法。

我希望在将此逻辑实现到我的代码之前确定我所知道的内容。谢谢阅读。

1 个答案:

答案 0 :(得分:0)

双线性插值要求每个插值像素有2个线性插值通道(水平和垂直)(好吧,其中一些只需要1个),或者每个插值像素最多需要4个源像素。

1到2之间有两个洞。在1到5之间有2个洞。在1到6之间有4个洞。你编写的代码只能在1到2之间修补漏洞,而不能正确修补其他漏洞。

另外,你的除法是整数除法,并不能达到你想要的效果。

通常ypu写一个r=interpolate_between(a,b,x,y)函数要好得多,它在y和x的步骤x之间进行插值。然后测试并修复。现在使用它来缩放您的图像水平,并在视觉上检查您是否正确(尤其是边缘!)

现在尝试使用它来仅缩放垂直

现在做水平,然后垂直。

接下来,编写双线性版本,您可以使用线性版本三次测试(将在舍入误差范围内)。然后尝试双线缩放图像,目视检查。

与双线性比例进行比较。它应该只有舍入误差才有所不同。

在这些阶段的每一个阶段,您都会遇到一个可能出错的“新”操作,前面的代码已经过验证。

一次编写所有内容将导致复杂的错误代码。