鉴于两个不同的图像文件(我选择的任何格式),我需要编写一个程序来预测一个程序是否是另一个的非法副本.副本的作者可以执行诸如旋转,制作否定或添加琐碎细节(以及更改图像的尺寸)之类的内容.
你知道做这种工作的算法吗?
这些只是我一直在思考这个问题的想法,从未尝试过,但我喜欢考虑这样的问题!
在你开始之前
考虑标准化的图片,如果一个比另一个更高的分辨率,考虑选项,其中一个是另一个的压缩版本,因此缩放分辨率下可以提供更精确的结果.
考虑扫描图像的各种预期区域,这些区域可以表示图像的缩放部分以及各种位置和旋转.如果图像的一个是另一个的倾斜版本它开始变得非常棘手,这是那种你应该找出和妥协的限制.
Matlab是一种用于测试和评估图像的出色工具.
测试算法
您应该(至少)测试一组人类分析的大型测试数据,其中事先已知匹配.例如,如果您的测试数据中有1000个图像,其中5%匹配,那么您现在拥有一个相当可靠的基准.找到10%阳性的算法不如在我们的测试数据中找到4%阳性的算法好.然而,一个算法可能会发现所有的比赛,但也有一个巨大的20%,假阳性率,所以有几种方法来评价你的算法.
测试数据应该尝试设计涵盖多种类型的动力尽可能的,你会期望在现实世界中找到.
重要的是要注意每个有用的算法必须比随机猜测更好,否则它对我们没用!
然后,您可以以受控方式将软件应用到现实世界中,并开始分析其生成的结果.这是一种可以无限制地进行的软件项目,总是可以进行调整和改进,在设计它时要记住这一点很重要,因为很容易陷入永无止境的项目的陷阱.
彩色桶
使用两张图片,扫描每个像素并计算颜色.例如,你可能有'桶':
white red blue green black
(显然你会有更高的计数器分辨率).每次找到"红色"像素时,都会增加红色计数器.每个桶都可以代表颜色的光谱,分辨率越高越精确,但你应该尝试一个可接受的差异率.
获得总计后,将其与第二张图像的总计进行比较.您可能会发现每个图像都具有相当独特的足迹,足以识别匹配.
边缘检测
如何使用边缘检测. alt text http://upload.wikimedia.org/wikipedia/en/thumb/8/8e/EdgeDetectionMathematica.png/500px-EdgeDetectionMathematica.png
通过两个相似的图片边缘检测应该为您提供可用且相当可靠的独特足迹.
拍摄两张照片,然后应用边缘检测.也许测量边缘的平均厚度,然后计算图像缩放的概率,并在必要时重新缩放.以下是在各种旋转中应用的Gabor滤波器(一种边缘检测)的示例.
比较像素的像素,计算匹配和非匹配.如果它们在某个错误阈值内,则表示您匹配.否则,您可以尝试将分辨率降低到某个点,然后查看匹配概率是否会提高.
感兴趣的区域
一些图像可能具有独特的感兴趣区段/区域.这些区域可能与图像的其余部分高度对比,并且是在其他图像中搜索以查找匹配的好项目.以此图片为例:
alt text http://meetthegimp.org/wp-content/uploads/2009/04/97.jpg
蓝色的建筑工人是感兴趣的区域,可以用作搜索对象.您可以通过多种方式从此感兴趣区域中提取属性/数据,并使用它们来搜索数据集.
如果您有超过2个感兴趣的区域,您可以测量它们之间的距离.举个简单的例子:
alt text http://www.per2000.eu/assets/images/3_dots_black_03.jpg
我们有3个明确的感兴趣区域.区域1和2之间的距离可以是200个像素,1到3 400个像素之间,以及2和3 200个像素.
搜索其他类似感兴趣区域的图像,对距离值进行标准化,看看是否有潜在的匹配.这种技术可以很好地适用于旋转和缩放的图像.您拥有的感兴趣区域越多,匹配的概率就会随着每个距离测量的匹配而增加.
考虑数据集的上下文非常重要.例如,如果您的数据集是现代艺术,那么感兴趣的区域将非常有效,因为感兴趣的区域可能被设计为最终图像的基本部分.但是,如果您正在处理建筑工地的图像,非法复印机可能会将感兴趣的区域解释为丑陋,并且可能会被大量裁剪/编辑.请记住数据集的常用功能,并尝试利用该知识.
变形
变形两个图像是通过一系列步骤将一个图像转换为另一个图像的过程:
请注意,这与将一个图像淡入另一个图像有所不同!
有许多软件包可以变形图像.它传统上被用作过渡效果,两个图像通常不会变成中间的东西,一个极端变成另一个极端作为最终结果.
为什么这有用呢?根据您使用的变形算法,图像的相似性和变形算法的某些参数之间可能存在关系.
在一个非常简化的示例中,当要进行的更改较少时,一种算法可能会执行得更快.然后我们知道这两个图像彼此共享属性的可能性更高.
这种技术可以很好地适用于旋转,扭曲,倾斜,缩放,所有类型的复制图像.再一次,这只是我所拥有的一个想法,据我所知,它不是基于任何研究的学术界(虽然我看起来并不那么努力),所以对于你来说可能有很多工作,但结果有限/没有.
荏苒
Ow在这个问题上的答案非常好,我记得读过这些研究人工智能的技巧.它在比较语料库词汇方面非常有效.
比较语料库时的一个有趣的优化是你可以删除被认为太常见的词,例如'The','A','And'等等.这些词语淡化了我们的结果,我们想弄清楚两个语料库有多么不同所以这些可以在处理之前删除.也许在图像中有类似的常见信号可以在压缩之前剥离?可能值得研究.
压缩比是确定两组数据相似程度的一种非常快速且合理有效的方法.阅读有关压缩如何工作的信息,可以让您清楚地了解为什么压缩效果如此有效.对于快速释放算法,这可能是一个很好的起点.
透明度
同样,我不确定如何为某些图像类型(gif png等)存储透明度数据,但这将是可提取的,并且可以作为有效的简化剪切与您的数据集透明度进行比较.
反转信号
图像只是一个信号.如果您从扬声器发出噪音,并且您在另一个扬声器中以相同音量完美同步播放相反的噪音,它们会相互抵消.
替代文字http://www.themotorreport.com.au/wp-content/uploads/2008/07/noise-cancellation.gif
反转图像,并将其添加到其他图像上.重复缩放它/循环位置,直到找到一个结果图像,其中足够的像素是白色(或黑色?我将其称为中性画布),为您提供正匹配或部分匹配.
但是,请考虑两个相同的图像,除了其中一个图像应用了亮度效果:
倒置其中一个,然后将它添加到另一个将不会产生中性画布,这是我们的目标.然而,当比较两个原始图像的像素时,我们可以明确地看到两者之间的明确关系.
我现在已经研究了几年颜色了,并且不确定色谱是否在线性刻度上,但是如果你确定了两个图片之间色差的平均因子,你可以使用这个值来规范化数据.这种技术.
树数据结构
起初这些似乎不适合这个问题,但我认为它们可以起作用.
您可以考虑提取图像的某些属性(例如颜色箱)并生成霍夫曼树或类似的数据结构.您可以比较两棵树的相似性.这对于摄影数据不适用,例如具有大范围的颜色,但是卡通或其他减少的颜色设置图像可能起作用.
这可能不起作用,但这是一个想法.在特里数据结构的存储词典是很大的,例如dictionarty.这是一个前缀树.也许有可能建立一个相当于词典的图像(我只能想到颜色)来构造一个特里.如果您将300x300图像缩小为5x5正方形,则将每个5x5正方形分解为一系列颜色,您可以根据结果数据构建一个trie.如果2x2方格包含:
FFFFFF|000000|FDFD44|FFFFFF
我们有一个相当独特的trie代码,扩展了24个级别,增加/减少级别(IE减少/增加子方块的大小)可以产生更准确的结果.
比较特里树应该相当容易,并且可以提供有效的结果.
更多想法
我偶然发现了一篇关于卫星图像分类的有趣文章,它概述了:
考虑的纹理测量是:共生矩阵,灰度差异,纹理色调分析,从傅里叶谱得到的特征,以及Gabor滤波器.发现一些傅立叶特征和一些Gabor滤波器是很好的选择,特别是当使用单个频带进行分类时.
可能值得更详细地研究这些测量值,尽管其中一些可能与您的数据集无关.
其他需要考虑的事情
关于这类事情可能有很多论文,所以阅读其中一些应该有所帮助,尽管它们可能非常技术性.这是一个非常困难的计算领域,许多人试图做类似的事情花费了许多无用的工作时间.保持简单并以这些想法为基础将是最好的方法.创建一个比随机匹配率更好的算法应该是一个相当困难的挑战,并且开始改进它确实开始变得非常难以实现.
每种方法都可能需要进行彻底的测试和调整,如果您有任何关于您将要检查的图片类型的信息,这将是有用的.例如广告,其中许多将在其中包含文本,因此进行文本识别将是一种简单且可能非常可靠的查找匹配的方式,尤其是当与其他解决方案结合时.如前所述,尝试利用数据集的常用属性.
将可以进行加权投票(取决于其有效性)的替代测量和技术相结合将是创建能够生成更准确结果的系统的一种方法.
如果采用多种算法,如本答案的开头所述,人们可能会发现所有的积极因素但误报率为20%,那么研究其他算法的属性/优势/弱点是有意义的,因为另一种算法可能有效消除他人返回的误报.
小心不要试图完成永无止境的项目,祝你好运!
阅读论文:Porikli,Fatih,Oncel Tuzel和Peter Meer."基于黎曼流形上的均值模型更新的协方差跟踪".(2006)IEEE计算机视觉和模式识别.
我成功地使用本文介绍的技术检测从相邻网络摄像头捕获的图像中的重叠区域.我的协方差矩阵由Sobel,canny和SUSAN方面/边缘检测输出以及原始灰度像素组成.
一个主意:
使用关键点检测器来查找图像中某些点的比例和变换不变量描述符(例如SIFT,SURF,GLOH或LESH).
尝试将关键点与两个图像中的相似描述符对齐(如在全景拼接中),如果需要,允许一些图像变换(例如缩放和旋转,或弹性拉伸).
如果许多关键点对齐良好(存在这样的变换,关键点对齐误差很低;或者变换"能量"很低等),您可能会有类似的图像.
第2步并非无足轻重.特别是,您可能需要使用智能算法在另一个图像上查找最相似的关键点.点描述符通常是非常高维的(如一百个参数),并且有许多要点可以查看.kd-trees在这里可能很有用,哈希查找不能很好地工作.
变种:
检测边缘或其他特征而不是点.
它确实不像看起来那么简单:-)尼克的建议很好.
要开始使用,请记住,任何有价值的比较方法基本上都可以通过将图像转换为不同的形式来实现 - 这种形式可以更容易地选择相似的功能.通常情况下,这些东西不能用于非常轻松的阅读...
我能想到的最简单的例子之一就是使用每个图像的颜色空间.如果两个图像具有高度相似的颜色分布,那么您可以合理地确定它们显示相同的东西.至少,你可以有足够的确定性来标记它,或做更多的测试.比较色彩空间中的图像也会抵制诸如旋转,缩放和一些裁剪之类的事情.当然,它不会抵抗图像的重大修改或重度重新着色(甚至简单的色调偏移也会有些棘手).
http://en.wikipedia.org/wiki/RGB_color_space
http://upvector.com/index.php?section=tutorials&subsection=tutorials/colorspace
另一个例子涉及一个叫做Hough变换的东西.该变换基本上将图像分解为一组线.然后,您可以在每张图像中选取一些"最强"的线条,看看它们是否排成一行.你可以做一些额外的工作来尝试和补偿旋转和缩放 - 在这种情况下,因为比较几行计算工作比对整个图像做同样多的计算工作 - 它不会那么糟糕.
http://homepages.inf.ed.ac.uk/amos/hough.html
http://rkb.home.cern.ch/rkb/AN16pp/node122.html
http://en.wikipedia.org/wiki/ Hough_transform
您需要使用水印方案将代码嵌入到图像中.为了退后一步,与某些人提出的一些低级方法(边缘检测等)相反,水印方法更优越,因为:
它可抵抗信号处理攻击►信号增强 - 锐化,对比度等.►滤波 - 中值,低通,高通等.►加性噪声 - 高斯,均匀等►有损压缩 - JPEG,MPEG等
它抵抗几何攻击►仿射变换►数据缩减 - 裁剪,裁剪等►随机局部扭曲►变形
对水印算法进行一些研究,您将走上解决问题的正确道路.(注意:您可以使用STIRMARK数据集对方法进行基准测试.这是此类应用程序的公认标准.
这只是一个建议,它可能不起作用,我准备被召唤.
这将产生误报,但希望不是假阴性.
调整两个图像的大小,使它们的大小相同(我假设两个图像中宽度与长度的比例相同).
使用无损压缩算法(例如gzip)压缩两个图像的位图.
查找具有相似文件大小的文件对.例如,您可以根据文件大小的相似性对每个文件对进行排序,并检索顶部X.
正如我所说,这肯定会产生误报,但希望不是假阴性.您可以在五分钟内实现这一点,而Porikil等.人.可能需要大量的工作.