使用 ImageMagick 对图像进行平等测试

2023-11-29

ImageMagick 库中有相等谓词函数吗?我想比较两个图像并找出它们是否完全相同(像素的所有颜色都相同)或有任何差异。

我查了一下,好像没有这个功能。我应该自己使用像素迭代器编写函数吗?


ImageMagick 提供compare功能来正确比较图像。

检查md5两个图像的校验和不是正确的方法,因为某些图像格式(例如带有 EXIF 的 PNG 和 JPEG)包含创建文件的日期和时间(请参见下面的示例 1),并且某些文件可能在视觉上相同但表示形式相同内部完全不同(参见示例 2),或者具有不同的位深度(参见示例 3)。

实施例1

# Create two identical images (100x100 pixels, bright red) but with different file contents
convert -size 100x100 xc:red r1.png
convert -size 100x100 xc:red r2.png

# MD5 checksum them
md5 r?.png
MD5 (r1.png) = 9f6d612615efd88c3fd8521d717e9811
MD5 (r2.png) = 996911bec0e0da75af46a1e78c052998      # Mmmm different

# Ask IM to tell us absolute error between the two (number of differing pixels)
compare -metric AE r1.png r2.png null:
0                                                    # No difference - that's better

为什么这两者的 MD5 不同?因为日期就在里面...

identify -verbose r[12].png | grep -i date
date:create: 2015-03-03T14:57:26+00:00
date:modify: 2015-03-03T14:57:26+00:00
date:create: 2015-03-03T14:57:43+00:00
date:modify: 2015-03-03T14:57:43+00:00

实施例2

# Create PNG and identical GIF
convert -size 100x100 xc:red r.png
convert -size 100x100 xc:red r.gif

# Compare with MD5 sums
md5 r.png r.gif
MD5 (r.png) = 692ef06b62a15b799d5dc549b0dd3737
MD5 (r.gif) = 549feea78dc438924fbb3e0ef97dc0b3         # Ooops

# Compare properly
compare -metric AE r.gif r.png null:
0                                                      # Identical

实施例3

# Create 8-bit PNG and 16-bit PNG
convert -size 100x100 xc:red PNG8:8.png
convert -size 100x100 xc:red PNG48:48.png

# MD5 sum them
md5 8.png 48.png
MD5 (8.png) = eb3fc9a06e1632c3b41ebb986b81a816
MD5 (48.png) = 32fdf1c30793a4fed941c91d27084e0a   # Ooops

# Let ImageMagick compare them
compare -metric AE 8.png 48.png  null:
0

图像模糊比较

正如库尔特提到的,这也导致了做一个fuzzy图像比较。我们可以这样探索:

# Create a grey image, 100x100 and put some noise in it
convert -size 100x100 xc:gray +noise gaussian noise.png

enter image description here

现在将所有像素乘以 1.01,使它们的亮度提高难以察觉的 1%:

# Make pixels 1% brighter
convert noise.png -evaluate multiply 1.01 brighternoise.png

# ... and compare the statistics of the two images
identify -verbose *noise* | grep -E "^Image|mean"

Image: brighternoise.png
  mean: 127.235 (0.498959)       <--- The brighter image is, well, brighter
Image: noise.png
  mean: 126.175 (0.494805)

现在通过几种不同的方式对它们进行比较:

# Pixels may differ by up to 2% before being considered different
compare -fuzz 2% -metric AE noise.png brighternoise.png null:
0        # All pixel values within 2% between the 2 images

# Pixels may only differ by 0.5% before being considered different
compare -fuzz 0.5% -metric AE noise.png brighternoise.png null:
594      # 594 of the 10,000 pixels differ by more than 0.5%

# Calculate Root Mean Square Error (RMSE) to see how much pixels tend to differ
compare -metric RMSE noise.png brighternoise.png null:
278.96 (0.00425666)    # On average, the pixels differ by 0.4% - i.e. hardly at all
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ImageMagick 对图像进行平等测试 的相关文章

  • 在哪里可以获取 MAMP 上 ImageMagick 的 libfreetype.6.dylib 版本 16.0.0

    在 MAMP 下运行 imagemagick 时 出现错误消息 command output dyld Library not loaded opt local lib libfreetype 6 dylib Referenced from
  • Switch 语句,其中 value 为 Int 但 case 可以包含数组 [重复]

    这个问题在这里已经有答案了 我想将我的值数组作为 switch 语句的案例 我有一个值数组 let intValues 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 100 我想使用
  • 为什么 if 语句中的赋值等于 true?

    首先我要说的是我理解两者之间的区别 and 第一个用于将右侧值分配给左侧变量 第二个用于比较两个值的等价性 第三个不仅用于等价性 还用于类型比较 即true 1会回来false 所以我知道almost任何时候你看到if 作者很有可能打算使用
  • 比较两台服务器的 IIS 设置的最快方法是什么?

    对于在两台运行 IIS 的 Windows 2003 Server 上运行的应用程序 我得到的结果不一致 有没有办法快速将 IIS 配置转储到文件中进行比较 有没有比较两个 IIS 服务器的好工具 Give 元数据库浏览器 http blo
  • ImageMagick 没有解码委托

    我正在尝试使用 imagemagick 转换图像 但收到此错误 转换 此图像格式 i imgur com nTheJ jpg 没有解码委托 error constitute c ReadImage 532 我正在这样做 convert ht
  • 等于方法实现助手 (C#)

    每次我编写一些数据类时 我通常都会花很多时间编写 IEquatable 实现 我写的最后一堂课是这样的 public class Polygon public Point Vertices get set 实施 IEquatable 是一项
  • 无法安装 RMagick 0.0.0。找不到 Magick 配置

    我正在运行 debian 服务器并在一段时间后升级了所有软件包 apt get update apt get upgrade apt get distro upgrade 然后 rmagick 不再工作了 因为 imagemagick 被更
  • VB.Net 中的文件比较

    我需要知道两个文件是否相同 起初我比较了文件大小和创建时间戳 但这不够可靠 我想出了下面的代码 似乎可行 但我希望有人有更好 更简单或更快的方法 基本上我正在做的是将文件内容流式传输到字节数组 并通过 System Security Cry
  • 缩小图像尺寸 imagemagick

    我尝试过压缩图像但没有成功 看我的小实验 var results new Dictionary
  • 为什么此 DirectoryInfo 比较不起作用? [复制]

    这个问题在这里已经有答案了 可能的重复 如何检查2个DirectoryInfo对象是否指向同一个目录 https stackoverflow com questions 1794025 how to check whether 2 dire
  • CharBuffer equals() 方法到底是如何工作的?

    我无法理解具体细节CharBuffer equals 方法发挥作用 我不明白这个 独立于他们的起始位置考虑 这句话 两个字符缓冲区相等当且仅当 它们具有相同的元素类型 它们具有相同数量的剩余元素 并且 The 剩余元素的两个序列 独立考虑
  • 对比有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 中的空检查 https stackoverflow com questions 2369226 null check in java 我只是想知道两者之间有什么区别 if null some
  • 如何转换 Base64 图像?

    我正在尝试使用 ImageMagick 中的 转换 命令行工具 我有一个 base64 编码的 png 文件 我需要将其转换为另一种格式 我正在看文档 http www imagemagick org Usage files and a 论
  • 如何在没有 __hash__ 的情况下删除对象列表中的重复项

    我有一个自定义对象列表 我想从中删除重复项 通常 您可以通过定义两者来做到这一点 eq and hash 为你的对象 然后采取set的对象列表 我已经定义了 eq 但我想不出一个好的实现方法 hash 这样它对于相等的对象返回相同的值 更具
  • Imagick setColor 不适用于 php

    我尝试将所有像素设置为黑色 但它不起作用 我得到与原始图像相同的图像 这是我的代码 image new Imagick DIR image new jpg i 0 j 0 while i lt 100 j 0 while j lt 100
  • 使用 ImageMagick 有效地将线扫描图像拼接在一起

    我正在寻找线扫描相机的替代品 用于体育计时 或者更确切地说 用于需要确定位置的部分 我发现普通工业相机可以轻松与商业相机解决方案的速度相匹配 每秒 gt 1000 帧 对于我的需求来说 通常计时的准确性并不重要 重要的是运动员的相对位置 我
  • 在将图像上传到 firebase 之前调整图像大小

    Firebase 存储看起来非常酷且易于使用 但我想知道是否有一种方法可以在将图像上传到 Firebase 存储之前调整图像大小 例如 在服务器中使用 ImageMagick 运行一个进程 然后使用 Firebase SDK 运行上传过程
  • Python 如何比较字符串和整数?

    给出以下代码 a 1 if a 1 print yes else print no 我们得到的输出为no Python 如何将字符串值与 int 进行比较 if a 1 在 C 中 这样的比较会产生错误 因为这是比较不同的类型 Python
  • 纵向比较 R 中的值...并进行扭转

    我有许多人在多达四个时间段进行的测试结果 这是一个示例 dat lt structure list Participant ID c A A A A B B B B C C C C phase structure c 1L 2L 3L 4L
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an

随机推荐

  • 为什么调用 JFrame.pack() 会添加额外的空间?

    最初 我使用的代码工作正常 但有点复杂 将方法的某些部分移入 JFrame 的构造函数后 一切正常 除了使用 pack 使框架具有适当的尺寸之外的一切 这是原始代码 public class BaseGameFrame extends JF
  • 处理 Spring @RequestParam 的重复值

    我有一个 Spring 3 2 控制器 具有基本的请求映射 例如 RequestMapping action public String action RequestParam param String param do stuff ret
  • HERE API 从不运行批处理作业,始终返回接受状态

    由于某种原因 我的应用程序今天早上停止工作 提交作业后 请求其状态时 仅返回accepted 这是我用来创建和运行作业的代码 url https batch geocoder api here com 6 2 jobs action run
  • 重写原型上内置方法的类型

    默认类型为hasOwnProperty is hasOwnProperty v PropertyKey boolean 然而 这阻止我做这样的事情 const obj a 1 function foo str string if obj h
  • 如何将函数应用于类的所有元素

    我有一个函数 我想将其应用于同一类的多个元素 这是一个滚动页面函数 我只需要它执行一次 所以我把它放在包装纸里 它有效 但我希望能够向元素添加一个类并让它作用于该元素 我尝试迭代元素并使用 addClass 添加一个唯一的类 并将各自的索引
  • 使用 hibernate 进行复杂查询(例如每组前 N 个)的最佳方法

    我现在正在开发一个报告应用程序一段时间 我使用 hibernate 来定义我的查询 然而 我越来越觉得对于报告用例来说这不是最好的方法 查询仅产生部分列 因此不是类型对象 除非你在java中转换所有字段 如果不直接使用 sql 或 总部 我
  • 转换 int -> unsigned long long 是否由标准定义

    我找不到具体的说明int值转换为unsigned long long在标准中 指定了各种类似的转换 如int gt unsigned unsigned gt int 负数则为UB unsigned long long gt int等 例如海
  • Mod_security 有时会阻止我的 ajax 脚本 - 我怎样才能找出原因?

    我使用 php 和 mysql 构建了某种 CMS 应用程序 一切在本地主机上都运行得很好 所以我把它移到了网络上 现在 当有人添加新文章时 我遇到了奇怪的问题 有时它只是正常添加 有时用户会收到此错误 不可接受 所请求资源的适当表示 在此
  • 是否可以从 PropertyGrid 隐藏枚举值?

    我正在与PropertyGrid控制和使用SelectedObject属性来显示数据PropertyGrid 我的网格中的一些属性是枚举类型 我想要做的是向用户隐藏枚举中的一些选择 以下面的示例为例 我想向用户隐藏 Error 的枚举 有没
  • 我们可以通过android中的模拟器发送短信吗?

    我想检查通过模拟器发送到手机的短信 我们可以这样做吗 我不知道是否可以将短信从模拟器发送到设备 但可以将短信从一个模拟器实例发送到另一个模拟器实例 使用模拟器端口号作为接收者电话号码 即 如果模拟器在端口 5444 上运行 则必须使用 54
  • 需要 Handlebars.js 来渲染对象数据而不是“[Object object]”

    我正在使用 Handlebars 模板 并且 JSON 数据已在 Object object 中表示 如何在 Handlebars 之外解析此数据 例如 我尝试通过句柄标签填充页面上的 JavaScript 变量 但这不起作用 有什么建议么
  • 如何以编程方式将 WPF TreeView 绑定到 List

    因此 我对 WPF 非常陌生 并尝试将 Drink 值列表绑定或分配给 wpf 树视图 但不知道如何执行此操作 并且发现很难在网上找到任何不使用 xaml 只显示内容的内容 struct Drink public string Name g
  • PHP Oauth 签名_无效

    我无法理解为什么这不起作用 我真的认为它应该是这样 请帮忙 这是我得到的错误 signature invalid base string GET https 3A 2F 2Fwww google com 2Faccounts 2FOAuth
  • 无法在 R 中初始化 CoreNLP

    我无法访问coreNLP在运行 High Sierra 的 Mac 上用 R 编写 我不确定问题是什么 但似乎每次我再次尝试获取coreNLP工作时 我面临着不同的错误 我有 JDK 9 0 4 请参阅下面的代码 了解我正在尝试执行的操作以
  • CLR 存储过程中的多线程代码?

    多线程 CLR 存储过程可能吗 我有一项数据密集型任务 具有很大的并行化潜力 CLR 存储过程非常适合消除将数据移出进程的开销 但我担心我必须放弃并行计算 我有什么选择 注意 我们使用的是 SQL Server 2005 计划在 4 个月内
  • 如何将 UIView、UIImageView 或 CALayer 动画旋转 360°?

    你如何旋转UIView UIImageView or CALayer不使用 OpenGL ES 进行 360 度动画 import
  • ASP.NET 和 STA COM 对象

    想要在这里解决争论 我读过的关于使用 VB 中从 ASP NET 页面创建的 COM 对象的所有内容都围绕着 警告 请确保安装了 ASPCOMPAT 否则它将无法工作 然而 我已经设置好了 你猜怎么着 没问题 现在 我读到了这个 http
  • PHP 和 XML。使用 PHP 循环 XML 文件

    我现在正陷入 foreach 炼狱中 试图想出一种用 PHP 遵循 XML 文件内容 遍历这个 XML 文件 下面的实际 XML 文本 的方法 我想做的是 获取所有文件夹元素名称 如果文件夹元素的子文件夹属性为 yes 则向下移动一级并获取
  • 在 Google Compute Engine 上从没有公共 IP 的计算机路由到互联网

    在 Google Compute Engine 上 我们有没有公共 IP 的机器 因为配额限制了可以拥有公共 IP 地址的机器数量 我们需要这些非公共 IP 机器来访问 Google 存储桶中的数据 这似乎意味着我们必须路由到互联网 但我们
  • 使用 ImageMagick 对图像进行平等测试

    ImageMagick 库中有相等谓词函数吗 我想比较两个图像并找出它们是否完全相同 像素的所有颜色都相同 或有任何差异 我查了一下 好像没有这个功能 我应该自己使用像素迭代器编写函数吗 ImageMagick 提供compare功能来正确