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

Tom*_*ler 21 php mysql image similarity

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

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

  1. 他们需要一些非标准的PHP扩展(或者根本不是PHP) - 对我来说没关系,但是我想把它作为我的流行CMS的插件创建,它在很多托管环境中使用而无法控制.
  2. 他们正在比较两个图像,但我需要比较一个到多个(例如数千个)并逐个进行将非常无效/缓慢......

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

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

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

有什么简单的方法吗?

jay*_*jay 22

我之前有过完全相同的问题.

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


我是怎么解决的

我的第一个想法是失败,类似于你的想法,我最终为每一张图片制作了字符串(无论大小如何).但我很快就解决了这个超快速填充你的数据库,并没有效果.

下一个选项(有效)是一个较小的图像(就像你的5px想法),我做的确实如此,但有10px*10px图像.我为每个图像创建'哈希'的方式是imagecolorat()函数.

在这里查看php.net.

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

例如:

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

这样做是为了每一个像素后(10px*10px会给你100 rgb()的背面),然后我把他们变成一个数组,并将其存储在数据库中base64_encode()serialize().

在搜索相似的图像时,我对他们想要上传的图像执行完全相同的处理,然后从数据库中提取图像"哈希"以将它们全部进行比较,并查看匹配舍入rgb的图像.


提示

  • 更大的50rgb圆整,那么具体的搜索必应(反之亦然).

  • 如果希望SQL更具体,最好在数据库中存储有关映像的额外/特定信息,以便限制在数据库中获得的搜索.例如.如果纵横比是4:3,则只4:3从数据库中拉出图像.(等等)

  • 这可能很难完美5px*5px,所以建议是phpthumb.我用它的语法:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 将RGB三重数字舍入到最接近的50是不正确的,因此可以得到最接近的颜色,因此可以考虑大的相似图像.124,76,76和76,76,124(红色和蓝色色调)将变成100,100,100(灰色).将RGB转换为整数(从0到16777216)然后以houndreds或数千为圆形会更好.这样可以更好地处理类似的色调和颜色. (5认同)