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

相关推荐
武子康18 分钟前
Java-72 深入浅出 RPC Dubbo 上手 生产者模块详解
java·spring boot·分布式·后端·rpc·dubbo·nio
_殊途1 小时前
《Java HashMap底层原理全解析(源码+性能+面试)》
java·数据结构·算法
椰椰椰耶2 小时前
【Spring】拦截器详解
java·后端·spring
没有bug.的程序员3 小时前
JAVA面试宝典 - 《MyBatis 进阶:插件开发与二级缓存》
java·面试·mybatis
倔强青铜33 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
u_topian4 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
没有羊的王K4 小时前
SSM框架学习——day1
java·学习
珊瑚里的鱼4 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
又菜又爱coding4 小时前
安装Keycloak并启动服务(macOS)
java·keycloak
AI+程序员在路上4 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt