You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于AVX2的两帧图像运动检测算法:如何实现进一步优化?

图像帧差异检测算法的进一步优化疑问

我编写了一款算法,用于对比以ARGB数组(每个颜色通道占1字节)表示的两帧图像,在考虑噪声的前提下检测图像间是否存在显著差异。两帧图像分别为previousFrame和currentFrame,每帧的总像素数存储在dataLength中。

像素的R、G、B通道的可接受噪声水平基于previousFrame对应通道的值,这些噪声水平存储在长度为256的noiseLevels数组中(数组元素对应0-255的每个可能颜色通道值)。

该算法会计算两帧图像中每个像素颜色通道的绝对差,并检查差值是否超过设定的噪声水平,若超过则执行特定操作。Alpha通道可忽略(默认值恒为255)。

我已通过AVX2指令集优化了两帧间绝对差的计算过程,现提出疑问:是否存在我未考虑到的方法,能进一步优化该算法以实现最快执行速度? 假设内存资源不受限制,是否存在更高效的差分计算方式或噪声阈值检查逻辑?

初始简化代码片段:

// AVX2 mm256寄存器可存储256位 = 32字节 = 8个int32 = 8个像素
for (int i = 0; i < dataLength; i += 8) {
  __m256i previousChunk = _mm256_loadu_si256(previousFrame);
  __m256i currentChunk = _mm256_loadu_si256(currentFrame);
  __m256i _absoluteDiff = _mm256_or_si256(_mm256_subs_epu8(previousChunk, currentChunk), _mm256_subs_epu8(currentChunk, previousChunk));
  unsigned char* absoluteDiff = (unsigned char*) &_absoluteDiff;

  for (int j = 0; j < 8; j++) {
    // 对比当前帧的R/G/B通道变化是否超出阈值
    int signBits = (noiseLevels[previousFrame[1]] - absoluteDiff[1]) | (noiseLevels[previousFrame[2]] - absoluteDiff[2]) | (noiseLevels[previousFrame[3]] - absoluteDiff[3]);

    if (signBits < 0) {
      // 执行操作
    }
    absoluteDiff += 4;
    previousFrame += 4;
  }

  currentFrame += 32;
}

版本更新

2023年6月9日22:26(阿姆斯特丹时间)

根据@WeatherVane的建议,重写了判断像素是否发生显著变化的代码段,获得了小幅性能提升(推测编译器已对原代码进行了较好的优化):

bool isDifferent = (absoluteDiff[1] > noiseLevels[previousFrame[1]]) || (absoluteDiff[2] > noiseLevels[previousFrame[2]]) || (absoluteDiff[3] > noiseLevels[previousFrame[3]]);
absoluteDiff += 4;
previousFrame += 4;

2023年6月9日23:20(阿姆斯特丹时间)

根据@PeterCordes的建议,改用以下方法判断是否存在显著差异:

int signBits = (noiseLevels[previousFrame[1]] - absoluteDiff[1]) | (noiseLevels[previousFrame[2]] - absoluteDiff[2]) | (noiseLevels[previousFrame[3]] - absoluteDiff[3]);

if (signBits < 0) {
  // 执行操作
}

2023年6月11日23:45(阿姆斯特丹时间)

发现了一项大幅优化方案(基于像素变化超出阈值的频率),即在遍历单个像素结果的循环前增加如下检查:

unsigned long long* absDifL = (unsigned long long*) absoluteDiff;

if (!(absDifL[0] || absDifL[1] || absDifL[2] || absDifL[3])) {
  continue;
}

该检查可判断8个像素中是否存在变化,无需查看具体颜色通道,能快速忽略新帧中“无意义”的区域。

注:该优化的实际效果取决于原始图像的噪声量,噪声越大,差分全为0的8像素块就越少。

内容的提问来源于stack exchange,提问作者ImJustACowLol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:27:04