如何加快我的双线性插值
How to speed up my bilinear interpolation?
我花了无数个小时试图加快我的双线性插值,但无济于事。我甚至尝试了SSE版本(双版本和浮动版本),但它甚至比这个版本更慢。
有人有什么想法吗?
template <typename T>
__forceinline void interp2_mx(const T& x, const T& y,
const T* z,
const int32_t& n,
const int32_t& mm2,
const int32_t& nm2,
T& val,
const T& extrapval = T(0))
{
int64_t xp = (int64_t)(x) - 1; // adjust for MATLAB indexing
int64_t yp = (int64_t)(y) - 1;
if (xp < 0 || xp > nm2 || yp < 0 || yp > mm2)
{
val = extrapval;
}
else
{
const T* line = z + yp * n + xp;
T xf = x - (int64_t)(x);
T yf = y - (int64_t)(y);
T x1mf = (T)1 - xf;
T y1mf = (T)1 - yf;
T v00 = x1mf * y1mf * (*(line));
T v01 = xf * y1mf * (*(line + 1));
T v10 = x1mf * yf * (*(line + n));
T v11 = xf * yf * (*(line + n + 1));
val = v00 + v01 + v10 + v11;
}
}
template <typename T>
void interp2(const T* z,
const int32_t& mz, const int32_t& nz,
const T* xi, const T* yi,
const int32_t& mi, const int32_t& ni,
T* zi,
const T& extrapval = T(0))
{
const int32_t nzm2 = nz - 2;
const int32_t mzm2 = mz - 2;
#pragma omp parallel for
for (int m = 0; m < mi; ++m)
{
T* line_zi = zi + m * ni;
const T* x = xi + m * ni;
const T* y = yi + m * ni;
for (int n = 0; n < ni; ++n, ++x, ++y, ++line_zi)
{
interp2_mx((*x), (*y), z, nz, mzm2, nzm2, (*line_zi));
}
}
}
对xf
的计算进行了浮点到int64_t到浮点的转换。我假设您知道值在范围内,否则这将是未定义行为(并且在数学上毫无意义)。std::modf()
可能是更好的函数,因为它直接计算所需的值。
我还认为相邻像素具有相当相关的xf &X1mf值,然后重新计算它们。我不确定这一点,因为你的坐标似乎是间接存储((*x), (*y)
)。动态地计算这些可能会更有效。由于这些指针可能会别名输出,因此不能预取它们,并且读取将阻塞内存总线。
相关文章:
- 如何线性插值到不恒定的目的地
- 双线性插值实现的错误
- 如何避免线性插值"trap"?
- 双三次插值结果与FFMPEG不同
- 是否有机会更快地使双线性插值
- 更快的双线性插值方法
- 如何加快图像的双线性插值
- 极慢的双线性插值(与OpenCV相比)
- 通过访问二维数组实现双线性插值的概念类似于一维数组
- C++,双线性插值以修补放大的位图图像上的孔
- 使用c/awk/shell对二维数据进行双线性插值
- 图像失真与正弦双线性插值c++
- 比如果其他更好的方式..用于线性插值
- 使用 lerp 在两个图像之间执行线性插值
- 音频从 44100 上采样到 96000 Hz 和线性插值
- 鱼眼滤波器上的双线性插值
- 线性插值更线性
- 如何加快我的双线性插值
- 从C到Neon的双线性插值
- SSE双线性插值