如果皮卡会coding 2022-10-18 00:56 采纳率: 75%
浏览 48
已结题

Java 比较两张图片的相似度

问题遇到的现象和发生背景

Java 已知输入为两个BufferedImage类型的图像(可能宽高不同),求两张图像的百分比相似度。
当然,实际输入为两个base64编码的字符串,先处理转为BufferedImage类型的图像了。

运行结果及报错内容

现有的一个思路是比较颜色直方图,但是会被宽高影响。没有达到一个较精确的效果。

参考

可以参考下面两个函数的输入输出,先通过base64编码的字符串输入到getData中获取颜色分布的直方图数组,而后将两张图片的数组数据传入compare中比较,得到一个百分比相似度。。但这个方法的相似度比较的数据不够精确。

    public static int[] getData(String baseStr) {
        try {
            //BufferedImage img = ImageIO.read(new File(name));
            BufferedImage img = base64ToBufferedImage(baseStr);
            BufferedImage slt = new BufferedImage(100, 100,
                    BufferedImage.TYPE_INT_RGB);
            slt.getGraphics().drawImage(img, 0, 0, 100, 100, null);
            // ImageIO.write(slt,"jpeg",new File("slt.jpg"));
            int[] data = new int[256];
            for (int x = 0; x < slt.getWidth(); x++) {
                for (int y = 0; y < slt.getHeight(); y++) {
                    int rgb = slt.getRGB(x, y);
                    Color myColor = new Color(rgb);
                    int r = myColor.getRed();
                    int g = myColor.getGreen();
                    int b = myColor.getBlue();
                    data[(r + g + b) / 3]++;
                }
            }
            // data 就是所谓图形学当中的直方图的概念
            return data;
        } catch (Exception exception) {
            System.out.println("有文件没有找到,请检查文件是否存在或路径是否正确");
            return null;
        }
    }

    public static float compare(int[] s, int[] t) {
        try {
            float result = 0F;
            for (int i = 0; i < 256; i++) {
                int abs = Math.abs(s[i] - t[i]);
                int max = Math.max(s[i], t[i]);
                result += (1 - ((float) abs / (max == 0 ? 1 : max)));
            }
            return (result / 256) * 100;
        } catch (Exception exception) {
            return 0;
        }
    }

  • 写回答

1条回答 默认 最新

  • 夜郎king 2022博客之星IT其它领域TOP 12 2022-10-18 14:47
    关注

    可以考虑基于openCV来做图片相似性的比较,可以参考这篇博文来实现。写得比较清楚:https://blog.csdn.net/u014775579/article/details/123534770

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 10月18日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵