Java基于相似算法实现以图搜图

一、简述

  本文主要讲如何利用图片相似性算法,基于LIRE来实现图片搜索。

二、依赖

   <dependencies><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>6.3.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId><version>6.3.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId><version>6.3.0</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-math3</artifactId><version>3.6.1</version></dependency><!-- https://mvnrepository.com/artifact/com.sangupta/jopensurf --><dependency><groupId>com.sangupta</groupId><artifactId>jopensurf</artifactId><version>1.0.0</version></dependency></dependencies>

二、样例1

  Data目录下存放所有图片的样本。

package com.dearcloud.imagesearch;import net.semanticmetadata.lire.aggregators.AbstractAggregator;
import net.semanticmetadata.lire.aggregators.BOVW;
import net.semanticmetadata.lire.builders.DocumentBuilder;
import net.semanticmetadata.lire.imageanalysis.features.global.CEDD;
import net.semanticmetadata.lire.imageanalysis.features.local.opencvfeatures.CvSurfExtractor;
import net.semanticmetadata.lire.imageanalysis.features.local.simple.SimpleExtractor;
import net.semanticmetadata.lire.indexers.parallel.ParallelIndexer;
import net.semanticmetadata.lire.searchers.GenericFastImageSearcher;
import net.semanticmetadata.lire.searchers.ImageSearchHits;
import net.semanticmetadata.lire.searchers.ImageSearcher;
import net.semanticmetadata.lire.utils.FileUtils;
import net.semanticmetadata.lire.utils.ImageUtils;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.FSDirectory;import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;public class IndexingAndSearchWithLocalFeatures {public static void main(String[] args) throws IOException {String indexPath = "D:\\以图搜图\\衬衣\\index";String imageData = "D:\\以图搜图\\衬衣\\Data";indexer(indexPath, imageData);String searchImage = "D:\\以图搜图\\衬衣\\search\\timg.jpg";String searchOutputFolder = "D:\\以图搜图\\衬衣\\output";search(indexPath, searchImage, searchOutputFolder);}/*** Indexing data using OpenCV and SURF as well as CEDD and SIMPLE.* @param indexFolder* @param imageDirectory*/private static void indexer(String indexFolder, String imageDirectory) {// Checking if arg[0] is there and if it is a directory.boolean passed = false;// use ParallelIndexer to index all photos from args[0] into "index".int numOfDocsForVocabulary = 500;Class<? extends AbstractAggregator> aggregator = BOVW.class;int[] numOfClusters = new int[]{128};ParallelIndexer indexer = new ParallelIndexer(DocumentBuilder.NUM_OF_THREADS, indexFolder, imageDirectory, numOfClusters, numOfDocsForVocabulary, aggregator);indexer.setImagePreprocessor(image -> ImageUtils.createWorkingCopy(image));//Localindexer.addExtractor(CvSurfExtractor.class);//Simpleindexer.addExtractor(CEDD.class, SimpleExtractor.KeypointDetector.CVSURF);indexer.run();System.out.println("Finished indexing.");}/*** Linear search on the indexed data.* @param indexPath* @throws IOException*/public static void search(String indexPath, String searchFile, String searchOutputFolder) throws IOException {IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(indexPath)));// make sure that this matches what you used for indexing (see below) ...ImageSearcher imgSearcher = new GenericFastImageSearcher(1000, CEDD.class, SimpleExtractor.KeypointDetector.CVSURF, new BOVW(), 128, true, reader, indexPath + ".config");// just a static example with a given image.ImageSearchHits hits = imgSearcher.search(ImageIO.read(new File(searchFile)), reader);for (int i = 0; i < hits.length(); i++) {double score = hits.score(i);String imagePath = reader.document(hits.documentID(i)).getValues(DocumentBuilder.FIELD_NAME_IDENTIFIER)[0];System.out.printf("%.2f: (%d) %s\n", score, hits.documentID(i), imagePath);}String outputHtmlReport = FileUtils.saveImageResultsToHtml("search-", hits, searchFile, reader);System.out.println("Report:" + outputHtmlReport);org.apache.commons.io.FileUtils.copyFile(org.apache.commons.io.FileUtils.getFile(outputHtmlReport), org.apache.commons.io.FileUtils.getFile(searchOutputFolder, outputHtmlReport));}}

三、样例2

  1、Indexer

package com.dearcloud.imagesearch;import net.semanticmetadata.lire.builders.GlobalDocumentBuilder;
import net.semanticmetadata.lire.imageanalysis.features.global.AutoColorCorrelogram;
import net.semanticmetadata.lire.imageanalysis.features.global.CEDD;
import net.semanticmetadata.lire.imageanalysis.features.global.FCTH;
import net.semanticmetadata.lire.utils.FileUtils;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Iterator;public class LireIndexer {public static void main(String[] args) throws IOException {String indexPath = "D:\\以图搜图\\全部\\index";String imageData = "D:\\以图搜图\\全部\\Data";index(indexPath, imageData);}private static void index(String indexFolder, String imageDirectory) throws IOException {// Getting all images from a directory and its sub directories.ArrayList<String> images = FileUtils.getAllImages(new File(imageDirectory), true);// Creating a CEDD document builder and indexing all files.GlobalDocumentBuilder globalDocumentBuilder = new GlobalDocumentBuilder(false, false);/*If you want to use DocValues, which makes linear search much faster, then use.However, you then have to use a specific searcher!*/// GlobalDocumentBuilder globalDocumentBuilder = new GlobalDocumentBuilder(false, true);/*Then add those features we want to extract in a single run:*/globalDocumentBuilder.addExtractor(CEDD.class);globalDocumentBuilder.addExtractor(FCTH.class);globalDocumentBuilder.addExtractor(AutoColorCorrelogram.class);// Creating an Lucene IndexWriterIndexWriterConfig conf = new IndexWriterConfig(new WhitespaceAnalyzer());IndexWriter iw = new IndexWriter(FSDirectory.open(Paths.get(indexFolder)), conf);// Iterating through images building the low level featuresfor (Iterator<String> it = images.iterator(); it.hasNext(); ) {String imageFilePath = it.next();System.out.println("Indexing " + imageFilePath);try {BufferedImage img = ImageIO.read(new FileInputStream(imageFilePath));if (img == null) continue;Document document = globalDocumentBuilder.createDocument(img, imageFilePath);iw.addDocument(document);} catch (Exception e) {System.err.println("Error reading image or indexing it.");e.printStackTrace();}}// closing the IndexWriteriw.close();System.out.println("Finished indexing.");}
}

  2、Searcher

package com.dearcloud.imagesearch;import net.semanticmetadata.lire.builders.DocumentBuilder;
import net.semanticmetadata.lire.imageanalysis.features.global.CEDD;
import net.semanticmetadata.lire.searchers.GenericFastImageSearcher;
import net.semanticmetadata.lire.searchers.ImageSearchHits;
import net.semanticmetadata.lire.searchers.ImageSearcher;
import org.apache.commons.io.FileUtils;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.FSDirectory;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.file.Paths;public class LireSearcher {public static void main(String[] args) throws IOException {String indexPath = "D:\\以图搜图\\全部\\index";String searchImage = "D:\\以图搜图\\全部\\search\\timg.jpg";String searchOutputFolder = "D:\\以图搜图\\全部\\output";search(indexPath, searchImage, searchOutputFolder);}private static void search(String indexFolder, String searchFile, String searchOutputFolder) throws IOException {BufferedImage img = ImageIO.read(FileUtils.getFile(searchFile));IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(indexFolder)));ImageSearcher searcher = new GenericFastImageSearcher(30, CEDD.class);// ImageSearcher searcher = new GenericFastImageSearcher(30, AutoColorCorrelogram.class); // for another image descriptor .../*If you used DocValues while Indexing, use the following searcher:*/// ImageSearcher searcher = new GenericDocValuesImageSearcher(30, CEDD.class, ir);// searching with a image file ...ImageSearchHits hits = searcher.search(img, reader);// searching with a Lucene document instance ...// ImageSearchHits hits = searcher.search(ir.document(0), ir);for (int i = 0; i < hits.length(); i++) {String fileName = reader.document(hits.documentID(i)).getValues(DocumentBuilder.FIELD_NAME_IDENTIFIER)[0];System.out.println(hits.score(i) + ": \t" + fileName);}String outputHtmlReport = net.semanticmetadata.lire.utils.FileUtils.saveImageResultsToHtml("search-", hits, searchFile, reader);System.out.println("Report:" + outputHtmlReport);org.apache.commons.io.FileUtils.copyFile(org.apache.commons.io.FileUtils.getFile(outputHtmlReport), org.apache.commons.io.FileUtils.getFile(searchOutputFolder, outputHtmlReport));}
}

四、素材

   

    

  

五、LIRE支持的算法

  

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1549735.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

7.MySQL内置函数

目录 日期函数时间函数字符串函数数学函数其他函数 日期函数 函数名称描述current_date()当前日期current_time()当前时间current_timesamp()当前时间戳date(datetime)返回datetime参数的日期部分date_add(date, interval d_value_tyep)在date中添加日期函数或时间。interval后…

项目计划软件如何助力企业策略规划和执行监控

项目管理软件助力任务、时间和协作管理&#xff0c;如ZohoProjects集成了任务管理、时间跟踪、协作工具等功能&#xff0c;提高性价比&#xff0c;适合不同规模团队。其简化流程、专业度高&#xff0c;成为企业提升效率的重要工具。 一、项目计划软件的由来 项目计划软件的历史…

在线代码编辑器

在线代码编辑器 文章说明前台核心代码后台核心代码效果展示源码下载 文章说明 采用Java结合vue3设计实现的在线代码编辑功能&#xff0c;支持在线编辑代码、运行代码&#xff0c;同时支持导入文件&#xff0c;支持图片识别&#xff0c;支持复制代码&#xff0c;可将代码导出为图…

Cookie、Session、Token(JWT)还不懂?

Cookie、Session、Token&#xff08;JWT&#xff09; 三者的区别与用途&#xff01;如何进行身份认证&#xff0c;保持用户登录状态&#xff1f; Cookie、Session 和 Token 都是在 Web 开发中用于管理用户状态和进行身份认证的技术&#xff0c;它们之间有以下区别和用途&#…

一步步带你Linux内核编译与安装

Linux内核编译与安装 安装流程 #mermaid-svg-0PfY2uowOUJaN2Ov {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-icon{fill:#552222;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-text{fill:#5522…

地区环境保护支出数据(2007-2023年)

政府环境保护支出是指ZF在环境保护方面投入的CZ资金&#xff0c;用于自然生态保护、污染防治、环境监测与监管等多个领域&#xff0c;旨在改善环境质量、防范环境风险以及促进可持续发展 一、数据介绍 数据名称&#xff1a;地区环境保护支出数据 数据范围&#xff1a;中国31…

yakit使用教程(二,配置证书并进行抓包改包操作)

前文链接&#xff1a;yakit下载安装教程。 一&#xff0c;下载并配置证书。 点击mitm&#xff0c;在跳转后的页面点击高级配置。 点击证书下载。 点击下载到本地并打开&#xff08;建议下载到桌面&#xff09;。 在火狐浏览器下载并安装FoxyProxy&#xff0c;具体参数配置如上…

一文上手skywalking【上】

一、skywalking预览 1.1 skywalking 概述 ​ Apache SkyWalking, 适用于分布式系统的应用程序性能监控工具&#xff0c;专为微服务、云原生和基于容器的 &#xff08;Kubernetes&#xff09; 架构而设计。官方地址: https://skywalking.apache.org/ 适用于分布式系统的应用程…

Humans or LLMs as the Judge? A Study on Judgement Bias

文章目录 题目摘要引言相关作品论法官的偏见实验方案结果与讨论欺骗LLM法官结论 题目 人类还是LLMs作为裁判&#xff1f;判断偏差研究 论文地址&#xff1a;https://arxiv.org/pdf/2402.10669 摘要 采用人类和大型语言模型(LLM)作为评估LLM性能的评判者(也称为人类和LLM-as-a…

Java语法-类和对象之抽象类和接口

1.抽象类 1.1 抽象类的概念 一个类中没有足够的信息来描述一个具体的对象,这样的类就是抽象类 比如: 从图中我们可以看出,只有继承了的类,我们产生的实例,调用的draw方法都是他们本身重写的draw方法,不会调用父类Shape的draw()方法,因此我们可以不管父类里面的draw()方法里面的…

第十四届蓝桥杯真题Java c组A.求和(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;蓝桥杯关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 【问题描述】 求1(含)至 20230408(含)中每个数的和。 【答案提交】 这是一道结…

24年下重庆事业单位考试报名超详细流程

&#x1f388;提交报考申请 考生通过重庆市人力资源和社会保障局官网&#xff08;rlsbj.cq.gov.cn&#xff09;“热点服务”中“人事考试网上报名”栏进行报名。报名时间为2024年8月12日9:00—8月17日9:00。 &#x1f388;网上缴费 资格初审合格后&#xff0c;考生应在2024年8…

flink设置保存点和恢复保存点

增加了hdfs package com.qyt;import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.runtime.state.storage.FileSystemCheckpointStorage;import org.apache.flink.streaming.api.datastream.Dat…

精通推荐算法32:行为序列建模总结

1 行为序列建模总体架构 2 行为序列整体总结 用户行为序列建模是推荐算法中至关重要的一环&#xff0c;也是目前较为核心和前沿的研究方向。其主要分为短序列建模和长序列建模两大方向。短序列建模又主要分为池化和序列化两种方式&#xff0c;其中池化包括Sum-Pooling、Averag…

信道衰落的公式

对于天线&#xff1a; 对于天线的面积计算&#xff1a; 天线的接收功率密度&#xff1a; 天线的接收功率&#xff1a; 移动无线信道&#xff08;I&#xff09; (xidian.edu.cn)https://web.xidian.edu.cn/zma/files/20150710_153736.pdf 更加常用的考虑了额外的信道衰落pathlo…

甘肃辣椒油:舌尖上的热辣诱惑

&#x1f4a5;宝子们&#xff0c;今天必须要给你们安利甘肃食家巷的辣椒油&#x1f336;️&#xff01;✨甘肃辣椒油&#xff0c;那可是有着独特魅力的美食瑰宝&#x1f60d;。它以其鲜艳的色泽、浓郁的香气和醇厚的辣味&#xff0c;瞬间点燃你的味蕾&#x1f525;。&#x1f3…

《Spring Boot应用进阶:打造优雅的错误处理机制与全局异常拦截器》

文章目录 自定义异常类AppException封装业务有关的枚举类AppExceptionCodeMsg全局异常拦截器Handler响应类模板Resp案例展示 || Demo项目结构pom依赖DemoController实际执行结果 Demo案例Git地址 | Gitee 本文主要介绍自己在工作中在处理抛出异常类和封装响应类处理的模板总结。…

【matlab画多纵坐标图像】

一 、什么是多纵坐标图像 多纵坐标图像是一种在同一个坐标系中&#xff0c;使用多个纵坐标轴来表示不同的数据指标的图像。在多纵坐标图中&#xff0c;每个纵坐标轴可以有不同的刻度和单位&#xff0c;用于表示不同的数据范围。这样可以方便地比较不同指标的变化趋势&#xff0…

【C语言】单片机map表详细解析

1、RO Size、RW Size、ROM Size分别是什么 首先将map文件翻到最下面&#xff0c;可以看到 1.1 RO Size&#xff1a;只读段 Code&#xff1a;程序的代码部分&#xff08;也就是 .text 段&#xff09;&#xff0c;它存放了程序的指令和可执行代码。 RO Data&#xff1a;只读…

供应链 | 顶刊POMS论文精读:交易成本经济学(TCE)——供应链效率理论

编者按 供应链效率提升指南&#xff1a;不可不知的TCE理论视角 本文为Production and Operations Management 期刊论文&#xff0c;原文信息&#xff1a; Ketokivi, M., & Mahoney, J. T. (2020). Transaction cost economics as a theory of supply chain efficiency. …