关于c ++:ImageMagick和GraphicsMagick有什么区别?

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问题之后,我做了以下观察...

好。

就受欢迎程度而言...

好。

  • SO上的ImageMagick问题比GraphicsMagick问题多12:1(7,375个问题与2019年5月的611个问题),以及
  • SO上的ImageMagick关注者人数比GraphicsMagick关注者人数高出15:1((387位关注者与2019年5月的25位关注者)
  • 好。

    在性能方面...

    好。

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

    好。

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

    好。

    这里有一个非常明显的赢家-ImageMagick。我的经验是,ImageMagick中存在GraphicsMagick缺少的许多功能,我在下面按特定顺序列出了其中的一些功能。

    好。

    我自由地承认,我对GraphicsMagick的了解不如对ImageMagick的熟悉,但是我尽了最大的努力来找到有关GraphicsMagick最新源代码的功能。因此,对于Canny Edge Detector,我在GM源代码上运行了以下命令:

    好。

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

    一无所获

    好。

    坎尼边缘检测器

    通用汽车似乎完全没有这种情况。请参阅IM中的-canny radiusxsigma{+lower-percent}{+upper-percent}

    好。

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

    好。

    enter image description here

    好。

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

    这是ImageMagick的杀手级功能,不得不使用GM时我经常会非常想念它。 IM可以加载,创建或克隆整个系列的图像,并选择性地对特定图像进行不同的处理,然后非常简单方便地对它们进行重新排序,复制和重新排序。简而言之,很难传达这给您带来的难以置信的灵活性。

    好。

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

    好。

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

    enter image description here

    好。

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

    好。

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

    好。

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

    fx DIY图像处理运算符

    IM具有-fx运算符,该运算符使您可以创建和尝试极其复杂的图像处理。您可以为图像中的每个像素评估功能。该函数可以任意复杂(如果需要,可以将其保存在文件中),并使用所有数学运算,三元样式if语句,甚至在其他图像中也引用像素以及它们的亮度或饱和度等。

    好。

    以下是几个示例:

    好。

    1
    magick rose: -channel G -fx 'sin(pi*i/w)' -separate   fx_sine_gradient.gif

    enter image description here

    好。

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

    enter image description here

    好。

    使用此功能的StackOverflow答案在处理绿屏(色键)图像方面效果显着。

    好。

    傅立叶(频域)分析

    似乎没有提到GM中的正向或反向傅立叶分析,也没有提及通常需要高动态范围支持来支持它。请参阅IM中的-fft

    好。

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

    GM中似乎没有"关联组件分析",也称为"标签"和"斑点分析"。有关4和8连接的斑点分析,请参见-connected-components connectivity

    好。

    仅此功能即可提供60多个答案-参见此处。

    好。

    霍夫线检测

    GM中似乎没有霍夫线检测。请参阅IM中的-hough-lines widthxheight{+threshold}

    好。

    请参阅此处的功能描述以及以下检测到的线路示例:

    好。

    enter image description here

    好。

    瞬间和知觉哈希(pHash)

    似乎不支持图像矩计算(质心和高阶),也不支持GM中的感知散列。请参阅IM中的-moments

    好。

    形态学

    似乎不支持基因改造中的形态学处理。 IM中对以下内容提供了完善的支持:

    好。

  • 扩张
  • 侵蚀
  • 形态开合
  • 骨架化
  • 距离形态
  • 高顶礼帽和低顶礼帽形态
  • 命中和缺失形态-线末端,线交界处,峰,山脊,凸包等
  • 好。

    查看此出色教程可以完成的所有复杂处理。

    好。

    对比度受限的自适应直方图均衡化-CLAHE

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

    好。

    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

    enter image description here

    好。

    广泛的色彩空间支持

    IM支持GM中未提供的以下色彩空间:

    好。

  • 实验室
  • 盐酸
  • 恒指
  • LMS
  • 其他。
  • 好。

    Pango支持

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

    好。

  • 字体,颜色,大小,重量,斜体
  • 下标,上标,删除线
  • 理由
  • 好。

    中间句子等等。这里有一个很好的例子。

    好。

    enter image description here

    好。

    JPEG压缩缩图

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

    好。

    请参阅此处的示例。

    好。

    写入时定义的最大JPEG尺寸

    IM支持在编写JPEG文件时要求很高的选项来指定最大文件大小,例如-define jpeg:extent=400KB

    好。

    极坐标变换

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

    好。

    可定制区域的统计数据和操作

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

    好。

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

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

    好。

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

    请在此处查看应用程序示例。

    好。

    enter image description here

    好。

    图像序列

    ImageMagick支持图像序列,因此,如果您有一组以高ISO拍摄的非常嘈杂的图像,则可以加载整个图像序列,例如,取所有图像的中值或平均值以减少噪点。请参见-evaluate-sequence运算符。我并不是指单个图像中周围邻域的中位数,而是要找到每个像素位置上所有图像的中位数。

    好。

    上面的清单无论如何都不是详尽无遗的清单,它们只是我想到差异时想到的头几件事。 我什至没有提到对HEIC(苹果用于iPhone图像的格式)的支持,这种格式越来越常见,例如EXR或其他格式。 实际上,如果比较两种产品(gm convert -list formatmagick identify -list format)支持的文件格式,您会发现IM支持261种格式,而GM支持192种格式。

    好。

    正如我所说,不同的人有不同的意见。 选择一个您喜欢的,并喜欢使用它。

    好。

    与往常一样,我要感谢安东尼·蒂森(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