我需要有效地检测彩色图像中已知数量的简单标记(棋盘图案)。
我通过 WebGL 将标准化互相关 (NCC) 实现为像素着色器,因为我需要它在浏览器的客户端应用程序中工作。检测工作正常并且足够强大,但我需要更好的性能。目前计算 NCC 图像需要几秒钟的时间,而且我已经在使用“明显”的优化,例如裁剪图像(我有一个粗略的指示应该在哪里标记)和降低分辨率。我还优化了代码本身(例如使用循环展开,但这是另一回事,可能属于 SO)。
图像的分辨率为 900x520 像素,标记为 22 方形像素。该代码在配备英特尔凌动处理器的平板电脑上运行。
我的问题是:是否有算法可以更好地利用我对图像和标记几何的了解,最理想的是适合几乎无分支像素着色器的算法?例如,我正在考虑一个带通滤波器(可以说是只留下标记频率的傅立叶变换)或 FNCC(JP Lewis 的论文),或者利用标记是黑白的事实的东西。
不幸的是,这些方法似乎相对昂贵,因为图像的 FFT 并不便宜,而且我的标记与图像分辨率相比很小。盲目地测试大量算法不是一种选择,除非有一个我不知道的库可以帮助我在 JavaScript 或 glsl 像素着色器中实现它。即使那样,更有效算法的指示也会有所帮助。
编辑:添加了标记的图像。当然,背景通常是透明的,即 NCC 将忽略那些像素