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