Ekstensi imgsmlr adalah ekstensi pihak ketiga untuk PolarDB for PostgreSQL dan yang mendukung pencarian citra serupa. Ekstensi imgsmlr menggunakan algoritma transformasi wavelet Haar untuk mengambil nilai fitur dari citra, seperti file PNG dan GIF. Ekstensi ini kemudian menggunakan indeks untuk mengambil citra serupa.
Lingkup
Versi PolarDB for PostgreSQL yang didukung:
PostgreSQL 16 (versi mesin minor 2.0.16.9.8.0 atau lebih baru)
PostgreSQL 14 (versi mesin minor 14.10.18.0 atau lebih baru)
Anda dapat melihat versi mesin minor di Konsol atau menjalankan pernyataan SHOW polardb_version;. Jika kluster Anda tidak memenuhi persyaratan versi mesin minor, lakukan peningkatan versi mesin minor.
Cara Penggunaan
Tipe data
Ekstensi imgsmlr menyediakan dua tipe data: pattern dan signature.
Tipe Data | Ukuran penyimpanan | Deskripsi |
pattern | 16388 byte | Hasil transformasi wavelet Haar pada sebuah citra. |
signature | 64 byte | Representasi ringkas dari sebuah pattern. Indeks GiST dapat digunakan untuk pencarian cepat. |
Fungsi
Ekstensi imgsmlr menyediakan sejumlah fungsi yang dapat digunakan untuk mengonversi berbagai jenis citra ke tipe pattern. Ekstensi ini juga menyediakan fungsi untuk membuat signature dari pattern guna mempermudah pengambilan.
Fungsi | Tipe pengembalian | Deskripsi |
jpeg2pattern(bytea) | pattern | Mengonversi citra JPEG ke tipe pattern. |
png2pattern(bytea) | pattern | Mengonversi citra PNG ke tipe pattern. |
gif2pattern(bytea) | pattern | Mengonversi citra GIF ke tipe pattern. |
pattern2signature(pattern) | signature | Membuat signature dari sebuah pattern. |
shuffle_pattern(pattern) | pattern | Mengacak sebuah pattern untuk mengurangi sensitivitas terhadap offset citra. |
Operator
Tipe pattern dan signature keduanya mendukung operator <-> untuk Jarak Euclidean. Selain itu, tipe signature juga mendukung indeks GiST pada operator <->.
Operator | Tipe Lvalue | Tipe R-value | Tipe pengembalian | Deskripsi |
<-> | pattern | pattern | float8 | Menghitung Jarak Euclidean antara dua pattern. |
<-> | signature | signature | float8 | Menghitung Jarak Euclidean antara dua signature. |
Contoh
Instal ekstensi
CREATE EXTENSION imgsmlr;Buat tabel untuk nilai fitur citra
Asumsikan terdapat tabel image yang berisi kolom id dan kolom data. Kolom data berisi data biner JPEG. Anda dapat menjalankan pernyataan SQL berikut untuk membuat tabel yang berisi pattern dan signature untuk citra-citra tersebut.
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
);Buat indeks GiST
ALTER TABLE pat ADD PRIMARY KEY (id);
CREATE INDEX pat_signature_idx ON pat USING gist (signature);Cari citra serupa
Untuk menemukan 10 citra teratas yang paling serupa dengan citra yang memiliki id tertentu, gunakan subkueri. Subkueri memanfaatkan indeks GiST pada signature untuk mengambil 100 citra kandidat teratas. Query luar kemudian mencari di antara kandidat-kandidat tersebut berdasarkan pattern untuk menemukan 10 kecocokan terbaik.
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;Hapus instalasi ekstensi
DROP EXTENSION imgsmlr;