imgsmlr
是PolarDB PostgreSQL版支持的一款第三方插件,支持相似图像搜索功能。imgsmlr
插件基于Haar
小波变换算法,能够提取png、gif等类型图像特征值,并通过索引检索相似的图像。
前提条件
支持的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(内核小版本14.10.18.0及以上)。
您可通过如下语句查看PolarDB PostgreSQL版的内核小版本号:
SELECT version();
使用方法
数据类型
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;