ещё несколько слов об 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 (шум Пуассона).
Ответить