Tom*_*ler 21 php mysql image similarity
我的用户正在将图像上传到我的网站,我想首先向他们提供已经上传的图像.我的想法是1.创建每个现有图像的某种图像"哈希"2.创建新上传图像的哈希并将其与数据库中的其他图像进行比较
我找到了一些有趣的解决方案,如http://www.pureftpd.org/project/libpuzzle或http://phash.org/等,但他们遇到了一个或多个问题
我可以找到非常相似的图像(例如不同大小,重新保存的jpg或不同的jpg压缩因子).
我得到的唯一想法是将图像调整为例如5px*5px*256颜色,创建它的字符串表示然后找到相同的颜色.但我猜它可能会产生微小的颜色差异,即使只有两个相同的图像具有不同的大小,所以找到100%相同的图像将是无用的.
所以我需要一些良好的图像字符串表示格式,可以与某些SQL函数一起使用来查找类似或其他一些好方法.例如,phash创建感知哈希,所以当两个数字接近时,图像也应该接近,所以我只需要找到最近的距离.但它又是外部图书馆.
有什么简单的方法吗?
jay*_*jay 22
我之前有过完全相同的问题.
随意复制我所做的,希望它能帮助你/解决你的问题.
我的第一个想法是失败,类似于你的想法,我最终为每一张图片制作了字符串(无论大小如何).但我很快就解决了这个超快速填充你的数据库,并没有效果.
下一个选项(有效)是一个较小的图像(就像你的5px
想法),我做的确实如此,但有10px
*10px
图像.我为每个图像创建'哈希'的方式是imagecolorat()
函数.
当接收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
的图像.
在更大的是50
在rgb
圆整,那么具体的搜索必应(反之亦然).
如果希望SQL更具体,最好在数据库中存储有关映像的额外/特定信息,以便限制在数据库中获得的搜索.例如.如果纵横比是4:3
,则只4:3
从数据库中拉出图像.(等等)
这可能很难完美5px
*5px
,所以建议是phpthumb.我用它的语法:
Run Code Online (Sandbox Code Playgroud)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
祝你好运,希望我能帮忙.