A extensão imgsmlr adiciona a busca por imagens semelhantes ao PolarDB for PostgreSQL. Ela aplica a transformada wavelet de Haar para extrair valores de características das imagens e usa um índice GiST para recuperar resultados visualmente similares.
Pré-requisitos
Antes de começar, verifique se você tem:
-
Um cluster do PolarDB for PostgreSQL executando uma das versões compatíveis:
Versão do PostgreSQL
Versão secundária mínima do mecanismo
PostgreSQL 16
2.0.16.9.8.0
PostgreSQL 14
14.10.18.0
Para verificar a versão secundária do mecanismo, execute
SHOW polardb_version;ou visualize a versão no console. Se o cluster não atender ao requisito de versão mínima, atualize a versão secundária do mecanismo antes de prosseguir.
Referência
Tipos de dados
|
Tipo de dado |
Tamanho de armazenamento |
Descrição |
|
|
16388 bytes |
Resultado da transformada wavelet de Haar aplicada a uma imagem |
|
|
64 bytes |
Representação compacta de um |
Funções
Todas as funções *2pattern aceitam um argumento bytea com os dados binários brutos da imagem.
|
Função |
Tipo de retorno |
Descrição |
|
|
|
Converte uma imagem JPEG para o tipo |
|
|
|
Converte uma imagem PNG para o tipo |
|
|
|
Converte uma imagem GIF para o tipo |
|
|
|
Crie uma |
|
|
|
Embaralha um |
Operadores
Os tipos pattern e signature aceitam o operador <-> para calcular a distância euclidiana. O tipo signature também permite criar um índice GiST em <-> para acelerar as buscas.
|
Operador |
Tipo à esquerda |
Tipo à direita |
Tipo de retorno |
Descrição |
|
|
|
|
|
Distância euclidiana entre dois padrões |
|
|
|
|
|
Distância euclidiana entre duas assinaturas |
Primeiros passos
Instale a extensão
CREATE EXTENSION imgsmlr;
Crie uma tabela de características
O exemplo abaixo considera uma tabela image com uma coluna id e uma coluna data contendo dados binários JPEG. A consulta extrai um pattern embaralhado e uma signature para cada imagem e os armazena em uma nova tabela pat.
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
);
A função shuffle_pattern reduz a sensibilidade a pequenos deslocamentos posicionais nas imagens.
Crie um índice GiST
Adicione uma chave primária e um índice GiST na coluna signature para permitir a recuperação rápida de candidatos.
ALTER TABLE pat ADD PRIMARY KEY (id);
CREATE INDEX pat_signature_idx ON pat USING gist (signature);
Busque imagens semelhantes
A consulta a seguir encontra as 10 imagens mais semelhantes àquela identificada por um determinado :id.
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;
A consulta interna usa o índice GiST em signature para recuperar eficientemente os 100 principais candidatos. A consulta externa reclassifica esses 100 candidatos com base na distância exata de pattern para retornar as 10 melhores correspondências. Ajuste ambos os valores de LIMIT para equilibrar velocidade e precisão da busca conforme sua coleção de imagens.
Desinstale a extensão
DROP EXTENSION imgsmlr;