Как и во многих вещах в жизни, у разных людей разные представления о том, что лучше. Если вы спросите ландшафтного фотографа, который бродит под дождем в горах Шотландии, который является лучшей камерой в мире, он расскажет вам облегченную камеру с защитой от непогоды. Спросите студийного фотографа, и он скажет вам самое высокое разрешение с лучшей скоростью синхронизации вспышки. И если вы спросите спортивного фотографа, он скажет вам, у кого самый быстрый автофокус и самая высокая частота кадров. Так же и с ImageMagick и GraphicsMagick.
Ответив примерно на 2000 вопросов StackOverflow на ImageMagick за последние 5 с лишним лет, я делаю следующие наблюдения ...
По популярности ...
- Вопросы ImageMagick по SO превосходят по количеству вопросы GraphicsMagick в 12: 1 (7 375 вопросов против 611 в мае 2019 года) и
- Число подписчиков ImageMagick на SO превышает число подписчиков GraphicsMagick на 15: 1 ((387 подписчиков против 25 в мае 2019 года)
С точки зрения производительности ...
Я рад признать, что GraphicsMagick может быть быстрее для некоторых, но не для всех проблем. Тем не менее, если скорость является вашим наиболее важным фактором, я думаю, что вы, вероятно, должны использовать либо libvips
, либо параллельный код на современных многоядерных процессорах, либо библиотеки с большой SIMD-оптимизацией (или GPU-оптимизацией), например OpenCV.
С точки зрения возможностей и гибкости ...
Здесь есть один очень явный победитель - ImageMagick. По моему опыту, в GraphicsMagick отсутствуют многие функции, присутствующие в ImageMagick, и я перечислю некоторые из них ниже в произвольном порядке.
Я свободно признаю, что я не так знаком с GraphicsMagick, как с ImageMagick, но я приложил все усилия, чтобы найти упоминание о функциях в самом последнем исходном коде GraphicsMagick. Итак, для Canny Edge Detector я выполнил следующую команду в исходном коде GM:
find . -type f -exec grep -i Canny {} \;
и ничего не нашел.
Детектор Edge Edge
Это, кажется, полностью отсутствует в GM. См. -canny radiusxsigma{+lower-percent}{+upper-percent}
в IM.
См. Пример здесь и пример обнаружения краев на изображении Лены:
Обработка в скобках, сложное повторное упорядочение
Это убойная особенность 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
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.
Анализ подключенных компонентов / Маркировка / Анализ BLOB-объектов
Похоже, что в GM нет «Анализ связанных компонентов» - также известный как «маркировка» и «Анализ BLOB-объектов» . См. -connected-components connectivity
для 4- и 8-связного анализа BLOB-объектов.
Эта функция предоставила более 60 ответов - см. здесь .
Обнаружение линии Hough
Похоже, что в GM не обнаружена линия Hough. См. -hough-lines widthxheight{+threshold}
в IM.
См. Описание функции здесь и следующий пример обнаруженных линий:
Моменты и перцептивный хэш (pHash)
Похоже, нет поддержки для вычисления моментов изображения (центроиды и более высокие порядки), а также для перцептивного хеширования в GM. См. -moments
в IM.
Морфология
Кажется, что нет никакой поддержки для морфологической обработки в GM. В IM есть изощренная поддержка:
- дилатация
- эрозия
- морфологическое открытие и закрытие
- skeletonisation
- морфология расстояния
- морфология верхней и нижней шляпы
- Морфология хитов и мисс - концы линий, соединения линий, пики, гребни, выпуклые оболочки и т. Д.
Посмотрите всю сложную обработку, которую вы можете сделать с помощью этого замечательного учебника .
Выравнивание контрастной ограниченной адаптивной гистограммы - CLAHE
По-видимому, не поддерживается выравнивание контрастной ограниченной адаптивной гистограммы в GM. См. -clahe widthxheight{%}{+}number-bins{+}clip-limit{!}
в IM.
HDRI - Отображение в широком динамическом диапазоне
По-видимому, в GM отсутствует поддержка изображений с высоким динамическим диапазоном - только 8, 16 и 32-разрядные целочисленные типы.
свертка
ImageMagick поддерживает множество типов свертки:
- Разница Гаусса DoG
- 1197 * лапласиане *
- Собела
- Компас
- Превитт
- Roberts
- Фрей-Chen
Ничего из этого не упомянуто в исходном коде GM.
Постоянный регистр магии (MPR)
Это бесценная функция, присутствующая в ImageMagick, которая позволяет записывать промежуточные результаты обработки в именованные порции памяти во время обработки без дополнительных затрат на запись на диск. Например, вы можете подготовить текстуру или узор, а затем наложить их на изображение или подготовить маску, а затем изменить и применить ее позже в той же обработке, не переходя на диск.
Вот пример:
magick tree.gif -flip -write mpr:tree +delete -size 64x64 tile:mpr:tree mpr_tile.gif
Поддержка расширенного цветового пространства
IM поддерживает следующие цветовые пространства, которых нет в GM:
Поддержка Панго
IM поддерживает язык разметки текста Pango, который похож на HTML и позволяет комментировать изображения с изменяющимся текстом:
- шрифт, цвет, размер, вес, курсив
- нижний индекс, верхний индекс, зачеркнутый
- обоснование
середина предложения и многое, многое другое. Вот отличный пример здесь .
Сжатие при загрузке с JPEG
Эта бесценная функция позволяет библиотеке сжимать изображения JPEG по мере их чтения с диска, так что считываются только необходимые коэффициенты, поэтому ввод / вывод уменьшается, а потребление памяти сводится к минимуму. Это может значительно повысить производительность при уменьшении масштаба изображений.
См. Пример здесь .
Определен максимальный размер JPEG при записи
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.
Как я уже сказал, разные люди имеют разные мнения. Выберите тот, который вам нравится, и наслаждайтесь им.
Как всегда, я в долгу перед Энтони Тиссеном за его прекрасное понимание и рассказ о ImageMagick на https://www.imagemagick.org/Usage/ Спасибо также Фреду Вайнхаусу за его примеры.