imgsmlr(近似图像)

imgsmlrPolarDB PostgreSQL版支持的一款第三方插件,支持相似图像搜索功能。imgsmlr插件基于Haar小波变换算法,能够提取png、gif等类型图像特征值,并通过索引检索相似的图像。

前提条件

支持的PolarDB PostgreSQL版的版本如下:

PostgreSQL 14(内核小版本14.10.18.0及以上)。

说明

您可通过如下语句查看PolarDB PostgreSQL版的内核小版本号:

SELECT version();

使用方法

数据类型

imgsmlr插件提供了两种数据类型,分别为patternsignature

数据类型

存储大小

说明

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,降低对图像偏移的敏感度。

运算符

patternsignature类型都支持欧几里德距离的<->运算符。signature还支持在<->运算符上使用GiST索引。

运算符

左值类型

右值类型

返回类型

说明

<->

pattern

pattern

float8

计算两个pattern类型图像的欧几里得距离。

<->

signature

signature

float8

计算两个signature类型图像的欧几里得距离。

示例

安装插件

CREATE EXTENSION imgsmlr;

创建图像特征值表

假设已有一个image表,其中包含id列和data列,其中data列包含二进制jpeg数据。通过以下SQL创建包含给定图像的patternsignature的表。

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;