Algorithm 比较两幅图像的算法
给定两个不同的图像文件(无论我选择何种格式),我需要编写一个程序来预测其中一个是另一个的非法副本的可能性。副本的作者可能会做一些事情,如旋转、制作负片或添加琐碎的细节(以及更改图像的尺寸) 你知道做这类工作的算法吗?阅读论文:Algorithm 比较两幅图像的算法,algorithm,image,image-processing,image-recognition,Algorithm,Image,Image Processing,Image Recognition,给定两个不同的图像文件(无论我选择何种格式),我需要编写一个程序来预测其中一个是另一个的非法副本的可能性。副本的作者可能会做一些事情,如旋转、制作负片或添加琐碎的细节(以及更改图像的尺寸) 你知道做这类工作的算法吗?阅读论文: 使用本文介绍的技术,我成功地检测到了从相邻网络摄像头捕获的图像中的重叠区域。我的协方差矩阵由Sobel、canny和SUSAN aspect/edge detection输出以及原始灰度像素组成。这确实比看起来简单得多:-)Nick的建议很好 首先,请记住,任何有价值的比
使用本文介绍的技术,我成功地检测到了从相邻网络摄像头捕获的图像中的重叠区域。我的协方差矩阵由Sobel、canny和SUSAN aspect/edge detection输出以及原始灰度像素组成。这确实比看起来简单得多:-)Nick的建议很好 首先,请记住,任何有价值的比较方法基本上都是通过将图像转换成不同的形式来工作的——这种形式可以更容易地挑出相似的特征。通常,这些东西不适合很轻的阅读。。。
我能想到的最简单的例子之一就是简单地使用每个图像的颜色空间。如果两个图像具有高度相似的颜色分布,则可以合理地确定它们显示的是相同的内容。至少,您可以有足够的确定性来标记它,或者进行更多的测试。在颜色空间中比较图像也会抵制旋转、缩放和一些裁剪等操作。当然,它无法抵抗对图像的大量修改或重着色(即使是简单的色调变换也会有点棘手)
另一个例子涉及称为Hough变换的东西。这种变换实质上是将图像分解为一组线。然后,您可以在每张图像中选取一些“最强”的线条,看看它们是否对齐。你也可以做一些额外的工作来补偿旋转和缩放——在这种情况下,因为比较几行比对整个图像做同样的工作要少得多——这不会太糟糕
如果你愿意考虑一种不同的方法来检测你的图像的非法拷贝,你可以考虑。(从1.4开始) …将版权信息插入数字对象,而不会降低质量。每当数字对象的版权受到质疑时,都会提取该信息以识别合法所有者。还可以将原始买家的身份与版权持有人的身份一起编码,从而可以追踪任何未经授权的副本 虽然这也是一个复杂的领域,但也有一些技术可以让水印信息在整个图像变化过程中保持不变:(从1.9开始) 。。。任何具有合理强度的信号变换都不能去除水印。因此,一个愿意删除水印的盗版者不会成功,除非他们将文档降低到商业利益的程度
当然,常见问题解答称实现这种方法为:“……非常具有挑战性”,但如果你成功地实现了这一点,你会对图像是否为副本有很高的信心,而不是一个百分比的可能性。这只是一个建议,它可能不起作用,我准备就此接受采访 这将产生误报,但希望不会产生误报
正如我所说,这肯定会产生误报,但希望不会产生误报。您可以在五分钟内实现这一点,而Porikil等人可能需要大量的工作。我相信,如果您愿意将此方法应用于所有可能的方向和负面版本,图像识别的良好开端(具有良好的可靠性)是使用特征脸: 另一个想法是将两个图像转换为其组件的向量。这样做的一个好方法是创建一个在x*y维度上运行的向量(x是图像的宽度,y是高度),每个维度的值应用于(x,y)像素值。然后运行一个具有两个类别的K近邻变体:匹配和不匹配。如果它足够接近原始图像,它将适合匹配类别,如果不是,则不会 K最近邻(KNN)可以在这里找到,网络上也有其他很好的解释:
KNN的好处是,与原始图像比较的变体越多,算法就越精确。缺点是你需要一个图像目录来首先训练系统。这些只是我对这个问题的想法,从未尝试过,但我喜欢思考像这样的问题 开始之前
考虑正常化图片,如果一个分辨率比另一个高,考虑其中一个是另一个压缩版本的选项,因此缩小分辨率可以提供更准确的结果。 考虑扫描图像的各种预期区域,这些区域可以表示图像的缩放部分以及各种位置和旋转。如果其中一幅图像是另一幅图像的倾斜版本,那么它开始变得棘手,这些是您应该识别和妥协的限制
是测试和评估图像的优秀工具 测试算法 您应该测试(至少)一组大型人工分析的测试数据,其中匹配项是事先已知的。例如,如果您的测试数据中有1000个图像,其中white
red
blue
green
black
FFFFFF|000000|FDFD44|FFFFFF
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) )