生成适用于PostgreSQL表索引的自然主键值的图像哈希算法?
我正在搭建一套合作的数据存储系统,里面有图片,现在开始实现一些简单的基于内容的搜索和排序算法,比如SIFT、稀疏颜色直方图距离、基本的SVD等等。
目前我在PostgreSQL表中使用二进制数据的sha1哈希作为索引。这些哈希算是“傻瓜”哈希——就是把相关的数据直接输入到Python的hashlib.sha1
模块中计算出来的,然后存储在长度和sha1的base64表示一样的可空字符列中。
如果能实现一种哈希算法,既能生成适合用来索引Postgres表的哈希值,又能在某种程度上描述图片,那就太好了,像是phash或者汉明距离。虽然phash看起来是个不错的选择,但它需要使用一个专有的存储引擎和API……我希望找到一些不那么“现成”的东西,能够和我现有的Python/Postgresql/Solr/Redis生态系统兼容。
速度不是最重要的——对我来说,更重要的是实现一个(或多个)可以稍微修改一下的算法,并且保持一定的逻辑性。
( * ) 这些数据主要是我图片的未处理或轻微处理的内容,比如:JPEG/PNG/DNG图片文件内容、ICC配置文件数据结构、EXIF/IPTC标签集的JSON转储等等。
2 个回答
这里有一个很有意思的方法,详细介绍在 http://railsware.com/blog/2012/05/10/effective-similarity-search-in-postgresql/。
简单来说,首先把图片缩小到15x15像素,然后计算每个像素的亮度,计算公式是(0.299 * 红色 + 0.587 * 绿色 + 0.114 * 蓝色)。这样就得到了一个包含255个数值的数组,这些数值会存储在PostgreSQL的一个表格列里,并使用Gin/Gist索引,这样可以快速找到相似的图片。
比如说,有一种叫做“填充空间曲线”的东西,比如希尔伯特曲线或者摩尔曲线,这是什么呢?