算法来比较两个图像
给定两个不同的图像文件(以我选择的任何格式),我需要编写一个程序来预测其中一个是另一个非法副本的机会。 副本的作者可能会执行诸如旋转,制作否定或添加微不足道的细节(以及更改图像的尺寸)。
你知道任何算法来做这种工作吗?
这些只是我想过这个问题的想法,从来没有尝试过,但我喜欢考虑这样的问题!
在你开始之前
考虑对图片进行标准化,如果图片的分辨率高于其他图片,请考虑选择其中一张是另一张的压缩版本,因此缩小分辨率可能会提供更准确的结果。
考虑扫描图像中可能代表图像缩放部分以及各种位置和旋转的各种预期区域。 如果其中一个图像是另一个图像的偏斜版本,它会变得棘手,这些都是您应该识别和妥协的限制。
Matlab是测试和评估图像的极好工具。
测试算法
您应该测试(至少)预先知道匹配的大型人类分析测试数据集。 例如,如果您的测试数据中有1,000个图像,其中5%匹配,则您现在拥有合理可靠的基准。 发现10%肯定结果的算法不如在我们的测试数据中找到4%肯定结果的算法。 然而,一种算法可能会找到所有匹配,但也有20%的误报率,所以有几种方法可以对算法进行评估。
测试数据应该试图设计成涵盖您希望在现实世界中找到的尽可能多的动态类型。
注意每个算法的有用性必须比随机猜测更好,否则对我们来说是无用的!
然后,您可以以受控的方式将您的软件应用到真实世界中,并开始分析它产生的结果。 这是一种软件项目,可以无限期地进行,总是可以做出调整和改进,在设计软件时考虑到这一点很重要,因为它很容易陷入永无止境的项目陷阱中。
颜色桶
用两张图片扫描每个像素并计算颜色。 例如,你可能有'桶':
white
red
blue
green
black
(显然你会有更高的计数器分辨率)。 每次找到“红色”像素时,都会增加红色计数器。 每个桶可以代表色谱,分辨率越高越准确,但您应该尝试一个可接受的差异率。
一旦你有你的总数,比较它与第二个图像的总数。 您可能会发现每个图像都有相当独特的足迹,足以识别匹配。
边缘检测
如何使用边缘检测。 替代文字http://upload.wikimedia.org/wikipedia/en/thumb/8/8e/EdgeDetectionMathematica.png/500px-EdgeDetectionMathematica.png
有了两张相似的图片,边缘检测应该为您提供可用且相当可靠的独特占位面积。
拍两张照片,并应用边缘检测。 也许测量边缘的平均厚度,然后计算图像缩放的概率,并在必要时重新缩放。 以下是在各种旋转中应用的Gabor滤波器(一种边缘检测)的示例。
比较像素的像素像素,计数匹配和不匹配。 如果他们在一定的误差范围内,你就有一场比赛。 否则,您可以尝试将分辨率降低到某一点,并查看匹配的可能性是否提高。
感兴趣的地区
某些图像可能有不同的细分/感兴趣区域。 这些区域可能与图像的其他部分形成高度对比,并且是在其他图像中搜索以找到匹配的好项目。 以此图像为例:
替代文字http://meetthegimp.org/wp-content/uploads/2009/04/97.jpg
蓝色的建筑工人是一个感兴趣的区域,可以用作搜索对象。 可能有几种方法可以从这个感兴趣的区域提取属性/数据并使用它们来搜索您的数据集。
如果您有两个以上的兴趣区域,则可以测量它们之间的距离。 以这个简化的例子:
替代文字http://www.per2000.eu/assets/images/3_dots_black_03.jpg
我们有3个明确的兴趣区域。 区域1和2之间的距离可以是200像素,1和3 400像素之间以及2和3 200像素之间。
在其他图像中搜索相似的感兴趣区域,对距离值进行标准化并查看是否有潜在匹配。 这种技术可以很好地适用于旋转和缩放图像。 你有更多的兴趣区域,匹配的概率随着每个距离测量的匹配而增加。
考虑数据集的上下文很重要。 例如,如果您的数据集是现代艺术品,那么感兴趣的区域将会工作得很好,因为感兴趣的区域可能被设计为最终图像的基本部分。 但是,如果您正在处理施工现场的图像,那么感兴趣的地区可能会被非法复印机解读为丑陋,并且可能会被自由裁剪/编辑。 记住数据集的共同特征,并尝试利用这些知识。
变形
变形两幅图像是通过一系列步骤将一幅图像变成另一幅图像的过程:
请注意,这与将一个图像淡入另一个不同!
有许多可以变形图像的软件包。 传统上它被用作过渡效果,两幅图像通常不会变成某种东西,一种极端变成另一种极端,作为最终结果。
为什么这可能有用? 根据您使用的变形算法,图像的相似度与变形算法的一些参数之间可能存在关联。
在一个非常简化的例子中,一个算法可能会在执行更少的更改时执行得更快。 然后我们知道这两个图像彼此共享属性的可能性较高。
这项技术可以很好地适用于旋转,扭曲,倾斜,缩放以及所有类型的复制图像。 再次,这仅仅是我的一个想法,它不是基于任何研究的学术界,据我所知(我还没有看起来很难),所以对于你来说可能是很多工作,而且结果有限/没有结果。
荏苒
Ow在这个问题上的回答非常好,我记得读过关于这些学习AI的技巧。 它在比较语料库词典时非常有效。
在比较语料时,一个有趣的优化是可以删除被认为太常见的词,例如'The','A','And'等。这些词淡化了我们的结果,我们想弄清楚两个语料库有多不同所以这些可以在处理之前被移除。 也许图像中存在类似的常见信号,可能会在压缩之前被剥离? 这可能值得深入研究。
压缩比是确定两组数据相似程度的一种非常快速和合理有效的方法。 阅读压缩的工作原理会给你一个很好的想法,为什么这可能是如此有效。 对于快速发布算法,这可能是一个很好的起点。
透明度
再次我不确定如何为某些图像类型,gif png等存储透明度数据,但这是可以提取的,并且可以作为与您的数据集透明度进行比较的有效简化裁剪。
反转信号
图像只是一个信号。 如果您从扬声器播放噪音,并以完全相同的音量在另一个扬声器中播放完全同步的相反噪音,则它们会互相抵消。
替代文字http://www.themotorreport.com.au/wp-content/uploads/2008/07/noise-cancellation.gif
翻转图像,并将其添加到其他图像上。 反复缩放/循环位置,直到找到像素为白色(或黑色?我将其称为中性画布)的结果图像,以便为您提供正匹配或部分匹配。
但是,考虑两个相同的图像,除了其中一个图像具有明亮效果:
颠倒其中一个,然后将其添加到另一个不会导致我们正在瞄准的中性画布。 但是,在比较两张原始图像的像素时,我们可以明确地看到两者之间的明确关系。
我现在还没有研究过几年的颜色,并且我不确定色谱是否在线性范围内,但是如果您确定了两个图片之间色差的平均因子,则可以使用此值在处理之前对数据进行归一化这种技术。
树数据结构
起初这些似乎不适合这个问题,但我认为他们可以工作。
您可以考虑提取图像的某些属性(例如颜色箱)并生成huffman树或类似的数据结构。 您可能能够比较两棵树的相似性。 这对于例如具有大范围颜色的照片数据来说效果不佳,但是这可能起作用的卡通或其他缩小的彩色设置图像。
这可能不起作用,但这是一个想法。 特里数据结构非常适合存储词典,例如dictionarty。 它是一个前缀树。 也许有可能建立一个相当于一个词典的图像(再次,我只能想到颜色)来构建一个树状结构。 如果您将300x300的图像缩减为5x5的正方形,然后将每个5x5的正方形分解为一系列颜色,您可以从结果数据中构建一个树状图。 如果一个2x2正方形包含:
FFFFFF|000000|FDFD44|FFFFFF
我们有一个相当独特的特里代码,可以扩展24个级别,增加/减少级别(IE减少/增加我们的子平方的大小)可能会产生更准确的结果。
比较树木应该相当容易,并且可以提供有效的结果。
更多的想法
我偶然发现了一篇关于卫星图像分类的有趣的论文,它概述了:
考虑的纹理测量是:共生矩阵,灰度差异,纹理色调分析,从傅里叶谱导出的特征以及Gabor滤波器。 一些傅里叶特征和一些Gabor滤波器被认为是很好的选择,特别是当使用单一频带进行分类时。
尽管其中一些可能与您的数据集无关,但可能需要更详细地调查这些测量结果。
其他事情要考虑
关于这类事情可能有很多论文,所以阅读其中的一些应该会有所帮助,尽管他们可能技术性很强。 这是一个非常困难的计算领域,许多人试图做类似的事情花了许多没有成果的工作时间。 保持简单并建立在这些想法之上是最好的方法。 创建一个比随机匹配更好的算法应该是一个相当困难的挑战,并且开始改进,真的开始变得很难实现。
每种方法都可能需要进行彻底的测试和调整,如果你有任何关于你将要检查的图片类型的信息,这将是有用的。 例如广告,其中很多会有文字,因此进行文字识别将是寻找匹配的一种简单且可能非常可靠的方式,尤其是在与其他解决方案结合使用时。 如前所述,尝试利用数据集的通用属性。
结合各种可以进行加权投票(取决于它们的有效性)的替代测量和技术将是您可以创建产生更准确结果的系统的一种方式。
如果采用多种算法,正如在答案开始时提到的那样,可以找到所有的肯定结果,但是假阳性率为20%,研究其他算法的性能/优势/弱点是有趣的,因为另一种算法可能会能有效地消除从另一个返回的误报。
小心不要试图完成永无止境的项目,祝你好运!
阅读论文: Porikli,Fatih,Oncel Tuzel和Peter Meer。 “基于黎曼流形上的模型更新的协方差跟踪”。 (2006)IEEE计算机视觉和模式识别。
使用本文介绍的技术,我成功地检测到了从相邻摄像头捕获的图像中的重叠区域。 我的协方差矩阵由Sobel,Canny和SUSAN方面/边缘检测输出以及原始灰度像素组成。
一个主意:
步骤2不是微不足道的。 特别是,您可能需要使用智能算法来查找其他图像上最相似的关键点。 点描述通常是非常高维的(比如一百个参数),并且有很多要查看的点。 kd-trees在这里可能很有用,哈希查找不能很好地工作。
变种:
上一篇: Algorithm to compare two images
下一篇: Set Fragment height programmatically according to existing elements