搜索图像模式

时间:2009-05-20 14:47:07

标签: c parallel-processing

我需要做一个这样做的程序:给定一个图像(5 * 5像素),我必须搜索有多少图像存在于另一个图像中,由许多其他图像组成。也就是说,我需要在图像中搜索给定的模式。

使用的语言是C.我必须使用并行计算来搜索4个角度(0º,90º,180º和270º)。

最好的方法是什么?

4 个答案:

答案 0 :(得分:5)

似乎直截了当。

  • 创建4个版本的图像旋转0°,90°,180°和270°。
  • 使用一个版本的图像启动四个线程。
  • 适用于从(0,0)(width - 5, height - 5)的所有职位
    • Comapare参考图像的25个像素与当前位置的25个像素
    • 如果使用某个指标足够相同,请报告结果。

答案 1 :(得分:3)

使用规范化关联来确定模板匹配。

@Daniel,Daniel的解决方案很适合利用您的多个CPU。他没有提到有用的质量指标,我想建议一种在图像处理中非常常见的质量指标。

我建议使用normalized correlation [1]作为比较指标,因为它输出的数字从-1到+1。如果两个模板完全相反,那么0将不输出相关1,如果两个模板完全相反,则输出-1。

计算归一化相关后,您可以通过执行threshold test或峰值平均测试[2]来测试是否找到了模板。

[1 - 脚注]如何实现规范化关联?它非常简单,只有两个for循环。一旦你有一个足够好的实现,你可以通过检查相同的图像是否得到1来验证你的实现。

[2 - 脚注]你做max(数组)/ average(array_without_peak)的比率。然后是阈值,以确保您具有良好的峰均比。

答案 2 :(得分:1)

无需创建图像的其他三个版本,只需对它们进行不同的处理或使用类似我创建的类here。更好的是,只需复制5x5矩阵并旋转它们。然后,您可以线性扫描图像以进行所有旋转(这是一件好事)。

这个问题不能很好地适用于并行处理,因为瓶颈肯定是访问图像数据。让多个线程访问相同的数据会降低速度,特别是如果线程“不同步”,即一个线程比其他线程更进一步通过映像,以便其他线程最终重新加载第一个线程已丢弃的数据

因此,我认为最有效的解决方案是创建四个扫描5行图像的线程,每次旋转一个线程。第五个线程一次加载一行图像数据并将该行传递给四个扫描线程中的每一个,等待所有四个线程完成,即加载一行图像,附加到五行缓冲区,启动四个扫描线程,等待线程结束并重复,直到读取所有图像行。

答案 3 :(得分:0)

5 * 5 = 25

25位适合整数。

每个图像可以编码为4个整数的数组。

迭代你的大图,(希望它不是太大), 拉出所有5 * 5子图像,转换为4个整数的数组并进行比较。