PostgreSQL影像搜尋外掛使用篇
1. 外掛安裝
依賴gd.h yum install -y gd-devel
下載安裝imgsmlr
$ git clone https://github.com/postgrespro/imgsmlr
$ cd imgsmlr
$ export PGHOME=/home/digoal/pgsql9.5
$ export PATH=$PGHOME/bin:$PATH:.
$ make USE_PGXS=1
$ make USE_PGXS=1 install
安裝外掛
$ psql
psql (9.5.3)
Type "help" for help.
postgres=# create extension imgsmlr;
CREATE EXTENSION
imgsmlr新增了兩個資料型別
資料型別 | 儲存長度 | 描述 |
---|---|---|
pattern | 16388 bytes | 圖片的哈爾小波變換結果 |
signature | 64 bytes | 模式的快速索引(GiST) |
gist 索引方法(支援pattern和signature型別), 以及KNN操作符,可以用於搜尋相似度
操作符 | 左型別 | 右型別 | 返回型別 | 描述 |
---|---|---|---|---|
<-> | pattern | pattern | float8 | 兩個模式的歐幾里得距離 |
<-> | signature | signature | float8 | 兩個特徵的歐幾里得距離 |
新增了幾個函式
將影像的二進位制轉換為pattern型別,將pattern中儲存的資料轉換為signature型別
函式 | 返回型別 | 描述 |
---|---|---|
jpeg2pattern(bytea) | pattern | 生產jpeg圖片的模式 |
png2pattern(bytea) | pattern | 生產png圖片的模式 |
gif2pattern(bytea) | pattern | 生產gif圖片的模式 |
pattern2signature(pattern) | signature | 從模式中提取特徵 |
shuffle_pattern(pattern) | pattern | 洗牌模式,不敏感影像的轉變 |
2.SQL的匯入和測試
2.1 建立圖片表create table image (id serial, data bytea);
2.2 匯入圖片到資料庫insert into image(data) select pg_read_binary_file(`檔案路徑`);
由於我的圖片並沒有許可權上傳到PostgreSQL服務端,不能當成本地檔案使用。
CREATE TABLE hexdump (hex text);
建立臨時表xxd -p 4.jpg | tr -d `
圖片檔案轉為16進位制檔案
` > 4.hex;psql --host=xx.xx.xx.xx --port=1234 --username=root --dbname=postgres -c "COPY hexdump from STDIN" <4.hex;
通過輸出流寫入服務端的臨時表insert into image(data) SELECT decode(hex, `hex`) FROM hexdump;
將16進位制轉為area
2.3 將圖片轉換成 patten 和 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
);
2.4 建立索引
ALTER TABLE pat ADD PRIMARY KEY (id);
CREATE INDEX pat_signature_idx ON pat USING gist (signature);
2.5 近似度查詢,例如查詢與id = :id的影像相似的影像,按相似度排行,取出前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
這個smlr是越小越相似,可以試試下面這兩張圖片。
3.JDBC的匯出和查詢
3.1 注意二方庫是和jre環境相關的,不然會報錯。
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.1.4.jre7</version>
</dependency>
3.2 通過輸入流寫入到bytea型別的欄位
Class.forName("org.postgresql.Driver");
connection= DriverManager.getConnection(url, user, password);
FileInputStream in = ImageUtil.readImage(path);
String insertSQL = "insert into image (id,data) values(?,?)";
PreparedStatement ps = connection.prepareStatement(insertSQL);
ps.setInt(1,1);
ps.setBinaryStream(2, in, in.available());
int count = ps.executeUpdate();
3.3 讀取text欄位
String sql = "select * from hexdump limit 1";
statement=connection.createStatement();
ResultSet resultSet=statement.executeQuery(sql);
while(resultSet.next()){
ImageUtil.toFile(hexStringToBytes(resultSet.getString(1)),"/Users/work/1.jpg");
}
3.3.2 讀取bytea型別的欄位
實際上bytea型別getString 就是hexdump的型別的x+text,故通過流讀取比string合理
String sql = "select * from image limit 1";
statement=connection.createStatement();
ResultSet resultSet=statement.executeQuery(sql);
while(resultSet.next()){
ImageUtil.readBin2Image(resultSet.getBinaryStream(2), "/Users/work/2.jpg");
}
4.附錄
安裝文件:https://github.com/digoal/blog/blob/master/201611/20161126_01.md?file=20161126_01.md
如何插入檔案:https://dba.stackexchange.com/questions/1742/how-to-insert-file-data-into-a-postgresql-bytea-column
圖片流轉換工具: http://blog.csdn.net/hikvision_java_gyh/article/details/52670469
hex轉byte[]: http://blog.csdn.net/u010350809/article/details/41265379
相關文章
- 搜尋引擎——Solr外掛DataImport配置使用SolrAIImport
- PostgreSQL外掛SQL
- oc-plugin-music 音樂聚合搜尋外掛Plugin
- 「效率集」聚合搜尋,瀏覽器必備的資源與資訊搜尋外掛瀏覽器
- jQuery的搜尋關鍵詞自動匹配外掛jQuery
- PostgreSQL外掛彙總SQL
- 工具篇---xcode外掛使用XCode
- 搜尋和線上閱讀 Github 程式碼的外掛推薦Github
- [外掛擴充套件]通過標題搜尋站外資訊套件
- 影像處理第二篇之波段運算(軟體外掛篇)
- PostgreSQL外掛hook機制SQLHook
- 影像搜尋技術發展應知道
- postgresql和postgis外掛安裝SQL
- 分享一個瀏覽器外掛:搜尋引擎結果過濾器瀏覽器過濾器
- 黑白影像處理的Ps外掛
- 探尋 webpack 外掛機制Web
- window版postgresql安裝orafce外掛SQL
- ast-gre:VSCode中結構搜尋和替換的外掛ASTVSCode
- 快速使用Google搜尋Go
- SI 2120程式設計影像搜尋綜合程式設計
- 【搜尋引擎】 PostgreSQL 10 實時全文檢索和分詞、相似搜尋、模糊匹配實現類似Google搜尋自動提示SQL分詞Go
- 黃東旭:“向量資料庫”還是“向量搜尋外掛 + SQL 資料庫”?資料庫SQL
- 微軟正在必應搜尋網站測試全新的天氣外掛設計微軟網站
- 搜尋引擎原理及使用
- 中國網際網路首現搜尋框掛馬“114搜尋”被“黑”
- 基於PostgreSQL實時干預搜尋排序實踐SQL排序
- Django新增全文搜尋功能入門篇Django
- 使用Google百度等搜尋引擎的常用搜尋技巧Go
- Go Search Extension,快速在位址列搜尋 Go 文件的開源瀏覽器外掛Go瀏覽器
- 輕量級外掛sdstorage用於操作localStorage支援過期、批量搜尋刪除等
- Headshot外掛如何使用?Headshot外掛使用教程
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- 搜尋外貿客戶軟體推薦
- 影像搜尋的新紀元:Milvus與CLIP模型相伴的搜圖引擎模型
- citusdata支援的一些postgresql的外掛SQL
- Postgresql Contrib模組外掛總結SQL
- Android外掛化開篇Android
- Flutter外掛開發---iOS篇FlutteriOS