imgsmlr是PolarDB PostgreSQL版支援的一款第三方外掛程式,支援相似Image Search功能。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;