【发布时间】:2022-01-11 14:28:27
【问题描述】:
我知道调整图像大小的“最近”方法是最快的方法。 尽管如此,我还是在寻找加速它的方法。 明显的步骤是预先计算的索引:
void CalcIndex(int sizeS, int sizeD, int colors, int* idx)
{
float scale = (float)sizeS / sizeD;
for (size_t i = 0; i < sizeD; ++i)
{
int index = (int)::floor((i + 0.5f) * scale)
idx[i] = Min(Max(index, 0), sizeS - 1) * colors;
}
}
template<int colors> inline void CopyPixel(const uint8_t* src, uint8_t* dst)
{
for (int i = 0; i < colors; ++i)
dst[i] = src[i];
}
template<int colors> void Resize(const uint8_t* src, int srcW, int srcH,
uint8_t* dst, int dstW, int dstH)
{
int idxY[dstH], idxX[dstW];//pre-calculated indices (see CalcIndex).
for (int dy = 0; dy < dstH; dy++)
{
const uint8_t * srcY = src + idxY[dy] * srcW * colors;
for (int dx = 0, offset = 0; dx < dstW; dx++, offset += colors)
CopyPixel<N>(srcY + idxX[dx], dst + offset);
dst += dstW * colors;
}
}
是否存在下一个优化步骤?例如使用 SIMD 或其他一些优化技术。
附:特别是我对 RGB 的优化很感兴趣(Colors = 3)。
如果我使用当前代码,我发现 ARGB 图像 (Colors = 4) 的处理速度比 RGB 快 50%,尽管它比 RGB 大 30%。
【问题讨论】:
-
如果你真的关心性能,我会考虑做这个硬件加速,所以使用例如DirectX 或 Vulkan。
-
@Savage 'Nearest' 方法很快。如果我将在 CPU 上执行所有计算,我担心将图像内存复制到 GPU 并返回会更慢。
-
你可以看看 opencv 是怎么做的:github.com/opencv/opencv/blob/master/modules/imgproc/src/… github.com/opencv/opencv/blob/master/modules/imgproc/src/… 对于某些格式,opencv 也调用 IPP 函数或没有显式 SIMD 代码的实现。如果您真的想尝试自己编写,至少 opencv/IPP 实现应该为您提供一个很好的基准来进行基准测试。
-
你在哪里计算
idxY和idxX?重要的是要知道这些来自哪里以及它们是如何排序的,以便为您提供最好的帮助。 -
@CrisLuengo 我添加了索引计算功能。
标签: c++ image-processing simd simd-library synet