ImageMagick 和 GraphicsMagick 有什么区别?

2024-02-03

我发现自己正在评估这两个库。除了 GraphicsMagick 的比较之外,我发现 ImageMagick 仍然有更新,而且看起来两者几乎相同。

我只是想用 C++ 进行基本的图像操作(即图像加载、过滤器、显示);在这些库之间进行选择时我应该注意什么差异吗?


就像生活中的许多事情一样,不同的人对于什么是最好的有不同的想法。如果你问一位在苏格兰山区雨中漫步的风景摄影师,世界上最好的相机是什么,他会告诉你一款重量轻、防风雨的相机。询问工作室摄影师,他会告诉您具有最佳闪光同步速度的最高分辨率。如果您问一位体育摄影师,他会告诉您自动对焦最快和帧速率最高的摄影师。 ImageMagick 和 GraphicsMagick 也是如此。

在过去 5 年多的时间里,我在 ImageMagick 上回答了大约 2,000 个 StackOverflow 问题,得出以下结论......

从人气上来说...

  • SO 上的 ImageMagick 问题数量比 GraphicsMagick 问题数量多出 12:1(2019 年 5 月有 7,375 个问题 vs 611 个问题),并且
  • SO 上的 ImageMagick 关注者数量比 GraphicsMagick 关注者数量多 15:1((2019 年 5 月为 387 名关注者,而 25 名关注者)

在性能方面...

我很高兴地承认 GraphicsMagick 对于某些问题可能更快,但不是所有问题。但是,如果速度是您最重要的考虑因素,我认为您可能应该使用libvips,或当今多核 CPU 上的并行代码或高度 SIMD 优化(或 GPU 优化)的库(如 OpenCV)。

在功能和灵活性方面...

这里有一个非常明显的赢家 - ImageMagick。我的经验是,GraphicsMagick 中缺少许多 ImageMagick 中存在的功能,我在下面列出了其中一些功能,排名不分先后。

我坦率地承认,我对 GraphicsMagick 的熟悉度不如对 ImageMagick 的熟悉度,但我尽最大努力在最新的 GraphicsMagick 源代码中找到有关这些功能的任何提及。因此,对于 Canny Edge Detector,我在 GM 源代码上运行了以下命令:

find . -type f -exec grep -i Canny {} \;

但什么也没找到。


Canny 边缘检测器

这一点在 GM 中似乎完全缺失。看-canny radiusxsigma{+lower-percent}{+upper-percent} in IM.

参见示例以及 Lena 图像上的边缘检测示例:


带括号的处理,复杂的重新排序

这是 ImageMagick 的一个杀手级功能,当我不得不使用 GM 时,我常常非常怀念它。 IM 可以加载、创建或克隆整个系列的图像,并对特定图像有选择地应用不同的处理,并对它们进行重新排序、复制和重新排序,非常简单方便。很难用简短的回答来表达它所提供的令人难以置信的灵活性。

想象一下,您想做一些相当简单的事情,例如加载图像 A 并对其进行模糊处理,加载图像 B 并将其设为灰度,然后将图像与图像 B 并排放置在左侧。使用 ImageMagick 看起来像这样:

magick imageA.png -blur x3 \( imageB.png -colorspace gray \) +swap +append result.png

你甚至无法开始使用GM,它会抱怨括号。如果删除它们,它会抱怨交换图像顺序。如果删除它,它将对两个图像应用灰度转换,因为它不理解括号并将 imageA 放在左侧。

请参阅 IM 中的以下排序命令:

  • -swap
  • -clone
  • -duplicate
  • -delete
  • -insert
  • -reverse

fx DIY 图像处理算子

即时通讯有-fx运算符,它允许您创建和试验极其复杂的图像处理。您可以对图像中的每个像素进行功能评估。该函数可以像您喜欢的那样复杂(如果您愿意,可以将其保存在文件中)并使用所有数学运算,三元样式if陈述、对其他图像中的像素及其亮度或饱和度等的引用。

这里有几个例子:

magick rose: -channel G -fx 'sin(pi*i/w)' -separate   fx_sine_gradient.gif
magick -size 80x80 xc: -channel G -fx  'sin((i-w/2)*(j-h/2)/w)/2+.5' -separate fx_2d_gradient.gif

StackOverflow 的一个答案是,使用此功能在处理绿屏(色度键控)图像时效果显着here https://stackoverflow.com/a/25146019/2836621.


傅里叶(频域)分析

GM 中似乎没有提及前向或反向傅里叶分析,也没有提及通常需要支持它的高动态范围支持(见下文)。看-fft in IM.


连通分量分析/标记/斑点分析

似乎没有《连通分量分析》在 GM 中 - 也称为“贴标签” and “斑点分析”. See -connected-components connectivity用于 4 连接和 8 连接的斑点分析。

仅此功能就提供了 60 多个答案 - 请参阅here https://stackoverflow.com/search?q=user%3A2836621%20connected.


霍夫线检测

GM 中似乎没有霍夫线检测。看-hough-lines widthxheight{+threshold} in IM.

查看功能描述以及以下检测到的行的示例:


时刻和感知哈希 (pHash)

GM 中似乎不支持图像矩计算(质心和高阶),也不支持感知哈希。看-moments in IM.


形态学

GM 中似乎不支持形态处理。 IM 中提供了对以下方面的复杂支持:

  • dilation
  • erosion
  • 形态学的开闭
  • 骨架化
  • 距离形态学
  • 顶帽和底帽形态
  • 命中和未命中形态 - 线端、线交汇处、峰、脊、凸包等

查看您可以执行的所有复杂处理这个很棒的教程 https://www.imagemagick.org/Usage/morphology/.


对比度有限自适应直方图均衡 - CLAHE

GM 中似乎不支持对比度受限自适应直方图均衡。看-clahe widthxheight{%}{+}number-bins{+}clip-limit{!} in IM.


HDRI - 高动态范围成像

GM 中似乎不支持高动态范围成像 - 仅支持 8、16 和 32 位整数类型。


卷积

ImageMagick 支持多种类型的卷积:

  • 高斯 DoG 的差分
  • 拉普拉斯算子
  • Sobel
  • Compass
  • Prewitt
  • Roberts
  • 弗雷陈

GM 源代码中没有提到这些。


Magick 持久寄存器 (MPR)

这是 ImageMagick 中的一个非常宝贵的功能,它允许您在处理过程中将中间处理结果写入指定的内存块,而无需写入磁盘的开销。例如,您可以准备纹理或图案,然后将其平铺在图像上,或者准备蒙版,然后更改它并稍后在相同的处理中应用它,而无需访问磁盘。

这是一个例子:

 magick tree.gif -flip -write mpr:tree +delete -size 64x64 tile:mpr:tree mpr_tile.gif

更广泛的色彩空间支持

IM 支持 GM 中未找到的以下色彩空间:

  • CIELab
  • HCL
  • HSI
  • LMS
  • others.

潘戈支持

IM 支持类似于 HTML 的 Pango 文本标记语言,允许您使用更改的文本注释图像:

  • 字体、颜色、大小、粗细、斜体
  • 下标、上标、删除线
  • 理由

句子中间还有很多很多。有一个很好的例子here https://www.imagemagick.org/Usage/text/#pango.


使用 JPEG 进行加载收缩

这一宝贵的功能允许库在从磁盘读取 JPEG 图像时缩小它们,以便仅读取必要的系数,从而减少 I/O,并将内存消耗降至最低。缩小图像时,它可以极大地提高性能。

参见示例here https://stackoverflow.com/a/32169224/2836621.


写入时定义最大 JPEG 大小

IM 支持在写入 JPEG 文件时指定最大文件大小的选项,-define jpeg:extent=400KB例如。


极坐标变换

IM支持笛卡尔坐标和极坐标之间的转换,参见-distort polar and -distort depolar.


可定制区域的统计和操作

以其-statistic MxN运算符,ImageMagick 可以生成许多有用的统计数据和效果。例如,您可以将图像中的每个像素设置为其 5x3 邻域的渐变(最亮和最暗之间的差异):

magick image.png -statistic gradient 5x3 result.png

或者您可以将每个像素设置为其 1x200 邻域的中值:

magick image.png -statistic median 1x200 result.png

参见应用示例here https://stackoverflow.com/a/42136544/2836621.


图像序列

ImageMagick 支持图像序列,因此,如果您有一组在高 ISO 下拍摄的噪声非常大的图像,您可以加载整个图像序列,例如,取所有图像的中值或平均值以减少噪声。请参阅-evaluate-sequence操作员。我并不是指单个图像中周围邻域的中值,而是指找到每个像素位置的所有图像的中值。


无论如何,上面的列表并不是详尽的列表,它们只是我在考虑这些差异时首先想到的几件事。我什至没有提到对 HEIC(Apple 的 iPhone 图像格式)、日益常见的高动态范围格式(例如 EXR)或任何其他格式的支持。事实上,如果比较两个产品支持的文件格式(gm convert -list format and magick identify -list format)你会发现IM支持261种格式,GM支持192种格式。

正如我所说,不同的人有不同的看法。选择您喜欢的一款并享受使用它的乐趣。

一如既往,我感谢 Anthony Thyssen 在 ImageMagick 上的出色见解和演讲https://www.imagemagick.org/Usage/ https://www.imagemagick.org/Usage/还要感谢 Fred Weinhaus 提供的例子。

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

ImageMagick 和 GraphicsMagick 有什么区别? 的相关文章

随机推荐

  • 在 Ubuntu 18.x 和 R 3.4.4/3.5.1 上安装 tidyverse

    我尝试安装 tidyverse 以及组成 tidyverse 的软件包 并得到以下输出 gt install packages tidyverse dependencies TRUE type source Installing packa
  • 在PHP应用程序中以安全的方式存储MYSQL的密码

    我有一个从代码连接到数据库的 php 应用程序 我想知道存储这些凭据的安全方法是什么 这是一个Linux服务器 编辑 我只想听到一些知情的意见 以便自己获得知情的意见 以便与我的团队讨论 我反对加密任何密码 但我的团队并不相信 我认为如果密
  • 使用 Autofac 进行 XUnit 测试构造函数依赖注入

    我正在使用 Autofac 实现 Xunit 我可以通过以下代码使其工作 using var scoped DbFixture Container Resolve
  • 使用批处理脚本在 Windows 中添加注册表项,并在数据中添加所需的引号

    小威利斯在这里 我正在尝试使用批处理脚本来编辑双击 jar 文件时使用的现有注册表项 问题是我尝试输入的数据包含引号 但我还需要引号才能将其视为字符串 Example reg add HKEY LOCAL MACHINE Software
  • 带有 ng-repeat 指令的容器高度为零

    我有一个带有 ng repeat 指令的 div 它会遍历一个数组并向我的容器添加一堆 div 当我打电话时 height 在现在充满 div 的容器上 它返回 0 它似乎返回 ng repeat 指令执行之前的高度 将 ng repeat
  • 如何翻转单个UIView(不翻转父视图)

    这是一个 iPad 项目 其中我有一个带有多个子视图的 UIView 我正在尝试使用 UIView transitionFromView toView duration options completion 为其中一个 UIView 制作动
  • C 和 C++ 风格文件 IO 之间的性能差异

    我一直听说 C 文件 I O 操作比 C 风格的 I O 慢得多 但我没有找到任何实际参考来说明它们实际上有多慢 所以我决定在我的机器上测试它 Ubuntu 12 04 GCC 4 6 3 ext4分区格式 首先 我在磁盘中写入了约 900
  • ActiveRecords 数组转为 JSON

    我知道 ActiveRecord 提供了一个 to json 方法 该方法允许使用 only 和 except 从 JSON 输出中过滤出字段 目前我正在使用以下命令将 find 中的数组格式化为 JSON customers Custom
  • VSCode 扩展从开发中运行,但在使用 webpack 打包时不起作用

    我已经构建 运行 打包并发布了一个扩展 但打包程序抱怨有 2509 个文件 4 28MB 并建议使用打包程序 我已按照以下说明进行操作捆绑扩展 https code visualstudio com api working with ext
  • UI 自动化和 WPF 的经验 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正在开发一个相当大的基于 WPF 的应用程序 并希望在我们的测试套件中包含一些自动化 UI 测试 其中已经包含许多单元测试 The 用户界面
  • 如何不使用 .data() 跳过第一个元素

    The data数组恰好包含 5 个对象 以下代码仅显示最后 4 个 并跳过第一个 d3 csv csv data function error data var table d3 select div var tr table selec
  • 如何使用 JSON 格式的日期过滤数据

    我想使用日期进行过滤 但数据是 JSON 格式 如何在 JavaScript 中使用日期过滤大型数据集 Example data date 22 12 2014 name selva date 10 10 2010 name raja da
  • CakePHP 时间助手问题

    我想我可能在这里犯了一个错误 当尝试在控制器的时间助手中使用简单函数时 出现以下错误 在视图中使用相同的函数调用时 我没有收到错误 以下是来自控制器的错误 接下来是失败的控制器代码 接下来是正在运行的视图代码 任何帮助表示赞赏 Error
  • 在 flutter v2.5 中迁移强调色

    在 flutter 2 5 更新后 我的主题数据有点损坏并且不再接受accentColor 我查看了文档 发现它被 重命名 为 colorScheme secondary 但无论我如何尝试 我都无法让它为我工作 这是我当前的代码 class
  • 使用正则表达式仅从列表中提取不包含重复字母的单词

    我有一个很大的单词列表文件 每行一个单词 我想过滤掉重复字母的单词 INPUT abducts abe abeam abel abele OUTPUT abducts abe abel 我想使用正则表达式 grep 或 perl 或 pyt
  • 将 RRULE 解析为可读文本?

    我正在寻找一个库 php 或一些伪代码来将 Ical RRULE 解析为可读文本 例如谷歌日历 RRULE FREQ MONTHLY INTERVAL 1 BYDAY 1FR 3FR 5FR gt Monthly on Friday of
  • 如何处理 C++ 接口中的单元

    我目前正在设计一个 API 我希望用户能够编写如下代码 PowerMeter forceVoltage 1 mV PowerMeter settlingTime 1 ms 目前我们使用如下定义来做到这一点 define mV 1 0e 03
  • 如何向 Django 管理中的字段添加可点击链接?

    我有这个 admin py class LawyerAdmin admin ModelAdmin fieldsets Name fields last first firm name firm url school year graduat
  • WCF服务继承

    我有一个非常复杂的服务主机 其中包含多个 DUPLEX 服务 它们提供了一些常见的功能 连接 断开 保持活动等 但除此之外 它们还各自提供了非常具体的功能 我的所有服务都继承自一个公共基类 抽象 因此 我还负责客户端应用程序的一部分 我希望
  • ImageMagick 和 GraphicsMagick 有什么区别?

    我发现自己正在评估这两个库 除了 GraphicsMagick 的比较之外 我发现 ImageMagick 仍然有更新 而且看起来两者几乎相同 我只是想用 C 进行基本的图像操作 即图像加载 过滤器 显示 在这些库之间进行选择时我应该注意什