【工具】Java计算图片相似度

【工具】Java图片相似度匹配工具

方案一

通过像素点去匹配

java 复制代码
    /**
     * 
     * @param file1Url   图片url
     * @param file2Url   图片url
     * @return
     */
    public static double img相似度Url(String file1Url, String file2Url){
        InputStream inputStream1 = HttpUtil.createGet(file1Url).execute().bodyStream();
        InputStream inputStream2 = HttpUtil.createGet(file2Url).execute().bodyStream();

        BufferedImage image1 = ImgUtil.read(inputStream1);
        BufferedImage image2 = ImgUtil.read(inputStream2);
        try {
            inputStream1.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            inputStream2.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
//
//        String Base641 = Base64.encode(inputStream1);
//        String Base642 = Base64.encode(inputStream2);
//
//
//        if(StrUtil.equals(Base641, Base642)){
//            return 100;
//        }
        
        return WTool.img相似度(image1, image2);
    }


    /**
     * 必须宽高一样
     * 通过像素点逐个去比对
     * @param file1
     * @param file2
     * @return
     */
    public static double img相似度(BufferedImage file1, BufferedImage file2){

        int aheight = file1.getHeight();
        int awidth = file1.getWidth();

        int bHeight = file2.getHeight();
        int bWidth = file2.getWidth();

        if(aheight != bHeight){
            System.out.println("高度不同");
            System.out.println(aheight);
            System.out.println(bHeight);
            return 0;
        }
        if(awidth != bWidth){
            System.out.println("宽度不同");
            System.out.println(awidth);
            System.out.println(bWidth);
            return 0;
        }
        int 不相同点 = 0;
        int sum = aheight * bWidth;
        for (int i = 0; i < aheight; i++) {
            for (int i1 = 0; i1 < bWidth; i1++) {
                int rgba = file1.getRGB(i1, i);
                int rgbb = file2.getRGB(i1, i);

                if(rgba != rgbb){
                    不相同点++;
                }
            }
        }
        BigDecimal 不相同点Big  = new BigDecimal(不相同点);
        BigDecimal sumBig  = new BigDecimal(sum);
        BigDecimal big100  = new BigDecimal(100);
        BigDecimal 相似度Big = big100.subtract(不相同点Big.divide(sumBig, MathContext.DECIMAL32).multiply(new BigDecimal(100)));
        int 相似度 = 相似度Big.intValue();
        log.info("共:{}, 不相同点:{}, 相似度:{}%", sum, 不相同点, 相似度);

        file1.flush();
        file2.flush();
        return 相似度Big.doubleValue();
    }

依赖

XML 复制代码
        <!--hutool工具集-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.22</version>
        </dependency>

加强优化方案

1 加载两张待比较的图片;

2 将图片转换为灰度图像;

3 对灰度图像进行降噪处理;

4 提取图像特征,例如使用SIFT算法提取关键点和描述子;

4 计算图像相似度,比较两张图片的特征数据;

5 根据相似度的结果进行判断,确定两张图片是否相似。

其他方案

一个常用的库是OpenCV(Open Source Computer Vision Library)

相关推荐
ALex_zry18 小时前
深入解析gRPC C++动态反射:实现Proto消息的智能字段映射
开发语言·c++
幸运小圣18 小时前
for...of vs for 循环全面对比【前端JS】
开发语言·前端·javascript
liu****18 小时前
12.线程同步和生产消费模型
linux·服务器·开发语言·c++·1024程序员节
学习编程的Kitty18 小时前
JavaEE初阶——多线程(5)单例模式和阻塞队列
java·开发语言·单例模式
m0_3722570218 小时前
项目下有多个模块,每个模块有pom文件,是怎么继承的
java·tomcat
oak隔壁找我19 小时前
Spring AI 入门教程,使用Ollama本地模型集成,实现对话记忆功能。
java·人工智能·后端
懒羊羊不懒@19 小时前
JavaSe—Stream流☆
java·开发语言·数据结构
郝开19 小时前
最终 2.x 系列版本)2 - 框架搭建:pom配置;多环境配置文件配置;多环境数据源配置;测试 / 生产多环境数据源配置
java·spring boot·后端
Js_cold19 小时前
(* clock_buffer_type=“NONE“ *)
开发语言·fpga开发·verilog·vivado·buffer·clock
Homeey19 小时前
深入理解ThreadLocal:从原理到架构实践的全面解析
java·后端