通过访问二维数组实现双线性插值的概念类似于一维数组
The Concept of Bilinear Interpolation by Accessing 2-d array like 1-d array does
在二维数组中,有bmp文件的像素。并且其大小是我缩放的宽度(3*65536)*高度(3*665536)。就是这样。
1 2 3 4
5 6 7 8
9 10 11 12
在1和2之间,当我放大原始的二维阵列时,有2个孔。(乘以3)
我使用像这样的一维数组访问方法。
array[y*width+x]
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==1)
Image[i*width+j] = Image[i*width+(j-1)]*(1-1/3) + Image[i*width+(j+2)]*(1-2/3)
在另一种情况下(j%3==2)
Image[i*width+j] = Image[i*width+(j-2)]*(1-2/3) + Image[i*width+(j+1)]*(1-1/3)
这就是我知道我可以修补洞的方法,也就是所谓的"双线性插值"。
在将这个逻辑实现到代码中之前,我想确定我所知道的内容。感谢阅读。
双线性插值需要每个插值像素2次线性插值(水平和垂直)(好吧,其中一些只需要1次),或者每个插值像素最多需要4个源像素。
在1和2之间有两个孔。在1和5之间有2个孔。在1和6之间有4个孔。您编写的代码只能修补1到2之间的漏洞,而不能正确修补其他漏洞。
此外,你的除法是整数除法,并不能做你想做的事。
一般来说,最好编写一个r=interpolate_between(a,b,x,y)
函数,在y的第x步在a和b之间进行插值。然后测试并修复。现在使用它水平缩放图像,并目视检查是否正确(尤其是边缘!)
现在尝试使用它仅垂直缩放。
现在先做水平,然后做垂直。
接下来,编写双线性版本,您可以使用线性版本再次测试三次(将在舍入误差范围内)。然后尝试双线性缩放图像,进行视觉检查。
与两个线性刻度进行比较。它应该只在舍入误差上有所不同。
在这些阶段中的每一个阶段;新的";可能出错的操作,而之前的代码已经过验证。
一次编写所有内容将导致复杂的错误代码。
相关文章:
- 将二维数组的所有元素插入到一维数组中
- C++语法差异:二维和一维数组(指针算术)
- 将一维数组写入 CSV C++中的不同列?
- C++:将矩阵存储在一维数组中
- 如何在一维数组中的每个元素中都有多个int值
- 以C++填充一维数组
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 如何在 <threads> c++ 中使用和一维数组进行矩阵乘法?
- C++按内存地址将多维数组更改为一维数组
- 在 c++ 中返回一维数组时出错
- 一维数组映射方式的性能差异问题
- 如何使用一维数组更改二维数组中的值?
- 使用二维数组作为一维数组是否正确?可能会导致未定义的行为左右?
- 将一维数组转换为二维数组
- 是否使用类似于普通静态数组的容器
- 如何使用一维数组列表初始化二维数组
- 在一维数组中对二维进行排序
- 将一维数组的索引转换为二维数组
- 通过访问二维数组实现双线性插值的概念类似于一维数组
- 是在内存中连续设置的二维数组,类似于模拟二维数组的一维数组