Часто требуется не просто обработать или улучшить изображение, но
применить последовательность операций к большому количеству
изображений. В этом нам поможет консольный графический редактор
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
Локальная адаптивная бинаризация по порогу производится при помощи следующего параметра:
Здесь имеется в виду область размером ШиринаxДлина,
в пределах которой происходит порог. Смещение определяет степень
отклонения значений пикселей (в процентах). Данные параметры стоит
подбирать с визуальным контролем (запустить ещё и просмотрщик
изображений).
Постеризация
Уменьшение количества цветов на изображении:
-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: если там вызвать
диалог кадрирования,
Изменить плотность изображения
Для того, чтобы задать количество пикселей на дюйм, следует воспользоваться ключом:
-density DPIгоризонтальноеxDPIвертикальное
-density число
Первый
вариант нужен тогда, когда по вертикали и горизонтали разрешение
разное. Второй вариант проще: если нужно задать разрешение, одинаковое
в обоих направлениях.
Поворот изображения
Чтобы повернуть изображение, указываем:
-rotate "+-градусы"
Для того, чтобы повернуть изображение по часовой стрелке, пишем -rotate "+90" для поворота против часовой стрелки, соответственно
convert -fill "#ddddff" ...
convert -fill "rgb(65000,65000,65535)" ...
Фильтры для улучшения изображений
Приведены алгоритмы размытия / повышения резкости и шумоподавления.
Размытие по Гауссу
Чтобы размыть изображение по Гауссу:
-blur Радиус
-blur РАДИУСxСИГМА
Размытие изображения по Гауссу на РАДИУС пикселей. Опционально можно задать степень (стандартное отклонение) - задав СИГМУ.
Размыть изображение, "завращав" его вокруг центра, можно:
-swirl градус
на заданное количество градусов.
Простой метод удаления спекл-шума (мультипликативный шум):
-despeckle
Действие приводит к лёгкому размытию.
Выделение краёв
Для выделения краёв на изображении следует использовать ключ:
-edge радиус
Приводит к появлению оконтуренного изображения (по всей видимости, применяется метод Собела).
Увеличение резкости
Для того, чтобы изображение стало более резким, можно применить ключ:
Используется оператор Гаусса, требуется задание радиуса и стандартного отклонения (Сигма)
Медианная фильтрация
Для удаления импульсного шума с изображения следует использовать медианную фильтрацию:
-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 в скриптах. Этого должно хвтатить на первое время.