我发现自己评估了这两个库。除了 GraphicsMagick 比较所说的之外,我看到 ImageMagick 仍然有更新,而且看起来两者几乎相同。
我只是想在 C++ 中进行基本的图像处理(即图像加载、过滤器、显示);在这些库之间进行选择时,我应该注意哪些差异?
我发现自己评估了这两个库。除了 GraphicsMagick 比较所说的之外,我看到 ImageMagick 仍然有更新,而且看起来两者几乎相同。
我只是想在 C++ 中进行基本的图像处理(即图像加载、过滤器、显示);在这些库之间进行选择时,我应该注意哪些差异?
就像生活中的许多事情一样,不同的人对什么是最好的有不同的看法。如果你问一位风景摄影师在苏格兰山区的雨中四处游荡,这是世界上最好的相机,他会告诉你一款轻便、防风雨的相机。询问工作室摄影师,他会告诉您具有最佳闪光同步速度的最高分辨率。如果你问体育摄影师,他会告诉你自动对焦速度最快、帧速率最高的那个。ImageMagick 和 GraphicsMagick 也是如此。
在过去 5 年多的时间里,我在 ImageMagick 上回答了大约 2,000 个 StackOverflow 问题,我提出以下观察结果......
就人气而言...
在性能方面...
我很高兴承认 GraphicsMagick 对于某些问题可能更快,但不是所有问题。但是,如果速度是您最重要的考虑因素,我认为您可能应该libvips
在当今的多核 CPU 或 OpenCV 等高度 SIMD 优化(或 GPU 优化)的库上使用并行代码或并行代码。
在功能和灵活性方面...
这里有一个非常明显的赢家——ImageMagick。我的经验是,GraphicsMagick 中缺少许多 ImageMagick 中存在的功能,我在下面列出了其中的一些,没有特别的顺序。
我坦率地承认,我对 GraphicsMagick 的熟悉程度不如对 ImageMagick 的熟悉,但我尽最大努力在最新的 GraphicsMagick 源代码中找到任何提及这些功能的内容。因此,对于 Canny Edge Detector,我在 GM 源代码上运行了以下命令:
find . -type f -exec grep -i Canny {} \;
什么也没找到。
这似乎在通用汽车中完全缺失。见-canny radiusxsigma{+lower-percent}{+upper-percent}
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
IM 有-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 答案在这里。
GM 中似乎没有提到正向或反向傅立叶分析,也没有提到通常需要支持它的高动态范围支持(见下文)。见-fft
IM。
GM中似乎没有“连接组件分析” ——也称为“标签”和“Blob 分析”。参见-connected-components connectivity
4 和 8 连接的 blob 分析。
仅此功能就提供了 60 多个答案 - 请参见此处。
GM 中似乎没有霍夫线检测。见-hough-lines widthxheight{+threshold}
IM。
请参阅此处的功能描述和以下检测到的行示例:
似乎不支持图像矩计算(质心和更高阶),也不支持 GM 中的感知散列。见-moments
IM。
似乎不支持 GM 中的形态处理。在 IM 中,对以下内容提供了复杂的支持:
查看您可以使用此出色教程进行的所有复杂处理。
GM 中似乎不支持对比度受限自适应直方图均衡化。见-clahe widthxheight{%}{+}number-bins{+}clip-limit{!}
IM。
GM 中似乎不支持高动态范围成像——仅支持 8、16 和 32 位整数类型。
ImageMagick 支持多种类型的卷积:
GM源代码中没有提到这些。
这是 ImageMagick 中的一项非常宝贵的功能,它允许您在处理期间将中间处理结果写入指定的内存块,而无需写入磁盘的开销。例如,您可以准备一个纹理或图案,然后将其平铺在图像上,或者准备一个蒙版,然后对其进行更改并稍后在相同的处理中应用它,而无需进入磁盘。
这是一个例子:
magick tree.gif -flip -write mpr:tree +delete -size 64x64 tile:mpr:tree mpr_tile.gif
IM 支持以下 GM 中没有的色彩空间:
IM 支持类似于 HTML 的 Pango 文本标记语言,并允许您使用更改的文本注释图像:
句子中间还有很多很多。这里有一个很好的例子。
这个无价的特性允许库在从磁盘读取 JPEG 图像时缩小它们,以便只读取必要的系数,从而减少 I/O,并最大限度地减少内存消耗。当缩小图像时,它可以大大提高性能。
请参见此处的示例。
例如,IM 支持在写入 JPEG 文件时指定最大文件大小的要求很高的选项-define jpeg:extent=400KB
。
IM 支持笛卡尔坐标和极坐标之间的转换,请参见-distort polar
和-distort depolar
。
使用它的-statistic MxN
操作符,ImageMagick 可以生成许多有用的统计信息和效果。例如,您可以将图像中的每个像素设置为其 5x3 邻域的渐变(最亮和最暗之间的差异):
magick image.png -statistic gradient 5x3 result.png
或者您可以将每个像素设置为其 1x200 邻域的中值:
magick image.png -statistic median 1x200 result.png
请参阅此处的应用示例。
ImageMagick 支持图像序列,因此如果您有一组在高 ISO 下拍摄的非常嘈杂的图像,您可以加载整个图像序列,例如,获取所有图像的中值或平均值以减少噪声。见-evaluate-sequence
操作员。我并不是指单个图像中周围邻域的中值,而是指在每个像素位置找到所有图像的中值。
无论如何,以上并不是一个详尽的列表,它们只是我想到差异时想到的前几件事。我什至没有提到对 HEIC(Apple 的 iPhone 图像格式)、越来越常见的高动态范围格式(如 EXR)或任何其他格式的支持。事实上,如果你比较两个产品支持的文件格式(gm convert -list format
和magick identify -list format
)你会发现IM支持261格式,GM支持192。
正如我所说,不同的人有不同的看法。选择您喜欢的并享受使用它。
与往常一样,我要感谢 Anthony Thyssen 在https://www.imagemagick.org/Usage/上对 ImageMagick 的出色见解和论述,还要感谢 Fred Weinhaus 提供的示例。
从我读过的内容来看,GraphicsMagick 更稳定,速度更快。我做了一些不科学的测试,发现 gm 的速度是 im 的两倍(调整大小)。
我发现 ImageMagick 处理 TIFF group-4 图像(黑白文档图像)的速度非常慢,主要是因为它从每像素 1 位转换为 8 位,然后再转换回来以进行任何图像处理。GraphicsMagick 小组在其 1.2 版中彻底检查了对 TIFF 格式的支持,它在处理这些类型的图像方面比原来的 ImageMagick 快得多。当前的 GraphicsMagick 稳定版本为 1.3.5。
当速度不是一个因素时,我使用 ImageMagick。然而在服务器端,每天处理数以万计的图像,GraphicsMagick 明显更快 - 在某些情况下,基准测试速度快 50%!
由于创始开发者之间的争议,graphicsmagick 早在 2002 年就从 imagemagick 分叉出来。因此它们共享相同的代码库。
参考:https ://en.wikipedia.org/wiki/GraphicsMagick
图形魔术师
图像魔术师
除了速度之外,imagemagick 还向终端 shell 添加了许多 cli 工具,而 graphicsmagick 是您可以调用的单个工具。
图形魔术师
gm <command> <options> <file>
图像魔术师
convert <options> <file>
compare <options> <file>
恕我直言,我更喜欢(实际上,只使用) graphicsmagick(gm)而不是 imagemagick,因为后者有更高的工具名称冲突机会,这会导致在找出某些工具未运行的原因时出现很多问题,尤其是在服务器端自动化任务期间。总之,graphicsmagick 有更清晰的设计。
想象一个项目中名为 convert 的二进制文件,它是 imagemagick 的 convert 还是项目中您自己的滚动工具将被调用?
imagemagick 工具列表(包括转换、比较、显示):https ://imagemagick.org/script/command-line-tools.php
graphicsmagick 命令列表:http: //www.graphicsmagick.org/utilities.html
注意:从 Mark S 提到的 v7 开始,imagemagick 现在以单个二进制文件的形式分发,并且还支持较旧的 v6 命令。
可以在这里找到一个简单的内存消耗测试: https ://coderwall.com/p/1l7h-a/imagemagick-bloat-graphicsmagick
GraphicsMagick 依赖于 36 个库,而 ImageMagick 需要 64 个。参考:http ://www.graphicsmagick.org/1.3/FAQ.html
请注意,GraphicsMagick 提供 API 和 ABI 稳定性,这不是 ImageMagick 保证的一部分。从长远来看,这将很重要,除非您出售所有依赖项。
GraphicsMagick 是 Imagemagick 的早期分支。您可以在https://imagemagick.org/script/history.php阅读有关 Imagemagick 的历史和 GraphicsMagick 的分支。似乎 Imagemagick 继续得到相当广泛的开发,而 GraphicsMagick 自分叉以来或多或少地停滞不前。