基于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
相关产品推荐
相关产品推荐

