这些只是我对这个问题的想法,从未尝试过,但我喜欢思考这样的问题!
开始之前
考虑对图片进行归一化处理,如果一张图片的分辨率高于另一张,请考虑其中一张图片是另一张图片的压缩版本,因此缩小分辨率可能会提供更准确的结果。
考虑扫描图像的各个预期区域,这些区域可以代表图像的缩放部分以及各种位置和旋转。如果其中一张图片是另一张图片的倾斜版本,就会变得棘手,这些是您应该识别和妥协的限制。
Matlab 是一款出色的图像测试和评估工具。
测试算法
您应该(至少)测试一组经过人工分析的大型测试数据,其中预先知道匹配项。例如,如果您的测试数据中有 1,000 张图像,其中 5% 匹配,那么您现在就有了一个相当可靠的基准。找到 10% 阳性的算法不如在我们的测试数据中找到 4% 阳性的算法好。但是,一种算法可能会找到所有匹配项,但也有 20% 的大误报率,因此有多种方法可以对您的算法进行评分。
测试数据的设计应尽可能涵盖您期望在现实世界中找到的尽可能多的动态类型。
需要注意的是,每个有用的算法都必须比随机猜测执行得更好,否则对我们毫无用处!
然后,您可以以可控的方式将您的软件应用到现实世界中,并开始分析它产生的结果。这是一种可以无限进行的软件项目,总是可以进行调整和改进,在设计时要牢记这一点很重要,因为很容易陷入永无止境的项目的陷阱。
色桶
使用两张图片,扫描每个像素并计算颜色。例如,您可能有“桶”:
white
red
blue
green
black
(显然你会有更高的计数器分辨率)。每次找到“红色”像素时,都会增加红色计数器。每个桶都可以代表颜色光谱,分辨率越高越准确,但您应该尝试可接受的差异率。
获得总数后,将其与第二张图片的总数进行比较。您可能会发现每张图片都有相当独特的足迹,足以识别匹配。
边缘检测
如何使用Edge Detection。
(来源:wikimedia.org)
对于两张相似的图片,边缘检测应该为您提供一个可用且相当可靠的独特足迹。
拍摄两张照片,并应用边缘检测。也许测量边缘的平均厚度,然后计算图像可以缩放的概率,并在必要时重新缩放。下面是在各种旋转中应用Gabor Filter(一种边缘检测)的示例。
比较图片像素,计算匹配和不匹配。如果它们在一定的误差阈值之内,那么您就有了匹配项。否则,您可以尝试将分辨率降低到某个点,看看匹配的概率是否会提高。
感兴趣的地区
某些图像可能具有不同的片段/感兴趣区域。这些区域可能与图像的其余部分形成鲜明对比,并且是在其他图像中搜索以查找匹配项的好项目。以这张图片为例:
(来源:meetthegimp.org)
蓝色的建筑工人是感兴趣的区域,可以作为搜索对象。您可能有几种方法可以从该感兴趣区域提取属性/数据并使用它们来搜索您的数据集。
如果您有超过 2 个感兴趣区域,您可以测量它们之间的距离。举个简化的例子:
(来源:per2000.eu)
我们有 3 个明确的感兴趣区域。区域 1 和 2 之间的距离可以是 200 像素,1 和 3 400 像素之间,以及 2 和 3 200 像素之间。
在其他图像中搜索相似的感兴趣区域,标准化距离值并查看是否有潜在的匹配项。这种技术可以很好地适用于旋转和缩放的图像。您拥有的感兴趣区域越多,匹配的概率会随着每次距离测量的匹配而增加。
考虑数据集的上下文很重要。例如,如果您的数据集是现代艺术,那么感兴趣的区域会很好地工作,因为感兴趣的区域可能设计为最终图像的基本部分。但是,如果您处理的是建筑工地的图像,则感兴趣的区域可能会被非法复印机解释为丑陋的,并且可能会被随意裁剪/编辑掉。牢记数据集的共同特征,并尝试利用这些知识。
变形
Morphing两张图是通过一组步骤将一张图变成另一张图的过程:
注意,这与将一张图像淡入另一张图像不同!
有许多可以变形图像的软件包。传统上用作一种过渡效果,两张图像通常不会在中途变形,一个极端变成另一个极端作为最终结果。
为什么这会有用?取决于您使用的变形算法,图像的相似性和变形算法的某些参数之间可能存在关系。
在一个非常简化的示例中,当需要进行的更改较少时,一种算法可能会执行得更快。然后我们知道这两个图像彼此共享属性的可能性更高。
这种技术可以很好地适用于旋转、扭曲、倾斜、缩放的所有类型的复制图像。再说一次,这只是我的一个想法,据我所知,它不是基于任何研究过的学术界(虽然我没有仔细研究),所以对你来说可能需要做很多工作,但结果有限/没有结果。
压缩
Ow 在这个问题上的回答非常好,我记得读过有关这些研究 AI 的技术。它在比较语料库词典方面非常有效。
比较语料库时一个有趣的优化是您可以删除被认为太常见的词,例如“The”、“A”、“And”等。这些词稀释了我们的结果,我们想弄清楚它们的不同之处。有两个语料库,因此可以在处理之前将其删除。也许图像中有类似的常见信号可以在压缩之前被剥离?可能值得研究。
压缩比是确定两组数据相似程度的一种非常快速且相当有效的方法。阅读有关how compression works 的内容将使您很好地了解为什么这会如此有效。对于快速发布的算法,这可能是一个很好的起点。
透明度
再次,我不确定某些图像类型、gif png 等的透明度数据是如何存储的,但这将是可提取的,并且可以作为有效的简化剪切来与您的数据集透明度进行比较。
反转信号
图像只是一个信号。如果您从一个扬声器播放噪音,而您在另一个扬声器中以完全相同的音量完美同步播放相反的噪音,它们会相互抵消。
(来源:themotorreport.com.au)
反转图像,并将其添加到您的其他图像上。重复缩放它/循环位置,直到找到足够的像素为白色(或黑色?我将其称为中性画布)的结果图像,从而为您提供肯定匹配或部分匹配。
但是,考虑两个相同的图像,除了其中一个应用了增亮效果:
(来源:mcburrz.com)
反转其中一个,然后将其添加到另一个不会产生我们想要的中性画布。然而,当比较两个原始图像的像素时,我们可以清楚地看到两者之间的关系。
我已经有几年没有研究颜色了,不确定色谱是否在线性范围内,但是如果你确定了两张图片之间色差的平均因子,你可以使用这个值来规范化数据在使用这种技术进行处理之前。
树数据结构
起初这些似乎不适合这个问题,但我认为它们可以工作。
您可以考虑提取图像的某些属性(例如颜色箱)并生成huffman tree 或类似的数据结构。您也许可以比较两棵树的相似性。这不适用于照片数据,例如具有大量颜色的照片,但卡通或其他减少颜色集的图像可能会起作用。
这可能行不通,但这是一个想法。 trie datastructure 非常擅长存储词典,例如字典。这是一个前缀树。也许可以构建一个相当于词典的图像(再次我只能想到颜色)来构建一个 trie。如果您将 300x300 的图像缩小为 5x5 的正方形,然后将每个 5x5 的正方形分解为一系列颜色,您可以从结果数据中构建一个 trie。如果一个 2x2 正方形包含:
FFFFFF|000000|FDFD44|FFFFFF
我们有一个相当独特的 trie 代码,可以扩展 24 个级别,增加/减少级别(IE 减少/增加我们的子方块的大小)可能会产生更准确的结果。
比较 trie 树应该相当容易,并且可能提供有效的结果。
更多想法
我偶然发现了一篇关于classification of satellite imagery 的有趣论文,它概述了:
考虑的纹理测量包括:共现矩阵、灰度级差异、纹理色调分析、从傅里叶光谱派生的特征和 Gabor 滤波器。一些傅里叶特征和一些 Gabor 滤波器被发现是不错的选择,尤其是在使用单个频带进行分类时。
可能值得更详细地研究这些测量值,尽管其中一些可能与您的数据集无关。
其他需要考虑的事项
可能有很多关于这类事情的论文,所以阅读其中的一些应该会有所帮助,尽管它们可能非常技术性。这是计算中一个极其困难的领域,许多人试图做类似的事情花费了许多徒劳无功的工作。保持简单并以这些想法为基础将是最好的方法。创建一个比随机匹配率更好的算法应该是一个相当困难的挑战,并且开始改进它确实开始变得相当难以实现。
每种方法都可能需要彻底测试和调整,如果您有任何关于您将要检查的图片类型的信息,这将很有用。例如广告,其中许多都会包含文本,因此进行文本识别将是一种简单且可能非常可靠的查找匹配项的方法,尤其是与其他解决方案结合使用时。如前所述,尝试利用数据集的共同属性。
结合可以进行加权投票的替代测量和技术(取决于它们的有效性)将是您创建一个生成更准确结果的系统的一种方式。
如果采用多种算法,如本答案开头所述,可能会发现所有的阳性结果,但误报率为 20%,研究其他算法的属性/优势/劣势将是有意义的另一种算法可能有效地消除从另一个返回的误报。
小心不要陷入尝试完成永无止境的项目,祝你好运!