在(纯)PHP / MySQL中查找类似的图像

2022-08-30 19:15:34

我的用户正在将图像上传到我的网站,我想首先向他们提供已经上传的图像。我的想法是1。为每个现有图像创建某种图像“哈希” 2.创建新上传图像的哈希值,并将其与数据库中的其他图像进行比较

我发现了一些有趣的解决方案,如 http://www.pureftpd.org/project/libpuzzlehttp://phash.org/ 等,但他们遇到了一个或多个问题

  1. 他们需要一些非标准的PHP扩展(或者根本不在PHP中) - 这对我来说是可以的,但我想把它创建为我流行的CMS的插件,它在许多托管环境中使用,没有我的控制。
  2. 他们正在比较两个图像,但我需要比较一个到许多(例如数千个),并且一个接一个地这样做将非常无效/缓慢......

我还可以只找到非常相似的图像(例如,不同的大小,重新保存的jpg或不同的jpg压缩因子)。

我得到的唯一想法是将图像大小调整为例如5px * 5px * 256色,创建它的字符串表示,然后找到相同的。但我想,即使只有两张不同大小的相同图像,它也可能会在颜色上产生微小的差异,因此找到100%相同的图像将是无用的。

因此,我需要一些良好的图像字符串表示格式,这些格式可以与某些SQL函数一起使用以找到类似的,或者其他一些好方法。例如,phash创建感知哈希,因此当两个数字接近时,图像也应该接近,所以我只需要找到最近的距离。但它又是外部库。

有什么简单的方法吗?


答案 1

我以前遇到过同样的问题

随意复制我所做的,希望它能帮助你/解决你的问题。


我是如何解决的

我的第一个想法失败了,就像你可能在想的那样,我最终为每个图像制作了字符串(无论大小)。但我很快就发现这能超快地填满你的数据库,而且效果不佳。

下一个选项(有效)是较小的图像(就像您的想法一样),我正是这样做的,但是使用*图像。我为每个图像创建“哈希”的方式是函数。5px10px10pximagecolorat()

请参阅此处 php.net。

在接收图像的颜色时,我将它们四舍五入到最接近的,以便颜色不那么具体。该数字()是您要更改的内容,具体取决于您希望搜索的具体程度。rgb5050

例如:

// Pixel RGB
rgb(105, 126, 225) // Original
rgb(100, 150, 250) // After rounding numbers to nearest 50

在对每个像素执行此操作后(*将为您提供100个背面),然后我将它们转换为数组,并将它们作为和存储在数据库中。10px10pxrgb()base64_encode()serialize()

在搜索相似的图像时,我对他们想要上传的图像执行了完全相同的过程,然后从数据库中提取图像“哈希”以比较它们,并查看匹配的舍入的内容。rgb


技巧

  • 舍入中的越大,您的搜索就越不具体(反之亦然)。50rgb

  • 如果希望 SQL 更具体,最好在数据库中存储有关图像的额外/特定信息,以便限制在数据库中获取的搜索。例如。如果纵横比为 ,则仅从数据库中提取图像。(等)4:34:3

  • 很难完全得到这个*,所以一个建议是phpthumb。我用语法使用它:5px5px

phpthumb.php?src=IMAGE_NAME_HERE.png&w=10&h=10&zc=1
// &w=  width of your image
// &h=  height of your image
// &zc= zoom control. 0:Keep aspect ratio, 1:Change to suit your width+height

祝你好运,希望我能帮忙。


答案 2

对于一个简单的php实现,请查看:https://github.com/kennethrapp/phasher

但是 - 我想知道是否有用于“比较”的本机mySql函数(请参阅上面的php类)


推荐