将重复出现的图像识别为较大的图像

时间:2015-12-16 11:31:25

标签: algorithm matlab opencv image-processing computer-vision

编辑:这不是Determine if an image exists within a larger image, and if so, find it, using Python的副本,因为我事先并不知道该模式

假设我有一个很大的图像(通常是用相机拍摄的照片,所以它可能有点嘈杂,但让我们假设现在不是这样)由多个较小的图像组成,它们彼此相等,类似

enter image description here

我需要找到每一个的轮廓。第一步是识别2D图像中存在重复图像(或未知图案)。我怎样才能实现这第一步?

我确实读到过我可能会使用原始图像的FFT并搜索重复频率,这是一种可行的方法吗?

为了解决这个问题:我事先不知道图像,也不知道它的大小或大图像上会有多少。图像可以从相机拍摄,因此它们可能会产生噪音。图像不会重叠。

3 个答案:

答案 0 :(得分:5)

您可以尝试使用描述的关键点(Sift / SURF / ORB /等)来查找图像中的特征,并尝试检测图像中的相同特征。 您可以在How to find euclidean distance between keypoints of a single image in opencv中看到这样的结果,其中3x存在相同的图像,并且会自动检测并链接这些子图像。

在您的图片中,结果看起来像

enter image description here

因此您可以看到确实自动检测并链接了相同模式的不同出现。

接下来的步骤是将要素分组到对象,以便可以提取“整体”模式。一旦有了模式的候选者,就可以为模式的每次出现提取单应性(使用一个参考候选模式)来验证它是模式。一个开放的问题是如何找到这样的候选人。也许值得尝试找到“并行特征”,因此具有平行线和/或相同长度线的关键点匹配(见图)。或者也许有一些图论方法。

总而言之,这整个方法都有一些优点和不足之处:

<强>优点:

  • 现实世界的适用性 - 即使有噪音和一些透视效果,Sift和其他关键点也能很好地工作,所以有机会增加找到这样的模式。

<强>缺点

  • 参数化(定义两个要素成功的含义) 匹配的)
  • 不适合所有类型的模式 - 您的模式必须具有一些可提取的关键点

这些是一些想法,可能还不完整;)

不幸的是,还没有针对您具体任务的完整代码,但我希望这个想法很明确。

答案 1 :(得分:1)

对于这样一个干净的图像,只需通过斑点分析对图案进行分割,并比较包含它们的片段或ROI即可。尺寸是第一个匹配标准。 SAD,SSD或相关相似度得分可以做得更精细。

enter image description here

在实践中,您将面临更多困难,例如

  • 无法细分模式

  • 尺寸/方向的几何变化

  • 部分遮挡

  • ...

处理这些不属于这个答案的范围;它使事情变得比玩具更加困难&#34;情况下。

答案 2 :(得分:0)

目标是找到几个相同或非常相似的图案,这些图案在图片中是未知的。因为这个问题仍然有些不适。

  • 模式是完全相同还是仅相似(可能会增加噪音)?
  • 您是否希望拥有最大可能的模式或更小的子模式,或者是否需要所有可能的模式?理由是,每个模式当然也可以由相同的模式组成。
  • 背景总是那么简单(完全是白色)还是更难?我们对此了解多少?
  • 模式是否总是同等方向,同等缩放,不重叠?

对于简单背景的非重叠模式的简单情况,Yves Daoust使用分段的答案表现良好,但如果模式非常接近或重叠,则会失败。

对于其他情况,Micka关键点的概念会有所帮助,但如果有噪音或可能会很慢,可能效果不佳。

我有一个选择:查看图像子块的相关性。

在伪代码中:

  • 将尺寸为MxN的重叠区域中的图像划分为合适的M,N(像素宽度和高度选择为大约所需图案的大小)
  • 将每个子块与整个图像相关联。在相关性中查找局部最大值。这些最大值的位置表示相似区域的位置。
  • 选择所有相关性的全局阈值(巧妙地以某种方式)并找到相同模式的集合。
  • 通过将形状从矩形(边界框)变形为更复杂的形状(可能通过查看相关中峰的形状)来确定这些图案的精细结构。
  • 如果以前不知道所需图案的大致尺寸,请尝试使用较大的M,N值,然后选择较小的值。
  • 为了加快整个过程的开始,粗略缩放(缩小版图像),然后只在需要的地方处理更精细的比例。需要平衡放大和执行相关性。

很抱歉,我现在无法将其作为一个完整的Matlab项目,但我希望这会对您有所帮助。