如何比较裁剪的相同原点的图像?

时间:2011-02-01 10:23:53

标签: image-processing image-comparison

假设我有一个图像文件/ URL,我希望我的软件能够在一组最多100张图像中搜索它(或者至少在这个数量级上)。软件应该找到的目标图像应该是与给定图像“相同”的图像,但它仍然能够“原谅”对它们中的任何一个进行轻微处理(两个图像可能被不同地裁剪,或者它们被压缩不同)。 问题是 - 这是否可行是一项任务,因为在搜索开始之前我不会有任何图像(即,在搜索之前不会有任何索引。)它是否可能在亚秒内工作时间(记住比较集非常小)。如果可行,我可以使用哪些工具执行此任务?这可能是软件组件甚至是在线服务(我可以将其用于概念证明)。 OpenSURF可以帮助我吗? 为了进一步集中我的问题 - 我不是要问使用哪种算法,此时我宁愿使用现有的工具/ API /服务。

3 个答案:

答案 0 :(得分:3)

  

软件应该找到的目标图像应该是与给定图像“相同”的图像,但它仍然能够“原谅”对它们中的任何一个进行轻微处理。

如果“轻微处理”不涉及旋转,而只是“裁剪”,那么简单的互相关应该起作用,如果可以进行透视校正,旋转,镜头失真校正,那么事情就更复杂了。

我认为这种方法对于轻微的色彩校正非常宽容。无论如何,如果需要,您始终可以将两个图像转换为灰度并比较灰度版本。

  

进一步关注我的问题 - 我不是要问使用哪种算法,此时我宁愿使用现有的工具/ API /服务。

您可以从OpenCV库的cvMatchTemplate开始(链接指向API的C版本,但它也适用于C ++和Python)。使用裁剪后的图像作为模板,并在所有图像中查找。

如果您比较的图像在浅色背景上具有暗色特征,则可以使用CV_TM_CCOEFFCV_TM_CCOEFF_NORMED方法获益。它们都从两个图像中减去模板区域的平均值。规范化方法(CV_TM_*_NORMED)通常效果更好,但比非规范化方法慢。

您可以考虑在互相关之前对图像进行一些预处理。如果首先对它们进行标准化,则互相关对亮度/对比度的轻微修改不太敏感。如果您首先检测边缘,如@misha所示,您将丢失颜色/亮度信息,但轮廓重叠的结果会更好。

答案 1 :(得分:1)

jetxee让你走在正确的轨道上。但是,如果您只是使用模板匹配,则可能会遇到背景干扰模板匹配结果的问题。例如,如果您的模板是建筑物而您的背景主要是浅色(例如沙漠沙),则模板匹配将失败,因为较浅的背景将始终返回比较暗的模板更高的互相关。以下是此问题的example

您解决问题的方式与链接中的内容相同:

  • 对模板和目标图像执行边缘检测。
  • 丢弃原始模板和图像
  • 使用边缘检测模板和边缘检测目标图像执行模板检测

对于宽容的轻微处理,边缘检测步骤将处理这一点。只要两幅图像中的边缘没有明显修改(模糊,光学扭曲),该方法就可以工作。

答案 2 :(得分:1)

我知道你并不是专门针对算法,但是,让我建议以下几点可以完全达到你想要做的,非常有效...

对于相同图像的裁剪版本,包括旋转,F ourier-Mellin transformlog-polar transform(注意艺术半裸图画 - 不过好的来源)会给你翻译,旋转和两个图像之间的比例系数,允许确定从一个图像到另一个图像需要什么操作。