【发布时间】:2012-07-05 05:22:02
【问题描述】:
我的用户正在将图片上传到我的网站,我想先向他们提供已经上传的图片。我的想法是 1.为每个现有图像创建某种图像“散列” 2. 对新上传的图片创建一个hash,并与数据库中的其他图片进行比较
我找到了一些有趣的解决方案,例如 http://www.pureftpd.org/project/libpuzzle 或 http://phash.org/ 等,但他们遇到了一个或多个问题
- 他们需要一些非标准的 PHP 扩展(或者根本不在 PHP 中)——这对我来说没问题,但我想将它创建为我流行的 CMS 的插件,它在许多托管环境中使用,没有我的控制。
- 他们正在比较两个图像,但我需要一对多(例如数千个)进行比较,并且一张一张地进行比较会非常无效/缓慢...... ...
我可以只找到非常相似的图像(例如不同的大小、重新保存的 jpg 或不同的 jpg 压缩系数)。
我得到的唯一想法是将图像调整为例如5px*5px* 256 种颜色,创建它的字符串表示,然后找到相同的。但我想即使只有两张大小不同的相同图像,它也可能会在颜色上产生微小的差异,所以只找到 100% 相同的图像是没有用的。
因此,我需要某种良好的图像字符串表示格式,它可以与某些 SQL 函数一起使用以找到相似的或其他一些好的方法。例如。 phash 创建感知散列,所以当两个数字接近时,图像也应该接近,所以我只需要找到最近的距离。但它又是外部库。
有什么简单的方法吗?
【问题讨论】:
-
您的想法还不错,256 种颜色不会给您带来“微小差异”。如果是这样,请降低该数字。另一个重要问题:您的图像哈希应该足以处理小图像旋转。
-
我刚刚想到的关于在散列中处理图像旋转的一个想法是将散列分成四个大小相等的部分并旋转图像,使平均值最低的部分位于左下角。
-
pHash 不会“比较两个图像”。它计算每个图像的哈希值,并认为相似的图像具有相似的哈希值。然后,您可以使用特殊的数据结构来存储您的图像哈希,并有效地查找与上传图像的哈希相似的哈希(例如图像)。
标签: php mysql image similarity