What is the difference between ImageMagick and GraphicsMagick?
我发现自己正在评估这两个库。 除了GraphicsMagick的比较所说的那样,我看到ImageMagick仍然有更新,而且看起来两者几乎相同。
我只是想在C ++中进行基本的图像处理(即图像加载,过滤器,显示); 在这些库之间进行选择时,我应该注意什么区别?
据我了解,GraphicsMagick更稳定,更快。
我做了一些不科学的测试,发现gm的速度是im的两倍(调整大小)。
我发现ImageMagick在处理TIFF组4图像(黑白文档图像)时非常慢,这主要是因为它从每像素1位转换为8并再次返回以进行任何图像处理。 GraphicsMagick小组对其版本1.2全面改进了TIFF格式的支持,与原始ImageMagick相比,处理这些类型的图像要快得多。当前的GraphicsMagick稳定版本为1.3.5。
就像生活中的许多事情一样,不同的人对最好的事物有不同的想法。如果您问一位风景摄影师在苏格兰山区的雨中徘徊,这是世界上最好的相机,他会告诉您一台轻巧,天气密封的相机。询问摄影棚摄影师,他会告诉您分辨率最高,闪光灯同步速度最佳的照片。而且,如果您问体育摄影师,他会告诉您自动对焦最快,帧频最高的摄影师。 ImageMagick和GraphicsMagick也是如此。
好。
在过去5年多的时间里,在ImageMagick上回答了大约2,000个StackOverflow问题之后,我做了以下观察...
好。
就受欢迎程度而言...
好。
好。
在性能方面...
好。
我很高兴承认GraphicsMagick对于某些问题(但不是全部问题)可能会更快。但是,如果速度是您最重要的考虑因素,我认为您可能应该在当今的多核CPU上或在OpenCV等经过SIMD优化(或GPU优化)的库中使用
好。
在功能和灵活性方面...
好。
这里有一个非常明显的赢家-ImageMagick。我的经验是,ImageMagick中存在GraphicsMagick缺少的许多功能,我在下面按特定顺序列出了其中的一些功能。
好。
我自由地承认,我对GraphicsMagick的了解不如对ImageMagick的熟悉,但是我尽了最大的努力来找到有关GraphicsMagick最新源代码的功能。因此,对于Canny Edge Detector,我在GM源代码上运行了以下命令:
好。
1 | find . -type f -exec grep -i Canny {} \; |
一无所获
好。
坎尼边缘检测器
通用汽车似乎完全没有这种情况。请参阅IM中的
好。
请参见此处的示例以及Lena图像上的边缘检测示例:
好。
好。
带括号的处理,复杂的重新排序
这是ImageMagick的杀手级功能,不得不使用GM时我经常会非常想念它。 IM可以加载,创建或克隆整个系列的图像,并选择性地对特定图像进行不同的处理,然后非常简单方便地对它们进行重新排序,复制和重新排序。简而言之,很难传达这给您带来的难以置信的灵活性。
好。
想象一下,您想做一些相当简单的事情,例如加载图像A并对其进行模糊处理,加载图像B并使其灰度,然后将图像与图像B并排放置在左侧。使用ImageMagick看起来像这样:
好。
1 | magick imageA.png -blur x3 \( imageB.png -colorspace gray \) +swap +append result.png |
好。
您甚至无法开始使用GM,它将抱怨括号。如果删除它们,它将抱怨交换图像顺序。如果删除它,它将对所有图像应用灰度转换,因为它不理解括号,并在左侧放置了imageA。
好。
请参阅IM中的以下排序命令:
好。
好。
fx DIY图像处理运算符
IM具有
好。
以下是几个示例:
好。
1 | magick rose: -channel G -fx 'sin(pi*i/w)' -separate fx_sine_gradient.gif |
好。
1 | magick -size 80x80 xc: -channel G -fx 'sin((i-w/2)*(j-h/2)/w)/2+.5' -separate fx_2d_gradient.gif |
好。
使用此功能的StackOverflow答案在处理绿屏(色键)图像方面效果显着。
好。
傅立叶(频域)分析
似乎没有提到GM中的正向或反向傅立叶分析,也没有提及通常需要高动态范围支持来支持它。请参阅IM中的
好。
连通成分分析/标记/斑点分析
GM中似乎没有"关联组件分析",也称为"标签"和"斑点分析"。有关4和8连接的斑点分析,请参见
好。
仅此功能即可提供60多个答案-参见此处。
好。
霍夫线检测
GM中似乎没有霍夫线检测。请参阅IM中的
好。
请参阅此处的功能描述以及以下检测到的线路示例:
好。
好。
瞬间和知觉哈希(pHash)
似乎不支持图像矩计算(质心和高阶),也不支持GM中的感知散列。请参阅IM中的
好。
形态学
似乎不支持基因改造中的形态学处理。 IM中对以下内容提供了完善的支持:
好。
好。
查看此出色教程可以完成的所有复杂处理。
好。
对比度受限的自适应直方图均衡化-CLAHE
似乎在GM中不支持对比度受限的自适应直方图均衡。请参阅IM中的
好。
HDRI-高动态范围成像
GM中似乎不支持高动态范围成像-只有8位,16位和32位整数类型。
好。
卷积
ImageMagick支持多种类型的卷积:
好。
好。
GM源代码中没有提到这些。
好。
Magick永久寄存器(MPR)
这是ImageMagick中的一项非常宝贵的功能,它使您可以在处理过程中将中间处理结果写入命名的内存块,而不会产生写入磁盘的开销。例如,您可以准备一个纹理或图案,然后将其平铺在图像上,或者准备一个遮罩,然后对其进行更改,然后在不经过磁盘处理的情况下,以相同的处理方法进行应用。
好。
这是一个例子:
好。
1 | magick tree.gif -flip -write mpr:tree +delete -size 64x64 tile:mpr:tree mpr_tile.gif |
好。
广泛的色彩空间支持
IM支持GM中未提供的以下色彩空间:
好。
好。
Pango支持
IM支持类似于HTML的Pango文本标记语言,并允许您使用更改后的文本注释图像:
好。
好。
中间句子等等。这里有一个很好的例子。
好。
好。
JPEG压缩缩图
这项宝贵的功能允许库在从磁盘读取JPEG图像时缩小它们,从而仅读取必要的系数,从而减少了I / O并最大程度地减少了内存消耗。缩小图像时,它可以大大提高性能。
好。
请参阅此处的示例。
好。
写入时定义的最大JPEG尺寸
IM支持在编写JPEG文件时要求很高的选项来指定最大文件大小,例如
好。
极坐标变换
IM支持笛卡尔坐标和极坐标之间的转换,请参见
好。
可定制区域的统计数据和操作
借助其
好。
1 | magick image.png -statistic gradient 5x3 result.png |
或者,您可以将每个像素设置为其1x200邻域的中位数:
好。
1 | magick image.png -statistic median 1x200 result.png |
请在此处查看应用程序示例。
好。
好。
图像序列
ImageMagick支持图像序列,因此,如果您有一组以高ISO拍摄的非常嘈杂的图像,则可以加载整个图像序列,例如,取所有图像的中值或平均值以减少噪点。请参见
好。
上面的清单无论如何都不是详尽无遗的清单,它们只是我想到差异时想到的头几件事。 我什至没有提到对HEIC(苹果用于iPhone图像的格式)的支持,这种格式越来越常见,例如EXR或其他格式。 实际上,如果比较两种产品(
好。
正如我所说,不同的人有不同的意见。 选择一个您喜欢的,并喜欢使用它。
好。
与往常一样,我要感谢安东尼·蒂森(Anthony Thyssen)在https://www.imagemagick.org/Usage/上对ImageMagick的出色见解和论述,也要感谢Fred Weinhaus的示例。
好。
好。
当速度不是一个因素时,我会使用ImageMagick。但是在服务器端,每天要处理成千上万张图像,而GraphicsMagick的速度明显要快得多-在某些情况下,基准速度提高了50%!
请注意,GraphicsMagick提供API和ABI稳定性,这不是ImageMagick保证的一部分。从长远来看,这很重要,除非您要出售所有依赖项。
GraphicsMagick是Imagemagick的早期分支。您可以在https://imagemagick.org/script/history.php上了解Imagemagick的历史以及与GraphicsMagick的分支。自分叉以来,Imagemagick似乎一直在继续发展,而GraphicsMagick则一直停滞不前。
历史
由于创始人之间的争议,graphicsmagick于2002年从imagemagick分叉。因此它们共享相同的代码库。
参考:https://en.wikipedia.org/wiki/GraphicsMagick
目标
graphicsmagick
- 专注于简单,稳定和更清晰的代码库/体系结构
imagemagick
- 专注于推出新功能,扩展更广泛的工具库
除了速度以外,imagemagick还向终端外壳添加了许多cli工具,而graphicsmagick是可以调用的单个工具。
CLI界面设计
graphicsmagick
1 | gm <command> <options> <file> |
imagemagick
1 2 | convert <options> <file> compare <options> <file> |
恕我直言,与imagemagick相比,我更喜欢(实际上仅使用)graphicsmagick(gm),因为后者有更高的工具名称冲突机会,这在找出为什么某些工具未运行(尤其是在服务器端自动化任务期间)时会引起很多问题。总而言之,graphicsmagick的设计要清晰得多。
想象一个在项目中称为"转换"的二进制文件,它是imagemagick的转换还是在项目中您自己的滚动工具将被调用?
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