编辑:这不是Determine if an image exists within a larger image, and if so, find it, using Python的副本,因为我事先并不知道该模式
假设我有一个很大的图像(通常是用相机拍摄的照片,所以它可能有点嘈杂,但让我们假设现在不是这样)由多个较小的图像组成,它们彼此相等,类似
我需要找到每一个的轮廓。第一步是识别2D图像中存在重复图像(或未知图案)。我怎样才能实现这第一步?
我确实读到过我可能会使用原始图像的FFT并搜索重复频率,这是一种可行的方法吗?
为了解决这个问题:我事先不知道图像,也不知道它的大小或大图像上会有多少。图像可以从相机拍摄,因此它们可能会产生噪音。图像不会重叠。
答案 0 :(得分:5)
您可以尝试使用描述的关键点(Sift / SURF / ORB /等)来查找图像中的特征,并尝试检测图像中的相同特征。 您可以在How to find euclidean distance between keypoints of a single image in opencv中看到这样的结果,其中3x存在相同的图像,并且会自动检测并链接这些子图像。
在您的图片中,结果看起来像
因此您可以看到确实自动检测并链接了相同模式的不同出现。
接下来的步骤是将要素分组到对象,以便可以提取“整体”模式。一旦有了模式的候选者,就可以为模式的每次出现提取单应性(使用一个参考候选模式)来验证它是模式。一个开放的问题是如何找到这样的候选人。也许值得尝试找到“并行特征”,因此具有平行线和/或相同长度线的关键点匹配(见图)。或者也许有一些图论方法。
总而言之,这整个方法都有一些优点和不足之处:
<强>优点:强>
<强>缺点强>
这些是一些想法,可能还不完整;)
不幸的是,还没有针对您具体任务的完整代码,但我希望这个想法很明确。
答案 1 :(得分:1)
对于这样一个干净的图像,只需通过斑点分析对图案进行分割,并比较包含它们的片段或ROI即可。尺寸是第一个匹配标准。 SAD,SSD或相关相似度得分可以做得更精细。
在实践中,您将面临更多困难,例如
无法细分模式
尺寸/方向的几何变化
部分遮挡
...
处理这些不属于这个答案的范围;它使事情变得比玩具更加困难&#34;情况下。
答案 2 :(得分:0)
目标是找到几个相同或非常相似的图案,这些图案在图片中是未知的。因为这个问题仍然有些不适。
对于简单背景的非重叠模式的简单情况,Yves Daoust使用分段的答案表现良好,但如果模式非常接近或重叠,则会失败。
对于其他情况,Micka关键点的概念会有所帮助,但如果有噪音或可能会很慢,可能效果不佳。
我有一个选择:查看图像子块的相关性。
在伪代码中:
很抱歉,我现在无法将其作为一个完整的Matlab项目,但我希望这会对您有所帮助。