2009-05-20 125 views
1

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

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

这样做的最好方法是什么?

回答

5

似乎挺直的。

  • 创建旋转0°,90°,180°和270°的图像的4个版本。
  • 用一个图像版本启动四个线程。够使用一些度量
  • 对于来自(0,0)的所有位置(width - 5, height - 5)
    • Comapare 25个的参考图像与在当前位置
    • 25个像素的像素如果它们相等,报告的发现。
1

没有必要创建图像的另外三个版本,只是解决这些问题的不同或使用像我创建here类。更好的是,只需复制5x5矩阵并旋转它们即可。然后,您可以线性扫描图像进行所有旋转(这是件好事)。

由于瓶颈当然是访问图像数据,所以这个问题不能很好地适用于并行处理。让多个线程访问相同的数据会降低速度,特别是在线程“不同步”的情况下,即一个线程比其他线程更深入地通过映像,以便其他线程最终重新加载第一个线程已丢弃的数据。

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

+0

我的意思是在内存旋转,因为不同的线程使用相同的代码不同的索引会变得有点混乱... – 2009-05-20 15:44:09

3

使用归一化相关来确定模板的匹配。

@丹尼尔,丹尼尔的解决方案是利用您的多CPU的好处。他没有提到一个有用的质量指标,我想提出一个在图像处理中很常见的质量指标。

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

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

[1 - 脚注]你如何实现归一化相关?它非常简单,只有两个for循环。一旦你有一个足够好的实现,你可以通过检查你的实现来验证你的实现,看看相同的图像是否让你一个1.你做的最大(数组)/平均(array_without_peak )。然后确定你有一个良好的峰值平均比率的门槛。

0

5 * 5 = 25

25位适合整数。

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

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