imgsmlr是PolarDB PostgreSQL版支持的一款第三方插件,支持相似图像搜索功能。imgsmlr插件基于Haar小波变换算法,能够提取png、gif等类型图像特征值,并通过索引检索相似的图像。
适用范围
支持的PolarDB PostgreSQL版的版本如下:
PostgreSQL 16(内核小版本2.0.16.9.8.0及以上)
PostgreSQL 14(内核小版本14.10.18.0及以上)
使用方法
数据类型
imgsmlr插件提供了两种数据类型,分别为pattern和signature。
数据类型 | 存储大小 | 说明 |
pattern | 16388 字节 | 对图像进行Haar小波变换的结果。 |
signature | 64 字节 | pattern的简短表示,可以使用GiST索引进行快速搜索。 |
函数
imgsmlr插件提供了多种函数,可以将各种类型的图像转为pattern类型,同时提供函数为pattern类型图像创建signature便于检索。
函数 | 返回类型 | 说明 |
jpeg2pattern(bytea) | pattern | 将图像由jpeg转为pattern类型。 |
png2pattern(bytea) | pattern | 将图像由png转为pattern类型。 |
gif2pattern(bytea) | pattern | 将图像由gif转为pattern类型。 |
pattern2signature(pattern) | signature | 为pattern类型图像创建signature。 |
shuffle_pattern(pattern) | pattern | 随机化处理pattern,降低对图像偏移的敏感度。 |
运算符
pattern和signature类型都支持欧几里德距离的<->运算符。signature还支持在<->运算符上使用GiST索引。
运算符 | 左值类型 | 右值类型 | 返回类型 | 说明 |
<-> | pattern | pattern | float8 | 计算两个pattern类型图像的欧几里得距离。 |
<-> | signature | signature | float8 | 计算两个signature类型图像的欧几里得距离。 |
示例
安装插件
CREATE EXTENSION imgsmlr;创建图像特征值表
假设已有一个image表,其中包含id列和data列,其中data列包含二进制jpeg数据。通过以下SQL创建包含给定图像的pattern和signature的表。
CREATE TABLE pat AS (
SELECT
id,
shuffle_pattern(pattern) AS pattern,
pattern2signature(pattern) AS signature
FROM (
SELECT
id,
jpeg2pattern(data) AS pattern
FROM
image
) x
);创建GiST索引
ALTER TABLE pat ADD PRIMARY KEY (id);
CREATE INDEX pat_signature_idx ON pat USING gist (signature);搜索相似图像
为查询与具有指定id的图像最相似的前10张图像,可以在子查询使用GiST索引通过signature选择前100张图像,外部查询按pattern从子查询找到的图像中搜索前10个图像。
SELECT
id,
smlr
FROM
(
SELECT
id,
pattern <-> (SELECT pattern FROM pat WHERE id = :id) AS smlr
FROM pat
WHERE id <> :id
ORDER BY
signature <-> (SELECT signature FROM pat WHERE id = :id)
LIMIT 100
) x
ORDER BY x.smlr ASC
LIMIT 10;卸载插件
DROP EXTENSION imgsmlr;