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 '\n' > 4.hex; 图片文件转为16进制文件
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

时间: 2024-08-02 13:03:22

PostgreSQL 图像搜索插件使用篇的相关文章

弱水三千,只取一瓢,当图像搜索遇见PostgreSQL(Haar wavelet)

背景 图片搜索是继文字搜索后又一个比较常用的搜索引擎. 市面上常见的搜索引擎有谷歌.百度.搜狗等图片搜索引擎.http://image.baidu.com/http://images.google.com.hk 例如在搜索引擎提供的接口中上层了一张雪人的图片,搜出来一堆和雪人近似的图片. 图片搜索是怎么做到的呢? 万能的PostgreSQL绝不落下这么好玩的东东,通过PG万能的API,可以扩展它的图片搜索功能. 如果你对PostgreSQL扩展开发感兴趣,可以参考我写的文章<找对业务G点, 体验

鉴黄、视频、图片去重、图像搜索业务分析与实践

PostgreSQL 在视频.图片去重,图像搜索业务中的应用 作者 digoal 日期 2016-11-26 标签 PostgreSQL , Haar wavelet , 图像搜索 , 图片去重 , 视频去重 背景 图像处理的业务场景比较多,例如 图像搜索.视频去重.人脸识别.美图.图片去重 等. 比如,视频去重,一些用户上传了较多的视频,同一部电影可能有不同的版本,分辨率不一样,音轨不一样,压缩比不一样.这种情况会导致服务端重复存储大量的视频. 又比如甄别黄色视频或黄色图片,鉴黄师的职业要消失

NET插件系统之四——提升系统搜索插件和启动速度的思考

一. 面临的问题 开发插件系统的主要优势是扩展性,我们不需要为系统模块的集成再多费脑筋,但这也带来了额外的问题.通常,系统需要在每次启动时搜索固定目录下的符合要求的插件.但是,当系统变得越来越庞大,所引用的dll文件越来越多时,就会出现很严重的问题:开启时间慢,性能差,用户体验降低,尤其是在调试程序时,会浪费大量宝贵的时间. 我确确实实的面临了这样的问题,有兴趣的读者可以看看我的插件系列文章的前几篇,这两天痛定思痛,决心提升系统搜索插件的性能. 我们先看一段普通的搜索插件的代码: public

SES大会新锐观点:图像搜索优化几步走?

圣何塞搜索引擎策略( SES )大会上,显现的主要趋势之一是:图像搜索这一角色越来越重要.这篇文章将会谈一点有关:图像搜索的重要性为什么会逐渐增加,以及是如何逐渐增加的. 并且会探讨如何就这一方面对你的网站进行优化. 首先用一些数据来说明为什么图像搜索的重要性与日俱增: 1. Ask.com 的 CEO Jim Lanzone说,他们在 Ask3D 上提供的搜索结果中有 50% 不是传统的http://www.aliyun.com/zixun/aggregation/11510.html">

SES大会新的锐观点:图像搜索优化几步走?

圣何塞搜索引擎策略( SES )大会上,显现的主要趋势之一是:图像搜索这一角色越来越重要.这篇文章将会谈一点有关:图像搜索的重要性为什么会逐渐增加,以及是如何逐渐增加的. 并且会探讨如何就这一方面对你的网站进行优化. 首先用一些数据来说明为什么图像搜索的重要性与日俱增: 1. Ask.com 的 CEO Jim Lanzone说,他们在 Ask3D 上提供的搜索结果中有 50% 不是传统的http://www.aliyun.com/zixun/aggregation/11510.html">

PostgreSQL 路径规划插件 pgruoting 介绍

    我们都知道PostgreSQL利用PostGIS插件,善于处理LBS相关的业务.     PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象.空间索引.空间操作函数和空间操作符.同时,PostGIS遵循OpenGIS的规范.  PostGIS的优势 一: 支持所有的空间数据类型,这些类型包括:点(POINT).线(LINESTRING).多边形(POLYGON).多点(MULTIPOINT).多线(MULTILINESTR

阿里研究员华先胜:图像搜索的前世今生

  以下内容为由4月27日由将门主办的"计算机视觉"主题技术专家微信群分享嘉宾实录.   自我介绍 我在2001年北大数学系十年寒窗博士毕业以后加入了微软亚洲研究院在之后9年半的时间在研究院一直从事图像和视频的分析工作.2010年底我突然变得有点迷盲虽然一直也在做产品但实际上还没有真正地上过"战场"所以当时就做了一个大家都不太看好的决定--我觉得应该真正地到"战场上打仗"看看我们实际当中的图像搜索的困难到底在哪里用户的需求和痛点到底在哪里因此之后

10 款免费的 jQuery 图像缩放插件

设计电子商务网站必知的十款免费 jQuery 图像缩放插件 Jquery 图像缩放插件不仅简单易用,而且还能够给予用户更好的体验.你只需要在图像或产品上移动鼠标,你将看到图片或产品的详细信息. 今 天,我们来分享一些 jQuery 图像缩放插件.事实上,图像缩放是很多在线购物网站最基本的组成部分.如果你是开发人员,你想在网站中使用图像缩放功能的话,推荐你使用下面十款 jquery 图像缩放插件.你可以根据需要,选择任意你想要的图像缩放插件,而且还免费哦. EasyZoom Demo | Down

拍立淘-图像搜索与识别

云栖TechDay40期,阿里巴巴iDST视觉技术总监启磐来给大家分享图像搜索和识别.本文主要从iDST和拍立淘业务开始谈起,接着分析了拍立淘技术框架,着重分析了拍立淘核心技术,最后展示了呈现效果和云服务. 移动端的以图搜图是一代又一代的图像人,搜索人的梦想.从90年代开始,学术界,工业界做了很多的努力和尝试.阿里巴巴的智能图像搜索服务-拍立淘从2014年首次上线之后,通过技术的不断打磨,已经成为淘宝每天千万级UV的应用.本次将给大家带来拍立淘中的图像搜索和识别的技术.   阿里巴巴iDST 阿