突出显示图像之间的差异

2023-11-22

我应该修改这个图像比较代码以突出显示/指出两个图像之间的差异。有没有办法修改此代码以突出显示图像的差异。如果没有任何有关如何进行的建议,将不胜感激。

 int width1 = img1.getWidth(null);
            int width2 = img2.getWidth(null);
            int height1 = img1.getHeight(null);
            int height2 = img2.getHeight(null);
            if ((width1 != width2) || (height1 != height2)) {
                System.err.println("Error: Images dimensions mismatch");
                System.exit(1);
            }
            long diff = 0;
            for (int i = 0; i < height1; i++) {
                for (int j = 0; j < width1; j++) {
                    int rgb1 = img1.getRGB(j, i);
                    int rgb2 = img2.getRGB(j, i);
                    int r1 = (rgb1 >> 16) & 0xff;
                    int g1 = (rgb1 >> 8) & 0xff;
                    int b1 = (rgb1) & 0xff;
                    int r2 = (rgb2 >> 16) & 0xff;
                    int g2 = (rgb2 >> 8) & 0xff;
                    int b2 = (rgb2) & 0xff;
                    diff += Math.abs(r1 - r2);
                    diff += Math.abs(g1 - g2);
                    diff += Math.abs(b1 - b2);
                }
            }
            double n = width1 * height1 * 3;
            double p = diff / n / 255.0;
            return (p * 100.0);

这个解决方案对我有用。它突出了差异,并且在我尝试过的方法中具有最佳性能。 (假设:图像大小相同。此方法尚未使用透明胶片进行测试。)

比较 1600x860 PNG 图像 50 次的平均时间(在同一台机器上):

  • JDK7 ~178 毫秒
  • JDK8 ~139 毫秒

有人有更好/更快的解决方案吗?

public static BufferedImage getDifferenceImage(BufferedImage img1, BufferedImage img2) {
    // convert images to pixel arrays...
    final int w = img1.getWidth(),
            h = img1.getHeight(), 
            highlight = Color.MAGENTA.getRGB();
    final int[] p1 = img1.getRGB(0, 0, w, h, null, 0, w);
    final int[] p2 = img2.getRGB(0, 0, w, h, null, 0, w);
    // compare img1 to img2, pixel by pixel. If different, highlight img1's pixel...
    for (int i = 0; i < p1.length; i++) {
        if (p1[i] != p2[i]) {
            p1[i] = highlight;
        }
    }
    // save img1's pixels to a new BufferedImage, and return it...
    // (May require TYPE_INT_ARGB)
    final BufferedImage out = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    out.setRGB(0, 0, w, h, p1, 0, w);
    return out;
}

Usage:

import javax.imageio.ImageIO;
import java.io.File;

ImageIO.write(
        getDifferenceImage(
                ImageIO.read(new File("a.png")),
                ImageIO.read(new File("b.png"))),
        "png",
        new File("output.png"));

一些灵感...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

突出显示图像之间的差异 的相关文章

  • 带有 Android 支持库 v7 的 Maven Android 插件

    我使用 maven android plugin 构建我的 android 应用程序 它依赖于 android 支持库 v4 和 v7 由于我没有找到如何从developer android com下载整个sdk 因此我无法使用maven
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • Spring数据中的本机查询连接

    我有课 Entity public class User Id Long id String name ManyToMany List
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • 何时在 hibernate 中使用 DiscriminatorValue 注解

    在 hibernate 中使用 DiscriminatorValue 注释的最佳场景是什么以及何时 这两个链接最能帮助我理解继承概念 http docs oracle com javaee 6 tutorial doc bnbqn html
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • GNUPLOT:尝试提高质量

    如何提高 gnuplot 的质量 看起来这是一个非常低分辨率的图像 这是我正在使用的文件的内容 linkage plot set terminal pdf set out linkage pdf set title Distribution
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从

随机推荐

  • 使用 HTML 而非 CSS 将图像链接居中

    我试图仅使用 HTML 而不使用 CSS 将图像居中 这可能吗 我尝试过以下代码 a href link img src URL align center a 然而图像并没有移动 我该如何解决这个问题 我试图居中的图像是我们的右栏上的捐赠按
  • 无法接受许可协议 Android SDK Platform 24

    尝试在 Cordova 项目上安装 Android 平台时出现以下错误 我一直在遵循这个指南 https cordova apache org docs en latest guide cli 执行以下命令时出现错误 cordova pla
  • Android 后台服务中的位置监听器

    哪种方法更好 直接实施LocationListener像这样 public class BackgroundService extends Service implements LocationListener 或通常声明LocationL
  • 增加 D3 树布局的节点之间的间隙

    如图所示 我试图增加树布局两侧最后一个节点之间的间隙 因为它们重叠 在D3中有什么办法可以实现吗 name type network children name type lb children name type mm id app
  • Firestore:多个“数组包含”

    更新这个问题 Firestore 推出了另一个与 in 查询类似的功能 即 array contains any 查询 此功能允许您同时对多个值执行包含数组的查询 使用 array contains any 运算符通过逻辑 OR 组合同一字
  • Spring 3.2 中发布的新 Spring MVC 测试框架是否测试 web.xml 配置?

    我已阅读文档 http static springsource org spring docs 3 2 x spring framework reference html testing html spring mvc test frame
  • java中的条件变量是什么?

    Q1 Java 中的 condVar 是什么 如果我看到下面的代码 条件变量是否必须位于 互斥体 acquire and 互斥体 release block public void put Object x throws Interrupt
  • 使用 querySelector 查找同级行中包含的下一个单元格

    我正在尝试使用querySelector查找表格下一行中的第一个单元格 因此 从 ROW 1 开始 找到下一个 TR 元素 然后找到该 TR 元素内的第一个子 TD 元素 但是 当我编写 CSS 选择器时 它返回null 我的 CSS 选择
  • 为什么我无法用 C++ 编译 HelloWorld?

    我正在尝试用 C 编译一个简单的 Hello World 程序 但我不断收到以下错误 为什么 gcc o HelloWorldCompiled HelloWorld cc tmp ccvLW1ei o In function main He
  • 是否存在双向多映射持久数据结构?

    换句话说 我们可以在持久数据结构中有效地建模多对多关系吗 建议使用一对单向多重映射 但是 我不确定这如何在持久数据结构中很好地进行删除 让我们以键 1 4 到值 1 4 为例 假设它们各自引用所有其他键 因此我们有两个在两个方向上看起来都非
  • 如何在 CSS 中制作图像的叠加层?

    我正在努力实现这样的目标 当我将鼠标悬停在图像上时 我想在该图像上添加一些文本和图标 这种深色颜色 我被困在这里了 我找到了一些教程 但它们不适用于这种情况 另外 还有一个问题 每个图像都有不同的高度 宽度始终相同 如何才能达到这样的效果呢
  • Django 中的模拟测试在 TestCase 中全部运行时不起作用,但一一运行良好

    在 Django 中测试视图时 我使用 python 模拟来修补一些函数和类 如果我独立运行每个测试 则所有测试都有效 但是当我运行TestCase时 一些测试不起作用 补丁没有效果 class ViewsTest TestCase moc
  • getAttribute 在 IE7 中无法返回类?

    我需要根据随机属性值找到随机节点 为此 我在 getElementsByTagName 的节点上使用 getAtrribute 似乎当我查找类名作为属性时 它在 IE 上不起作用 在 FF 上起作用 有人知道 getAtrribute 是否
  • 将数据传递给 jQuery 事件处理程序

    Scenario 在 GUI 中 用户在文本输入中插入一些文本 然后单击按钮 插入的文本将显示在 div 中 我找到了一个简单的解决方案 演示在这里 即在访问输入元素对象的处理程序内设置输出文本 太糟糕了 相反 我会将输入文本 而不是元素
  • 如何在我的 war 中包含测试类和配置以使用 Maven 进行集成测试?

    我目前有一个 Maven Web 项目 我正在尝试为其编写集成测试 对于项目的结构 我在下面定义了测试存根src 测试 java 而这些存根的 spring bean 定义位于src 测试 资源 我想做的是 当我构建 war 工件时 我希望
  • Laravel 5.1:file_put_contents() 错误中出现 ErrorException,可能没有可用磁盘空间

    这个错误是突然出现的 D xampp htdocs pckg vendor laravel framework src Illuminate Filesystem Filesystem php 第 81 行中的 ErrorException
  • SwingUtilities 中的 invokeAndWait 方法

    请解释 SwingUtilities 中的 invokeAndWait 方法 我无法理解这一点 解释得很清楚 如果您尝试一个示例 将会有很大的帮助 编辑添加 noob对问题的扩展 有什么不清楚的地方this 这是一个修改后的用法示例 imp
  • 应用程序运行时刷新 Java 中的打印机

    正如标题所示 我想在 Java 应用程序运行时刷新在计算机设置中注册的打印机 通常情况下 我可以使用PrinterJob lookupPrintServices 获得打印机 但是 这些仅在重新启动应用程序时才会刷新 我读过一些有关looku
  • 使用 OpenCV 加载 OpenGL 纹理

    我见过很多加载纹理的代码示例OpenGL 其中许多有点难以理解或需要带有大量代码的新功能 我在想 作为OpenCV允许我们加载任何图像格式 它可以是加载纹理的简单有效的方法OpenGL 但我错过了一些东西 我有这段代码c cv Mat te
  • 突出显示图像之间的差异

    我应该修改这个图像比较代码以突出显示 指出两个图像之间的差异 有没有办法修改此代码以突出显示图像的差异 如果没有任何有关如何进行的建议 将不胜感激 int width1 img1 getWidth null int width2 img2