find相似图像的algorithm
我需要一个algorithm,可以确定两个图像是否“相似”,并识别类似的颜色,亮度,形状等模式。我可能需要一些指针,人类大脑用什么参数来“分类”的图像。 ..
我曾经看过基于hausdorff的匹配,但似乎主要是为了匹配转换的对象和形状的图案。
我已经做了类似的事情,通过使用小波变换将图像分解为签名。
我的做法是从每个转换的频道中选取最重要的n个系数,并logging它们的位置。 这是通过根据abs(功率)对(功率,位置)元组列表进行sorting完成的。 类似的图像会有相同之处,因为它们在相同的地方将具有显着的系数。
我发现最好将图像转换成YUV格式,这样可以有效地使您在形状(Y通道)和颜色(UV通道)上的重量相似。
你可以在mactorii中find我上面的实现 ,不幸的是我还没有像以前那样工作:-)
另一种方法,我的一些朋友使用惊人的好结果,就是简单地调整您的图像的大小,说一个4×4像素和商店,这是你的签名。 比如说,通过使用相应的像素来计算两幅图像之间的曼哈顿距离 ,可以得到多less相似的图像。 我没有关于如何执行大小调整的细节,因此您可能必须使用可用于该任务的各种algorithm来find适合的algorithm。
酸碱可能会让你感兴趣。
知觉散列 audio,video或图像文件的指纹,math上基于包含在其中的audio或视觉内容。 与密码散列函数不同,它依赖于input的小变化的雪崩效应,导致输出的剧烈变化,如果input在视觉上或听觉上相似,感知散列彼此“接近”。
我用SIFT在不同的图像中重新检测同一个对象。 这是真正的强大,但相当复杂,可能是矫枉过正。 如果图像应该非常相似,那么基于两幅图像之间的差异的一些简单参数可以告诉你很多。 有些指点:
- 对图像进行归一化处理,即通过计算两者的平均亮度并根据比例缩小最亮(避免在最高级别裁剪),使两幅图像的平均亮度相同),特别是如果您对形状更感兴趣,颜色。
- 每个通道在归一化图像上的色差总和。
- 找出图像中的边缘并测量两个图像中边缘像素之间的距离。 (形状)
- 将图像分成一组离散的区域,并比较每个区域的平均颜色。
- 在一个(或一组)水平上对图像进行阈值(threshold),并对产生的黑色/白色图像所不同的像素数进行计数。
这是一个难题! 这取决于你需要的准确度,这取决于你正在使用什么样的图像。 您可以使用直方图来比较颜色,但显然不考虑图像中这些颜色的空间分布(即形状)。 边缘检测之后进行某种分割(即,挑出形状)可以提供用于匹配另一图像的模式。 您可以使用共生matrix来比较纹理,将图像视为像素值的matrix,然后比较这些matrix。 在图像匹配和机器视觉方面有一些很好的书籍 – 在亚马逊的search会发现一些。
希望这可以帮助!
你可以使用感知图像差异
这是一个命令行实用程序,它使用感知度量来比较两个图像。 也就是说,它使用人类视觉系统的计算模型来确定两个图像是否在视觉上不同,因此忽略像素中的微小变化。 此外,它大大减less了随机数生成,操作系统或机器架构差异造成的误报数量。
一些图像识别软件解决scheme实际上不是纯粹的基于algorithm的,而是利用neural network概念。 查看http://en.wikipedia.org/wiki/Artificial_neural_network ,即NeuronDotNet,其中还包含有趣的示例: http ://neurondotnet.freehostia.com/index.html
有相关的研究使用Kohonenneural network/自组织映射
更多的学术系统(谷歌的PicSOM)或更less的学术
( http://www.generation5.org/content/2004/aiSomPic.asp ,(可能不适合所有的工作环境))演示文稿存在。
这听起来像是一个视觉问题。 你可能想看看自适应增强以及烧伤线提取algorithm。 这两个概念应该有助于解决这个问题。 如果您不熟悉视觉algorithm,边缘检测是一个更简单的开始,因为它解释了基本知识。
就分类参数而言:
- 调色板和位置(梯度计算,颜色直方图)
- 包含形状(Ada。Boosting / Training来检测形状)
根据您需要多less准确的结果,您可以简单地将nxn像素块中的图像分解并进行分析。 如果在第一个块中得到不同的结果,则无法停止处理,从而导致一些性能改进。
为了分析正方形,你可以例如获得颜色值的总和。
计算急剧缩小版本(例如:6×6像素)的像素颜色值差异的平方和可以很好地工作。 相同的图像产生0,相似的图像产生less量,不同的图像产生大的。
上面的其他人打入YUV的想法听起来很有趣 – 虽然我的想法很好,但我希望我的图像被计算为“不同的”,以便产生一个正确的结果 – 即使是从一个色盲观察者的angular度来看。
您可以在两幅图像之间执行某种块匹配运动估计,并测量残差和运动vector成本的总和(就像在video编码器中所做的那样)。 这会补偿议案; 对于奖励积分,进行仿射变换运动估计(补偿缩放和拉伸等)。 你也可以做重叠块或光stream。
作为第一遍,您可以尝试使用颜色直方图。 不过,你真的需要缩小你的问题领域。 通用图像匹配是一个非常困难的问题。
我发现这篇文章非常有用,解释了它的工作原理:
http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html
在另一个线程中有一些很好的答案,但是我想知道是否有涉及谱分析的工作? 也就是说,将图像分解为相位和幅度信息并进行比较。 这可能会避免种植,转化和强度差异的一些问题。 无论如何,这只是我猜测,因为这似乎是一个有趣的问题。 如果你search了http://scholar.google.com,我相信你可以拿出几篇关于这个的文章。;
在讨论中迟到抱歉。
我们甚至可以使用ORB方法来检测两幅图像之间的相似特征点。 下面的链接给出了在Python中直接实现ORB
http://scikit-image.org/docs/dev/auto_examples/plot_orb.html
即使openCV已经直接实现了ORB。 如果你更多的信息请按照下面的研究文章。