首页 文章

比较两个图像的算法

提问于
浏览
153

鉴于两个不同的图像文件(我选择的任何格式),我需要编写一个程序来预测一个程序是否是另一个的非法副本 . 副本的作者可以执行诸如旋转,制作否定或添加琐碎细节(以及更改图像的尺寸)之类的内容 .

你知道做这种工作的算法吗?

9 回答

  • 290

    这些只是我一直在思考这个问题的想法,从未尝试过,但我喜欢考虑这样的问题!

    Before you begin

    考虑对图像进行标准化,如果图像的分辨率高于另一个,则考虑其中一个是另一个的压缩版本的选项,因此缩小分辨率可能会提供更准确的结果 .

    考虑扫描图像的各种预期区域,这些区域可以表示图像的缩放部分以及各种位置和旋转 . 如果其中一个图像是另一个图像的偏斜版本,它开始变得棘手,这些是您应该识别和妥协的那种限制 .

    Matlab是用于测试和评估图像的出色工具 .

    Testing the algorithms

    您应该(至少)测试一组人类分析的大型测试数据,其中事先已知匹配 . 例如,如果您的测试数据中有1000个图像,其中5%匹配,那么您现在拥有一个相当可靠的基准 . 找到10%阳性的算法不如在我们的测试数据中找到4%阳性的算法好 . 但是,一种算法可能会找到所有匹配项,但也有大20%的误报率,因此有几种方法可以对算法进行评级 .

    测试数据应该尝试设计为涵盖您希望在现实世界中找到的尽可能多的动力学类型 .

    重要的是要注意每个有用的算法必须比随机猜测更好,否则它对我们没用!

    然后,您可以以受控方式将软件应用到现实世界中,并开始分析其生成的结果 . 这是一种可以无限制地进行的软件项目,总是可以进行调整和改进,在设计它时要记住这一点很重要,因为很容易陷入永无止境的项目的陷阱 .

    Colour Buckets

    使用两张图片,扫描每个像素并计算颜色 . 例如,你可能有'桶':

    white
    red
    blue
    green
    black
    

    (显然你会有更高的计数器分辨率) . 每次找到“红色”像素时,都会增加红色计数器 . 每个桶都可以代表颜色的光谱,分辨率越高越精确,但你应该尝试一个可接受的差异率 .

    获得总计后,将其与第二张图像的总计进行比较 . 您可能会发现每个图像都具有相当独特的足迹,足以识别匹配 .

    Edge detection

    如何使用Edge Detection . alt text http://upload.wikimedia.org/wikipedia/en/thumb/8/8e/EdgeDetectionMathematica.png/500px-EdgeDetectionMathematica.png

    通过两个相似的图片边缘检测应该为您提供可用且相当可靠的独特足迹 .

    拍摄两张照片,然后应用边缘检测 . 也许测量边缘的平均厚度,然后计算图像缩放的概率,并在必要时重新缩放 . 以下是在各种旋转中应用的Gabor Filter(一种边缘检测)的示例 .

    alt text

    比较像素的像素,计算匹配和非匹配 . 如果它们在某个错误阈值内,则表示您匹配 . 否则,您可以尝试将分辨率降低到某个点,然后查看匹配概率是否会提高 .

    Regions of Interest

    一些图像可能具有独特的感兴趣区段/区域 . 这些区域可能与图像的其余部分高度对比,并且是在其他图像中搜索以查找匹配的好项目 . 以此图片为例:

    alt text http://meetthegimp.org/wp-content/uploads/2009/04/97.jpg

    蓝色的建筑 Worker 是感兴趣的区域,可以用作搜索对象 . 您可以通过多种方式从此感兴趣区域中提取属性/数据,并使用它们来搜索数据集 .

    如果您有超过2个感兴趣的区域,您可以测量它们之间的距离 . 举个简单的例子:

    alt text http://www.per2000.eu/assets/images/3_dots_black_03.jpg

    我们有3个明确的感兴趣区域 . 区域1和2之间的距离可以是200个像素,1到3 400个像素之间,以及2和3 200个像素 .

    搜索其他类似感兴趣区域的图像,对距离值进行标准化,看看是否有潜在的匹配 . 这种技术可以很好地适用于旋转和缩放图片 . 您拥有的感兴趣区域越多,匹配的概率就会随着每个距离测量的匹配而增加 .

    考虑数据集的上下文非常重要 . 例如,如果您的数据集是现代艺术,那么感兴趣的区域将非常有效,因为感兴趣的区域可能被设计为最终图像的基本部分 . 但是,如果您正在处理建筑工地的图像,非法复印机可能会将感兴趣的区域解释为丑陋,并且可能会被大量裁剪/编辑 . 请记住数据集的常用功能,并尝试利用该知识 .

    Morphing

    Morphing两个图像是通过一系列步骤将一个图像转换为另一个图像的过程:

    alt text

    请注意,这与将一个图像淡入另一个图像有所不同!

    有许多软件包可以变形图像 . 它传统上被用作过渡效果,两个图像通常不会变成中间的东西,一个极端变成另一个极端作为最终结果 .

    为什么这有用呢?根据您使用的变形算法,图像的相似性和变形算法的某些参数之间可能存在关系 .

    在一个非常简化的示例中,当要进行的更改较少时,一种算法可能会执行得更快 . 然后我们知道这两个图像彼此共享属性的可能性更高 .

    这种技术可以很好地适用于旋转,扭曲,倾斜,缩放,所有类型的复制图像 . 再一次,这只是我所拥有的一个想法,虽然看起来很难),所以对于你来说可能会有很多工作,但结果有限/没有 .

    Zipping

    Ow在这个问题上的答案非常好,我记得读过这些研究人工智能的技巧 . 它在比较语料库词汇方面非常有效 .

    比较语料库时的一个有趣的优化是你可以删除被认为太常见的词,例如'The','A','And'等等 . 这些词语淡化了我们的结果,我们想弄清楚两个语料库有多么不同所以这些可以在处理之前删除 . 也许在图像中有类似的常见信号可以在压缩之前剥离?可能值得研究 .

    压缩比是确定两组数据相似程度的一种非常快速且合理有效的方法 . 阅读how compression works将会让你知道为什么这么有效 . 对于快速释放算法,这可能是一个很好的起点 .

    Transparency

    同样,我不确定如何为某些图像类型(gif png等)存储透明度数据,但这将是可提取的,并且可以作为有效的简化剪切与您的数据集透明度进行比较 .

    Inverting Signals

    图像只是一个信号 . 如果您从扬声器发出噪音,并且您在另一个扬声器中以相同音量完美同步播放相反的噪音,它们会相互抵消 .

    alt text http://www.themotorreport.com.au/wp-content/uploads/2008/07/noise-cancellation.gif

    反转图像,并将其添加到其他图像上 . 重复缩放它/循环位置,直到找到一个结果图像,其中足够的像素是白色(或黑色?我将其称为中性画布),为您提供正匹配或部分匹配 .

    但是,请考虑两个相同的图像,除了其中一个图像应用了亮度效果:

    alt text

    倒置其中一个,然后将它添加到另一个将不会产生中性画布,这是我们的目标 . 然而,当比较两个原始图像的像素时,我们可以明确地看到两者之间的明确关系 .

    我现在已经研究了几年颜色了,并且不确定色谱是否在线性刻度上,但是如果你确定了两个图片之间色差的平均因子,你可以使用这个值来规范化数据 . 这种技术 .

    Tree Data structures

    起初这些似乎不适合这个问题,但我认为它们可以起作用 .

    您可以考虑提取图像的某些属性(例如颜色区)并生成huffman tree或类似的数据结构 . 您可以比较两棵树的相似性 . 这对于摄影数据不适用,例如具有大范围的颜色,但是卡通或其他减少的颜色设置图像可能起作用 .

    这可能不是一个想法 . trie datastructure非常适合存储词典,例如词典 . 它可以构建相当于词典的图像,(我只能想到 . )构造一个特里 . 如果您将300x300图像缩小为5x5正方形,则将每个5x5正方形分解为一系列颜色,您可以根据结果数据构建一个trie . 如果2x2方格包含:

    FFFFFF|000000|FDFD44|FFFFFF
    

    我们有一个相当独特的trie代码,扩展了24个级别,增加/减少级别(IE减少/增加子方块的大小)可以产生更准确的结果 .

    比较特里树应该相当容易,并且可以提供有效的结果 .

    More ideas

    我偶然发现了一篇关于classification of satellite imagery的有趣文章,它概述了:

    考虑的纹理测量是:共生矩阵,灰度差异,纹理色调分析,从傅立叶光谱得到的特征,以及Gabor滤波器 . 发现一些傅立叶特征和一些Gabor滤波器是很好的选择,特别是当使用单个频带进行分类时 .

    可能值得更详细地研究这些测量值,尽管其中一些可能与您的数据集无关 .

    Other things to consider

    关于这类事情可能有很多论文,所以阅读其中一些应该有所帮助,尽管它们可能非常技术性 . 这是一个非常困难的计算领域,许多人试图做类似的事情花费了许多无用的工作时间 . 保持简单并以这些想法为基础将是最好的方法 . 创建一个比随机匹配率更好的算法应该是一个相当困难的挑战,并且开始改进它确实开始变得非常难以实现 .

    每种方法都可能需要进行彻底的测试和调整,如果您有任何关于您将要检查的图片类型的信息,这将是有用的 . 例如广告,其中许多将在其中包含文本,因此进行文本识别将是一种简单且可能非常可靠的查找匹配的方式,尤其是当与其他解决方案结合时 . 如前所述,尝试利用数据集的常用属性 .

    将可以进行加权投票(取决于其有效性)的替代测量和技术相结合将是创建能够生成更准确结果的系统的一种方法 .

    如果采用多种算法,如本答案的开头所述,人们可能会发现所有的积极因素但误报率为20%,那么研究其他算法的属性/优势/弱点是有意义的,因为另一种算法可能有效消除他人返回的误报 .

    小心不要试图完成永无止境的项目,祝你好运!

  • 0

    阅读论文:Porikli, Fatih, Oncel Tuzel, and Peter Meer. “Covariance Tracking Using Model Update Based on Means on Riemannian Manifolds”. (2006) IEEE Computer Vision and Pattern Recognition.

    我成功地使用本文介绍的技术检测从相邻网络摄像头捕获的图像中的重叠区域 . 我的协方差矩阵由Sobel,canny和SUSAN方面/边缘检测输出以及原始灰度像素组成 .

  • 15

    一个主意:

    • 使用关键点检测器来查找图像中某些点的比例和变换不变量描述符(例如SIFT,SURF,GLOH或LESH) .

    • 尝试将关键点与来自两个图像的相似描述符对齐(如在全景拼接中),如果需要允许一些图像变换(例如缩放和旋转,或弹性拉伸) .

    • 如果许多关键点对齐良好(存在此类转换,关键点对齐错误较低;或转换"energy"较低等),您可能会有类似的图像 .

    第2步并非无足轻重 . 特别是,您可能需要使用智能算法在另一个图像上查找最相似的关键点 . 点描述符通常是非常高维的(如一百个参数),并且有许多要点可以查看 . kd-trees在这里可能很有用,哈希查找不能很好地工作 .

    变种:

    • 检测边缘或其他特征而不是点 .
  • 8

    它确实不像看起来那么简单:-)尼克的建议很好 .

    要开始使用,请记住,任何有 Value 的比较方法基本上都可以通过将图像转换为不同的形式来实现 - 这种形式可以更容易地选择相似的功能 . 通常情况下,这些东西不适合阅读非常轻松......

    我能想到的最简单的例子之一就是使用每个图像的颜色空间 . 如果两个图像具有高度相似的颜色分布,那么您可以合理地确定它们显示相同的东西 . 至少,你可以有足够的把握标记它,或做更多测试 . 比较色彩空间中的图像也会抵制诸如旋转,缩放和一些裁剪之类的事情 . 当然,它不会抵抗图像的重大修改或重度重新着色(甚至简单的色调偏移也会有些棘手) .

    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

  • 32

    您需要使用水印方案将代码嵌入到图像中 . 为了退后一步,与某些人提出的一些低级方法(边缘检测等)相反,水印方法更优越,因为:

    它可抵抗信号处理攻击►信号增强 - 锐化,对比度等.►滤波 - 中值,低通,高通等.►加性噪声 - 高斯,均匀等►有损压缩 - JPEG,MPEG等

    它抵抗几何攻击►仿射变换►数据缩减 - 裁剪,裁剪等►随机局部扭曲►变形

    对水印算法进行一些研究,您将走上解决问题的正确道路 . (注意:您可以使用STIRMARK数据集对方法进行基准测试 . 这是此类应用程序的公认标准 .

  • 4

    这只是一个建议,它可能不起作用,我准备被召唤 .

    这将产生误报,但希望不是假阴性 .

    • 调整两个图像的大小,使它们的大小相同(我假设两个图像中宽度与长度的比例相同) .

    • 使用无损压缩算法(例如gzip)压缩两个图像的位图 .

    • 查找具有相似文件大小的文件对 . 例如,您可以根据文件大小的相似性对每个文件对进行排序,并检索顶部X.

    正如我所说,这肯定会产生误报,但希望不是假阴性 . 您可以在五分钟内实现这一点,而Porikil等 . 人 . 可能需要大量的工作 .

  • 34

    我相信如果你愿意将这种方法应用于每个可能的方向和负面版本,图像识别(具有良好的可靠性)的良好开端是使用特征脸:http://en.wikipedia.org/wiki/Eigenface

    另一个想法是将两个图像转换为其组件的向量 . 一个好方法是创建一个以x * y维度运算的向量(x是图像的宽度,y是高度),每个维度的值应用于(x,y)像素值 . 然后运行K-Nearest Neighbors的变体,有两个类别:匹配和不匹配 . 如果它足够接近原始图像,它将适合匹配类别,如果不是,那么它将不适合 .

    可以在这里找到K Nearest Neighbors(KNN),网上也有其他很好的解释:http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm

    KNN的好处是,与原始图像相比,变体越多,算法就越准确 . 缺点是您需要一个图像目录来首先训练系统 .

  • 5

    如果您愿意考虑采用不同的方法来检测图像的非法副本,您可以考虑watermarking . (从1.4开始)

    ...将版权信息插入数字对象而不会降低质量 . 只要数字对象的版权存在问题,就会提取此信息以识别合法所有者 . 还可以对原始购买者的身份以及版权所有者的身份进行编码,从而允许跟踪任何未经授权的拷贝 .

    虽然它也是一个复杂的领域,但有一些技术允许水印信息通过粗略的图像更改持续存在:(从1.9开始)

    ...合理强度的任何信号变换都不能去除水印 . 因此,一个愿意删除水印的海盗将不会成功,除非他们对文件进行过多的贬低以使其具有商业利益 .

    当然,常见问题解决方案要求实施这种方法:“......非常具有挑战性”,但如果您成功使用它,您会对图像是否为副本而不是百分比可能性有很高的信心 .

  • 1

    如果你正在运行Linux我会建议两个工具:

    align_image_stack from package hugin-tools - 是一个可以自动纠正旋转,缩放和其他失真的命令行程序(它主要用于合成HDR摄影,但也适用于视频帧和其他文档) . 更多信息:http://hugin.sourceforge.net/docs/manual/Align_image_stack.html

    compare from package imagemagick - 可以查找和计算两个图像中不同像素数量的程序 . 这是一个简洁的教程:http://www.imagemagick.org/Usage/compare/ uising -fuzz N%你可以增加容错 . N越高,误差容限越高,仍将两个像素计为相同 .

    align_image_stack应该校正任何偏移量,因此compare命令实际上有可能检测到相同的像素 .

相关问题