算法-请教如何比较两张图片是否相似?

发布于 2017-01-25 02:42:31 字数 53 浏览 1457 评论 4

现在有很多应用都能提供图片自动识别是否相似,准确率貌似还挺高,不知道其中的原理和算法是什么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甜柠檬 2017-09-16 06:37:41

关于图片相似性比较最基本是基于特征的的,后来比较高级的有基于内容的,这个就涉及到模式识别方面的内容;
基于图像本身的特征一般是就图像的像素点信息进行统计,如颜色直方图和灰度图去基于统计信息进行比较;但是这种比较方法并不准确,于是产生基于内容的图像匹配方法,先对图像进行预处理,进行去噪,滤波,灰度化等方式;然后提取图像的结构信息和特征信息;基于这些信息去构造图像的指纹,然后基于此进行图像特征的标的的相似性的判断

偏爱自由 2017-05-23 18:11:46

其实吧,Google那个Similar Images的功能,大约是直方图匹配……所以一般只是匹配到颜色差不多的图片而已

瑾兮 2017-05-14 02:08:53

用"感知哈希算法"(Perceptual hash algorithm)对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。

参考Neal Krawetz的原文:Looks Like It
中文翻译参考:点击查看原文

第一步,缩小尺寸。

将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。

第二步,简化色彩。

将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。

第三步,计算平均值。

计算所有64个像素的灰度平均值。

第四步,比较像素的灰度。

将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。

第五步,计算哈希值。

将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。

得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算"汉明距离"(Hamming distance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。

具体的代码实现,可以参见Wote用python语言写的imgHash.py。代码很短,只有53行。使用的时候,第一个参数是基准图片,第二个参数是用来比较的其他图片所在的目录,返回结果是两张图片之间不相同的数据位数量(汉明距离)

这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。

实际应用中,往往采用更强大的pHash算法SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。这些算法虽然更复杂,但是原理与上面的简便算法是一样的,就是先将图片转化成Hash字符串,然后再进行比较。

瑾兮 2017-04-19 20:22:08

使用模式识别的方法。先对两张图片去噪,再提取特征,最后使用分类器得出结论。分类器算法可以选用贝叶斯决策论
模式识别现在还是一个很年轻的理论,需要逐步地完善。在网上找成熟的算法库吧,自己实现的话,需要花很大的气力。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文