【工具】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)

相关推荐
人邮异步社区7 分钟前
如何系统地学习 C++ 语言?
开发语言·c++·学习
QCodingDev10 分钟前
Spring AI Alibaba Graph实战:从ReAct Agent到Workflow,企业AI复杂流程该如何编排?
java·人工智能·spring·ai·ai编程·企业ai
一嘴一个橘子12 分钟前
SpringDataRedis 操作 redis
java·redis
JasmineWr15 分钟前
Spring BeanDefinition 与 Bean 生命周期、循环依赖解析
java·后端·spring
dzl8439416 分钟前
微服务基座
java
知识分享小能手17 分钟前
概理论与数理统计学习教程,从入门到精通,在数理统计中应用R软件(21)
开发语言·学习·r语言
Data_Journal18 分钟前
Playwright vs Selenium:哪个是最佳无头浏览器
开发语言·python·scrapy·microsoft·编辑器
QQ_216962909622 分钟前
【项目编号:project86564】SpringBoot供应链管理系统:采购、供应商、库存、销售、统计报表一体化实战
java·spring boot·后端
m0_5873830023 分钟前
课程培训系统开发实战:从技术选型到核心模块设计
java·spring boot·架构·系统架构
Chester_199924 分钟前
CSP202104C.DHCP服务器
开发语言·程序人生·蓝桥杯