生成适用于PostgreSQL表索引的自然主键值的图像哈希算法?

1 投票
2 回答
1370 浏览
提问于 2025-04-16 22:38

我正在搭建一套合作的数据存储系统,里面有图片,现在开始实现一些简单的基于内容的搜索和排序算法,比如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 个回答

1

这里有一个很有意思的方法,详细介绍在 http://railsware.com/blog/2012/05/10/effective-similarity-search-in-postgresql/

简单来说,首先把图片缩小到15x15像素,然后计算每个像素的亮度,计算公式是(0.299 * 红色 + 0.587 * 绿色 + 0.114 * 蓝色)。这样就得到了一个包含255个数值的数组,这些数值会存储在PostgreSQL的一个表格列里,并使用Gin/Gist索引,这样可以快速找到相似的图片。

0

比如说,有一种叫做“填充空间曲线”的东西,比如希尔伯特曲线或者摩尔曲线,这是什么呢?

撰写回答