【发布时间】:2021-02-10 07:45:39
【问题描述】:
我想使用均方误差测量两个灰度相同大小的图像之间的相似度。我不能使用任何不属于 macOS SDK 的框架(例如 OpenCV、Eigen)。没有向量化的这个算法的简单实现是这样的:
vImage_Buffer imgA;
vImage_Buffer imgB;
NSUInteger mse = 0;
unsigned char *pxlsA = (unsigned char *)imgA.data;
unsigned char *pxlsB = (unsigned char *)imgB.data;
for (size_t i = 0; i < imgA.height * imgA.width; ++i) {
NSUInteger d = pxlsA[i] - pxlsB[i]);
mse += d * d;
}
有没有办法以更矢量化的方式在没有循环的情况下做到这一点?可能是这样的:
mse = ((imgA - imgB) ^ 2).sum();
【问题讨论】:
-
我不会说objective-c,但
sqrt(d * d)不只是abs(d)吗?另外,我很确定 MSE 不需要sqrt -
您希望这种矢量化能做什么?循环在编译语言中并不慢。像
imgA - imgB这样的语句需要一个重载的减号运算符,其中包含一个和你一样的循环。在解释型语言中,这可能会快很多,因为循环会被编译,但这在这里不起作用。在编译语言中,“向量化”通常是指使用 SIMD 处理器指令。如果您在编译器中打开特定于机器的优化,它将使用那些可用的优化。 -
@VladFeinstein 是的,你是对的)
-
@CrisLuengo 我希望矢量化能够提高执行速度。我不明白矢量化背后发生了什么,但我觉得它必须提高速度。我会阅读有关 SIMD 的信息,谢谢。
-
如果我要这样做,并且需要高性能,我会使用 Core Image 过滤器来做到这一点——但这不是一条容易走的路。即使使用具有 C 接口的 Accelerate,也需要您付出一些努力。
标签: ios objective-c performance image-processing accelerate