ещё несколько слов об 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 3×3+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 95×85+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 (шум Пуассона).

Взято отсюда >>>