ImageMagick - мощный консольный графический редактор

Часто требуется не просто обработать или улучшить изображение, но применить последовательность операций к большому количеству изображений. В этом нам поможет консольный графический редактор ImageMagick.


Установка и первые шаги
Устанавливается черзвычайно просто:

apt-get install imagemagick
и всё. Но дальше меня лично ждал сюрприз: а где, собственно, программа? На самом деле этот пакет содержит несколько программ: display, animate, identify, convert, montage, mogrify и composite. Здесь я приведу свой скромный опыт работы с основной программой пакета - всемогущей convert.

С пакетом ImageMagick (во всяком случае в Дебиане) поставляется могучий мануал в PDF на 320 страницах - весьма толковое руководство, но на английском. До его завершения весьма далеко: описаны только опции командной строки, а остальное просто набросано.


Консольный графический редактор
У многих моих подоконных товарищей такое словосочетание вызывает когнитивный диссонанс: как графический редактор может быть консольным!? Может, и бывает чрезвычайно полезен, когда нужно обработать не одно, а множество изображений, лежащих к тому же в разных каталогах. Естественно, в альтернативной среде приняты наиболее топорные средства решения проблем: тыкать и выделять мышкой, и для каждого файла повторять процедуру. Самые продвинутые слышали об Action в фотошопе, но и это средство - не панацея (а кроме того, требует немалого времени на отладку комбинации действий).

Ниже - часть используемых мной команд обработки изображений, разбитых по категориям (насколько это возможно).


Операции с цветом
Имеется в виду изменение цветовых пространств: RGB/CMYK, grayscale и BW. Всё, что связано с изменением цветов.

Перевод в оттенки серого
-colorspace GRAY
Например: convert -colorspace GRAY tux.jpg tuxConvertGray.jpg
На самом деле ключ colorspace позволяет переводить изображения между разными цветовыми пространствами: GRAY, OHTA, RGB, Transparent, XYZ, YCbCr, YIQ, YPbPr, YUV или CMYK.


Перевод в чёрно-белое изображение

Здесь есть несколько методов: бинаризация по порогу (threshold), с диффузией ошибки (метод Floyd/Steinberg, error diffusion) и локальный адаптивный порог.

Бинаризация с диффузией ошибки выполняется ключом:
-dither
-monochrome
Вместе с этой опцией следует применять ключи -colors или -monochrome для определения цветового пространства, к которому применяется преобразование.

Бинаризация по порогу делается при помощи ключа:
-threshold число
где число - значение порога.
Пример: convert -threshold 128 1.png 2.png

Локальная адаптивная бинаризация по порогу производится при помощи следующего параметра:
-lat ШиринаxДлина{+-}Смещение{%}
Здесь имеется в виду область размером ШиринаxДлина, в пределах которой происходит порог. Смещение определяет степень отклонения значений пикселей (в процентах). Данные параметры стоит подбирать с визуальным контролем (запустить ещё и просмотрщик изображений).
Пример: convert -lat 3x3+5% tux.jpg tuxConvertedLat3x3.jpg


Постеризация
Уменьшение количества цветов на изображении:
-posterize числооттенков
до числаоттенков приводит к сокращению и "огрублению" оттенков изображения.


Инвертирование

Чтобы инвертировать изображение (цветное или полутоновое), надо указать ключ:
-negate
Действует для цветых и полутоновых изображений.


Изменение разрядности изображения

Чтобы перевести 16-битное изображение в 8-битное, нужно воспользоваться ключом:
-depth 8
Кто сказал, что в Линукс нельзя работать с 16-битным цветом?





Операции с освещённостью
Всё, что касается освещённости пикселей, без привязки к цветовому пространству: гамма-коррекция, контрастирование.

Повышение / понижение контраста
Изменение контрастности изображения достигается:
-contrast

+contrast
При этом -contrast повышает контрастность, а + понижает.
Пример: convert -contrast tux.jpg tuxConvertedContrast-50.jpg


Эквализация гистограммы

Автоматическое контрастирование изображения:
-equalize

Производит автоматическую эквализацию гистограммы - алгоритм изменяет гистограмму изображения так, чтобы она была равномерна по светам и теням.


Нормализация

Для того, чтобы значения пикселей изображения занимали весь диапазон, следует указать ключ:
-normalize
Этим достигается повышение контраста на изображении.


Гамма-коррекция

Для гамма-коррекции изображения следует указать ключ:
-gamma значение

Значения меньшие 1.0 делают изображение темнее, значения более 1.0 осветляют изображение. Наиболее часто применяемые значения лежат в пределах от 0.8 до 2.3
Можно применять разные значения гамма-коррекции для разных цветовых каналов, например так: -gamma 1.7/2.3/1.2


Уровни

Более тонкая настройка контрастности изображения при помощи уровней:
-level точкачёрного{,точкабелого}{%}{,значениегаммакоррекции}
можно указывать как в абсоютных величинах, например -level 10,65000 так и в процентах -level 2%,98%
По умолчанию гамма стоит равная 1.0 (то есть без гамма-коррекции), но её можно задать, например, так -level 2%,98%,0.8





Геометрические преобразования
Здесь я приведу несколько полезных команд, которые позволяют менять масштаб изображения или кадрировать его. Безусловно, вслепую определить точные координаты очень сложно, но ведь никто не воспрещает использовать консольные и графические утилиты вместе?


Изменить размер изображения
Можно задать точный размер в пикселях:
-resize MMMxNNN

изменить размер изображения на MMMxNNN. При этом плотность изображения сохраняется изначальной.
Можно задать в процентах:
-resize 200%
то есть увелилить в 2 раза.

Более быстрый, но грубый алгоритм маштабирования:
-scale число%
масштабирует изображение в заданном процентном соотношении.


Кадрировать изображение
Для кадрирования изображения следует использовать:
-crop ШиринаxВысота{+-}<ИсходноеХ>{+-}<ИсходноеY>{%}
Имеется в виду, что требуется вырезать область ШиринахВысота, причём область смещена на значение ИсходноеХ и ИсходноеY пикселей. Значения двух последних параметров - на самом деле просто координата левого верхнего угла области, для которой указаны данные ширины и высоты. Описание дано в терминологии GiMP: если там вызвать диалог кадрирования, то станет понятным, что имеется в виду.
Пример: convert -crop 95x85+50+12 tux.jpg tuxConvertedCrop.jpg


Изменить плотность изображения

Для того, чтобы задать количество пикселей на дюйм, следует воспользоваться ключом:
-density DPIгоризонтальноеxDPIвертикальное
-density число
Первый вариант нужен тогда, когда по вертикали и горизонтали разрешение разное. Второй вариант проще: если нужно задать разрешение, одинаковое в обоих направлениях.


Поворот изображения

Чтобы повернуть изображение, указываем:
-rotate "+-градусы"
Для того, чтобы повернуть изображение по часовой стрелке, пишем -rotate "+90" для поворота против часовой стрелки, соответственно
-rotate "-90"
Если поворот производится на произвольное число градусов, то изображение поворачивается как целое, увеличиваясь для вмещения исходной картинки. Появившиеся области становятся цвета фона, который определяется параметром -fill цвет.
Несколько слов о заполнении:
  • если надо заполнить цветом по-быстрому и особенно не думать, можно указать именованый цвет (yellow, black, white). Полный их перечень можно получить командой convert -list color
  • если заполнять надо точно известным цветом, можно указать его в формате #RGB (R,G,B are hex numbers, 4 bits each)
  • convert -fill blue ...
    convert -fill "#ddddff" ...
    convert -fill "rgb(65000,65000,65535)" ...




Фильтры для улучшения изображений
Приведены алгоритмы размытия / повышения резкости и шумоподавления.

Размытие по Гауссу
Чтобы размыть изображение по Гауссу:
-blur Радиус
-blur РАДИУСxСИГМА
Размытие изображения по Гауссу на РАДИУС пикселей. Опционально можно задать степень (стандартное отклонение) - задав СИГМУ.


Радиальное размытие
Размыть изображение, "завращав" его вокруг центра, можно:
-swirl градус
на заданное количество градусов.


Удаление спекл-шума
Простой метод удаления спекл-шума (мультипликативный шум):
-despeckle
Действие приводит к лёгкому размытию.


Выделение краёв

Для выделения краёв на изображении следует использовать ключ:
-edge радиус
Приводит к появлению оконтуренного изображения (по всей видимости, применяется метод Собела).


Увеличение резкости

Для того, чтобы изображение стало более резким, можно применить ключ:
-sharpen РадиусxСигма
Используется оператор Гаусса, требуется задание радиуса и стандартного отклонения (Сигма)


Медианная фильтрация
Для удаления импульсного шума с изображения следует использовать медианную фильтрацию:
-median радиус
значение параметра задаёт область оценки шума для алгоритма.


Нечёткая маска
Для повышения резкости изображение, особенно на контурах, можно применить нечёткую маску:
-unsharp РадиусxСигма+величина+порог
Используется оператор Гаусса, которому требуется задать Радиус и Сигму (для достижения хороших результатов радиус должен быть больше сигмы). По умолчанию 0 и 1.0 соответственно.
Параметр величина есть процент разницы между оригинальным и нечётким изображением, умолчание 1.0, а порог - величина количественной разницы между изображениями (умолчание 0.05).

У некоторых пользователей возникает дескрипанс: как же так, типа Unsharp, а повышает резкость? Дело в том, что фильтр получил своё имя потому, что его действие выглядит так, как будто из изображения вычли его нерезкую копию. Никакого вычитания, конечно, не происходит: выполняется свёртка с ядром Гаусса 3х3 пикселей, но это уже другая история.

Добавление / удаление шума (по ближайшим соседям)
Шумоподавление выполняется при указании ключа:
-noise радиус
Удаление шума с изображения на основе анализа величин значений ближайших пикселей в области заданного радиуса. Пиксель считается шумовым и заменяется на среднее по области, если и только если значение пикселя является максимумом или минимумом в данной области.

Чтобы добавить шум к изображению, указываем:
+noise тип
Можно добавить шумы: Uniform (однородный), Gaussian (Гауссов), Multiplicative (спекл-шум), Impulse (импульсный), Laplacian (Лапласов шум), Poisson (шум Пуассона).



Вместо заключения
Мне давно хотелось разобраться с возможностями ImageMagick, а тут выдалось время, когда вся работа сделана, а новой ещё не нагрузили :-) К сожалению, фраза сейчас не актуальна :-)))

Ссылки
Мануал в формате PDF я уже упоминал, очень толковая вещь, но занудно написанная и довольно неряшливая. Начальные сведения можно найти у моего забугорного коллеги, продвинутые сведения и приёмы - у орлов из IBM. Товарищ jetxee привёл несколько примеров использования ImageMagick в скриптах. Этого должно хвтатить на первое время.