给定两个不同的图像文件(以我选择的任何格式),我需要编写一个程序来预测其中一个是另一个非法拷贝的机会。副本的作者可能会做一些事情,例如旋转、取反或添加微不足道的细节(以及更改图像的尺寸)。
您是否知道任何算法可以完成这种工作?
给定两个不同的图像文件(以我选择的任何格式),我需要编写一个程序来预测其中一个是另一个非法拷贝的机会。副本的作者可能会做一些事情,例如旋转、取反或添加微不足道的细节(以及更改图像的尺寸)。
您是否知道任何算法可以完成这种工作?
这些只是我思考问题时想到的一些想法,从未尝试过,但我喜欢思考这样的问题!
开始之前
考虑对图片进行归一化处理,如果其中一个分辨率比另一个高,请考虑其中一个是另一个的压缩版本,因此将分辨率缩小可能会提供更准确的结果。
考虑扫描图像的各个潜在区域,这些区域可以代表图像的缩放部分和不同的位置和旋转。如果其中一个图像是另一个图像的倾斜版本,则开始变得棘手,这就是您应该确定并妥协的限制条件。
Matlab是测试和评估图像的优秀工具。
测试算法
您应该测试(至少)一个大型人工分析的测试数据集,其中匹配已经预先知道。例如,在您的测试数据中,有1,000个图像,其中5%的图像匹配,那么您现在有了一个相当可靠的基准。找到10%正面结果的算法不如在我们的测试数据中找到4%正面结果的算法好。然而,一种算法可能会找到所有匹配项,但也可能有20%的误报率,因此有多种方法可以评估您的算法。
测试数据应尝试设计为涵盖您在现实世界中预期发现的尽可能多的动态类型。
需要注意的是,每个算法要有用,必须比随机猜测表现更好,否则对我们来说毫无用处!
你可以控制软件并开始分析其产生的结果,将软件应用于现实世界。这是一种可以无限制进行的软件项目,总有调整和改进的空间,设计时要牢记这一点,因为很容易陷入永无止境的项目陷阱。 颜色桶 使用两张图片,扫描每个像素并计算颜色数量。例如,你可能会有“桶”:white
red
blue
green
black
(显然,您将拥有更高分辨率的计数器)。每次找到“红色”像素时,都会增加红色计数器。每个桶可以代表颜色光谱,分辨率越高越准确,但应尝试使用可接受的差异率。
一旦您获得了总数,请将其与第二个图像的总数进行比较。您可能会发现每个图像具有相当独特的足迹,足以识别匹配项。
边缘检测
如何使用边缘检测。
(来源:wikimedia.org)
对于两张相似的图片,边缘检测应该会提供一个可用且相当可靠的独特足迹。
取两张图片,应用边缘检测。也许测量边缘的平均厚度,然后计算图像可以缩放的概率,并在必要时重新缩放。下面是应用Gabor滤波器(一种边缘检测类型)的各种旋转的示例。
压缩比是一种非常快速且相对有效的确定两组数据相似性的方法。了解压缩如何工作将让您对为什么这可能非常有效有一个好的想法。对于一个快速发布的算法,这可能是一个很好的起点。
透明度
同样我不确定透明度数据如何存储某些图像类型,gif png等,但这将是可提取的,并可用作简化剪切来与您的数据集透明度进行比较的有效工具。
信号反转
图像只是一个信号。如果您从扬声器播放噪音,并在完美同步下以完全相同的音量播放相反的噪音,则它们会互相抵消。
反转其中一幅图像,并将其添加到另一幅图像上。重复缩放/循环位置,直到找到足够多的像素为白色(或黑色?我将其称为中性画布),以为您提供正面匹配或部分匹配。
然而,请考虑两个图像,它们相等,除了其中一个应用了明亮的效果:
(来源: mcburrz.com)
将其中一个图片反转,然后加到另一个图片上,并不能得到我们想要的中性画布。但是,当比较两个原始图像的像素时,我们可以明显看到两者之间存在着明显的关系。
我已经好几年没有学习颜色了,不确定颜色光谱是否在线性刻度上,但如果您确定了两张图片之间的平均颜色差异因子,则可以使用此值来规范化数据,然后再使用此技术进行处理。
树形数据结构
起初,这些似乎与问题不符,但我认为它们可能有效。
您可以考虑提取图像的某些属性(例如颜色箱)并生成huffman tree或类似的数据结构。您可能能够比较两棵树的相似性。这对于具有大量颜色光谱的摄影数据(例如卡通或其他减少颜色集的图像)效果不佳,但对于其他减少颜色集的图像则可能有效。
这可能行不通,但这是一个想法。 trie数据结构非常适合存储词汇表,例如字典。它是一种前缀树。也许可以建立与词汇表相当的图像(我只能想到颜色),以构建一棵Trie。如果将300x300图像缩小为5x5个正方形,然后将每个5x5个正方形分解为一系列颜色序列,就可以从结果数据中构建一棵Trie。如果2x2个正方形包含:FFFFFF|000000|FDFD44|FFFFFF
阅读论文:Porikli,Fatih,Oncel Tuzel和Peter Meer的“使用基于黎曼流形上均值的模型更新进行协方差跟踪”。(2006)IEEE计算机视觉和模式识别。
我成功地利用本文中介绍的技术,通过对Sobel、Canny、SUSAN特征/边缘检测输出以及原始灰度像素组成的协方差矩阵,能够检测出从相邻网络摄像头捕捉的图像中的重叠区域。
一个想法:
第二步并不简单。特别是,您可能需要使用智能算法在另一幅图像中找到最相似的关键点。点描述符通常是非常高维的(如百个参数),而且要查找很多点。kd树在这里可能很有用,哈希查找效果不佳。
变体:
这个问题实际上比看起来的要复杂得多 :-) Nick的建议很不错。
首先要知道,任何有价值的比较方法都基本上是通过将图像转换为另一种形式来工作--一种使其更容易选择相似特征的形式。通常,这些东西并不适合轻松阅读...
我能想到的最简单的例子之一就是仅使用每个图像的颜色空间。如果两个图像具有高度相似的颜色分布,则您可以相对确信它们显示了同一内容。至少,您可以有足够的确定性去标记它,或者进行更多的测试。在颜色空间中比较图像也会抵抗旋转、缩放和一些裁剪等因素的影响。当然,它不会抵抗对图像的大幅修改或大量重新着色(即使一个简单的色调变化也会有点棘手)。
http://en.wikipedia.org/wiki/RGB_color_space
http://upvector.com/index.php?section=tutorials&subsection=tutorials/colorspace
另一个例子涉及到一种称为霍夫变换的东西。该变换基本上将图像分解为一组线条。然后,您可以在每个图像中选取一些“最强”的线条,并查看它们是否对齐。您还可以做一些额外的工作来尝试补偿旋转和缩放--而且在这种情况下,由于比较几条线路要比比较整个图像少得多--所以不会那么糟糕。
http://homepages.inf.ed.ac.uk/amos/hough.html
http://rkb.home.cern.ch/rkb/AN16pp/node122.html
from PIL import Image
import imagehash
# image_fns : List of training image files
img_hashes = {}
for img_fn in sorted(image_fns):
hash = imagehash.average_hash(Image.open(image_fn))
if hash in img_hashes:
print( '{} duplicate of {}'.format(image_fn, img_hashes[hash]) )
else:
img_hashes[hash] = image_fn
from PIL import Image
import imagehash
# image_fns : List of training image files
img_hashes = {}
epsilon = 50
for img_fn1, img_fn2 in zip(image_fns, image_fns[::-1]):
if image_fn1 == image_fn2:
continue
hash1 = imagehash.average_hash(Image.open(image_fn1))
hash2 = imagehash.average_hash(Image.open(image_fn2))
if hash1 - hash2 < epsilon:
print( '{} is near duplicate of {}'.format(image_fn1, image_fn2) )
这只是一些建议,可能不会起作用,我已经做好被批评的准备。
这样做会产生虚警,但希望不会漏检。
将两个图像的大小调整为相同的大小(假设宽高比在两个图像中是相同的)。
使用无损压缩算法(例如gzip)压缩两个图像的位图。
查找文件大小相似的文件对。例如,您可以通过文件大小的相似程度对每对文件进行排序,并检索前X个。
正如我所说,这肯定会产生虚警,但希望不会漏检。您可以在五分钟内实现此操作,而Porikil等人可能需要进行大量工作。
它是一个命令行程序,可以自动校正旋转、缩放和其他失真(它主要用于合成HDR摄影,但也适用于视频帧和其他文档)。 更多信息:http://hugin.sourceforge.net/docs/manual/Align_image_stack.html
这是一个可以查找并计算两个图像中不同像素数量的程序。这里有一个不错的教程: http://www.imagemagick.org/Usage/compare/ ,使用-fuzz N%,您可以增加误差容忍度。 N越高,则将两个像素视为相同的误差容忍度越高。
align_image_stack应该会纠正任何偏移,因此compare命令实际上有机会检测到相同的像素。
如果你愿意考虑另一种方式来检测你的图像是否存在非法副本,你可以考虑数字水印。(来自 1.4)
它能够在不丢失质量的情况下将版权信息嵌入到数字对象中。每当数字对象的版权受到质疑时,该信息都会被提取出来以确定合法所有者。还可以将原始买家的身份和版权持有者的身份编码,从而追踪任何未经授权的副本。
尽管这也是一个复杂的领域,但有一些技术可以使水印信息在粗略的图像变化中保持不变:(来自 1.9)
任何具有合理强度的信号变换都无法移除水印。因此,除非他们过度降低文档的商业价值,否则盗版者将无法成功地删除水印。
当然,常见问题解答称:“实施这种方法非常具有挑战性”,但如果你成功了,你就能够高度确认图像是否为副本,而不仅仅是一个百分比的可能性。