これらのライブラリの両方を評価していることに気づきました。GraphicsMagick の比較が示すこととは別に、ImageMagick はまだ更新されていることがわかり、2 つがほぼ同じであるように見えます。
C++ で基本的な画像操作 (つまり、画像の読み込み、フィルター、表示) を行いたいと思っています。これらのライブラリを選択する際に注意すべき違いはありますか?
これらのライブラリの両方を評価していることに気づきました。GraphicsMagick の比較が示すこととは別に、ImageMagick はまだ更新されていることがわかり、2 つがほぼ同じであるように見えます。
C++ で基本的な画像操作 (つまり、画像の読み込み、フィルター、表示) を行いたいと思っています。これらのライブラリを選択する際に注意すべき違いはありますか?
人生の多くのことと同様に、何が最善かについては人によってさまざまな考えがあります。スコットランドの山を雨の中歩き回っている風景写真家に世界一のカメラは何かと尋ねると、彼は軽量で耐候性に優れたカメラを教えてくれるでしょう。スタジオの写真家に尋ねると、最高のフラッシュ同調速度で最高の解像度のものを教えてくれます。また、スポーツ写真家に尋ねると、最速のオートフォーカスと最高のフレーム レートを備えたカメラを教えてくれます。ImageMagick と GraphicsMagick も同様です。
過去 5 年以上にわたって ImageMagick に関する約 2,000 件の StackOverflow の質問に回答してきた私は、次のことを観察しています...
人気で言えば…
性能的には…
すべての問題ではなく、一部の問題では GraphicsMagick の方が高速である可能性があることを認めて喜んでいます。ただし、速度が最も重要な考慮事項である場合は、libvips
今日のマルチコア CPU または OpenCV のような大幅に SIMD 最適化 (または GPU 最適化) されたライブラリで、または並列コードを使用する必要があると思います。
機能と柔軟性の点で...
ここには、非常に明確な勝者が 1 つあります。ImageMagick です。私の経験では、ImageMagick には存在する GraphicsMagick には欠けている多くの機能があり、それらのいくつかを以下にリストします (順不同)。
ImageMagickほどGraphicsMagickに精通していないことを率直に認めますが、最新のGraphicsMagickソースコードで機能に関する言及を見つけるために最善を尽くしました. そこで、Canny Edge Detector の場合、GM ソース コードで次のコマンドを実行しました。
find . -type f -exec grep -i Canny {} \;
そして何も見つかりませんでした。
これはGMには完全に欠けているようです。-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 には、「ラベリング」および「ブロブ分析」とも呼ばれる「連結成分分析」がないようです。4 および 8 連結ブロブ解析については、を参照してください。-connected-components connectivity
この機能だけで 60 以上の回答が得られました。こちらを参照してください。
GM にはハフ線検出がないようです。-hough-lines widthxheight{+threshold}
IM で参照してください。
こちらの機能の説明と、次の検出された行の例を参照してください。
画像モーメントの計算 (重心および高次) や GM の知覚ハッシュはサポートされていないようです。-moments
IM で参照してください。
GM では形態学的処理がサポートされていないようです。IM には、次の高度なサポートがあります。
この優れたチュートリアルで実行できるすべての高度な処理をご覧ください。
GM では、Contrast Limited Adaptive Histogram Equalization がサポートされていないようです。-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 Text Markup Language をサポートしており、変化するテキストで画像に注釈を付けることができます。
中間文とはるかに。ここに素晴らしい例があります。
この非常に貴重な機能により、ライブラリは JPEG 画像をディスクから読み取るときに縮小できるため、必要な係数のみが読み取られるため、I/O が軽減され、メモリ消費が最小限に抑えられます。画像を縮小するときのパフォーマンスを大幅に向上させることができます。
ここで例を参照してください。
-define jpeg:extent=400KB
IM は、たとえばJPEG ファイルを書き込む際に最大ファイルサイズを指定するという要望の多かったオプションをサポートしています。
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
オペレーターを参照してください。1 つの画像の周囲の中央値を意味するのではなく、各ピクセル位置ですべての画像の中央値を見つけることを意味します。
上記は決して完全なリストではありません。違いについて考えたときに頭に浮かんだ最初のいくつかのことです. HEIC (Apple の iPhone 画像用フォーマット) や、EXR などのますます一般的になっているハイ ダイナミック レンジ フォーマットやその他のフォーマットのサポートについては言及しませんでした。gm convert -list format
実際、2 つの製品 (と)でサポートされているファイル形式を比較するとmagick identify -list format
、IM は 261 形式、GM は 192 形式をサポートしていることがわかります。
何度も言いますが、人によって意見は異なります。お好きな方を選んで使って楽しんでください。
いつものように、 https: //www.imagemagick.org/Usage/ で ImageMagick に関する優れた洞察と談話を提供してくれた Anthony Thyssen に感謝します。
私が読んだことから、GraphicsMagickはより安定しており、より高速です。いくつかの非科学的なテストを行ったところ、gm は im の 2 倍の速さであることがわかりました (サイズ変更を行っています)。
ImageMagickは、TIFFグループ4画像(白黒ドキュメント画像)の処理が非常に遅いことがわかりました。これは主に、1ピクセルあたり1ビットから8に変換し、画像操作を行うために元に戻すためです。GraphicsMagickグループはバージョン1.2でTIFF形式のサポートを見直し、これらのタイプの画像の処理は元のImageMagickよりもはるかに高速です。現在のGraphicsMagickの安定版リリースは1.3.5です。
速度が重要でない場合は、ImageMagick を使用します。ただし、毎日何万もの画像が処理されるサーバー側では、GraphicsMagick は非常に高速であり、場合によってはベンチマークで最大 50% も高速です!
GraphicsMagick は API と ABI の安定性を提供しますが、これは ImageMagick の保証の一部ではないことに注意してください。これは、すべての依存関係をベンダー化していない限り、長期的には重要です。