Часто требуется не просто обработать или улучшить изображение, но применить последовательность операций к большому количеству изображений. В этом нам поможет консольный графический редактор 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 в скриптах. Этого должно хвтатить на первое время.
ImageMagick - мощный консольный графический редактор
Подписаться на:
Комментарии к сообщению (Atom)
32 комментариев: |высказаться!| RSS-лента дискуссии.|
ImageMagick очень удобно использовать для массовой обработки фотографий, например:
for fname in *.jpg; do mogrify -resize 640 $fname; done
уменьшает все картинки в каталоге до ширины 640, что полезно для выкладывания в интернет.
Причем пользоваться ImageMagick-ом можно и под Windows:
for %fname in (*.jpg) do mogrify -resize 640 %fname;
И никакой ворованный фотошоп не нужен :)
Антон, спасибо за такие полезные сведения. Обязательно включу их в пост! Про то, что и под виндой можно использовать, не знал :-)
Спасибо за статью!
Мне как то на работе надо было обработать около 200 фотографий, жалко не знал про эту софтину(... Пробовал писать обработчик на питоне, но библиотека которой пользовался довольно криво ресайзила изображения... пришлось воспользоваться фотожоповскимм action и окнами:(, да и то не сильно то помогло - фотки разные, а в экшены никак логики не добавить... а так бы написал шел скрипт и готово!
Я для обработки примерно 500 снимком под оффтопиком использовал nconvert из пакета XnView. Пара минут и вся работа выполнена ;-)
2 Анонимный пишет...
Спасибо за статью!
Пожалуйста. Просто сам давно пользуюсь IM и вот решил заставить себя разобраться с остальными параметрами. Как всегда, узнал много нового. Теперь захожу сюда периодически и сам читаю :-))
Мне как то на работе надо было обработать около 200 фотографий, жалко не знал про эту софтину
Лучше поздно, чем никогда :-) У меня изображений обычно бывает за тысячу, поэтому на IM вышел в своё время сразу.
2 denvist пишет...
Я для обработки примерно 500 снимком под оффтопиком использовал nconvert из пакета XnView.
Интересно. Поискал в репозитории - не нашёл. Гугл помог - попробую. Спасибо.
Хорошо написано. Молодец!
По поводу массовой обработки для выкладывания фотографий я тоже уже писал (http://sovety.blogspot.com/2006/11/bash.html).
Хочу обратить внимание, что в большинстве случаев очень желательно указывать параметр -quality. Imagemagick имеет тенденцию сильно пережимать jpeg-и.
2 jetxee пишет...
Хорошо написано. Молодец!
Спасибо, стараюсь :-)
По поводу массовой обработки для выкладывания фотографий я тоже уже писал (http://sovety.blogspot.com/2006/11/bash.html).
Классная ссылка, как-то я её пропустил. Теперь поставил в посте.
Хочу обратить внимание, что в большинстве случаев очень желательно указывать параметр -quality. Imagemagick имеет тенденцию сильно пережимать jpeg-и.
Не замечал за ним такого. Может потому, что чаще всего работаю с TIFF :-) Надо будет приглядеться...
Немного поправил пост, добавил ссылки. Ценные мысли и ссылки всячески приветствуются.
Хорошая статья.
Но хотелось бы поправить автора.
IM всё-таки не редактор, а конвертер. Т.е., средство для преобразования изображений тем или иным методом.
А графический редактор - понятие, которое предполагает непосредственное изменение того, что ты видишь на экране.
Самая яркая аналогия - это vi и grep. Первое - редактор, второе - средство для преобразования.
анонимному:
grep — не средство преобразования, а средство фильтрации/поиска.
более уместно сравнение vi vs sed.
Фильтрация есть преобразование потока данных
2 Анонимный пишет...
Но хотелось бы поправить автора.
IM всё-таки не редактор, а конвертер. Т.е., средство для преобразования изображений тем или иным методом.
Конвертор - это sam2p и ему подобные tiff2png например. IM это намного, намного больше. Можно взять jpg-фотографию, повысить в ней резкость и изменить гамму, результат записав в другой файл. Ну и чем это отличается от 100% графического редактора The GIMP!?
А графический редактор - понятие, которое предполагает непосредственное изменение того, что ты видишь на экране.
Видимо, у нас разные понятия :-) Не важно, где происходит изменение - важен факт того, что программа не просто пересохраняет в другом формате, а имеет все признаки серьёзного графического редактора. Собственно, поэтому пост так и назван.
2 jetxee пишет...
анонимному:
grep — не средство преобразования, а средство фильтрации/поиска.
Именно! А IM - способен редактировать результат. Какой конвертор способен делать crop и resize?
Вот популярный пример из Форточек - программа ACDSEE.
Умеет всё, что перечислено. И тем не менее, это не редактор, а конвертер.
Вот определение графического редактора: http://ru.wikipedia.org/wiki/Графический_редактор
А вот ссылка на описание IM: http://ru.wikipedia.org/wiki/ImageMagick
Максимум, с чем можно согласиться, это утверждение, что IM - библиотека функций для обработки изображений.
Друзья, пардон, но всё-таки определение неверное.
Пасиб!!! Очень кстати прочитал вашу статью :)
Как раз нужно промаштабировать уйму фоток для галереи и возможно добавлю еще логотип :)
Спасибо автору за ценную инфу!!!
А вообще день ото дня просто поражаюсь величию и простоте линукса (перешел 2 недели назад)....а прога что надо для пакетной обработки фото. и главное как все просто и быстро)))
еще раз спасибо!
2 Анонимный пишет...
Вот популярный пример из Форточек - программа ACDSEE.
Я уже не знаю, что это за программа. Судя по тому, что видел в последний раз - комбайн, умеющий всё, кроме комфортного просмотра изображений :-) Мне мой GQview милей в сто раз: простой, быстрый и функциональный в меру.
Вот определение графического редактора
Ну, википедия это не аргумент, если честно. На сайте IM написано: "ImageMagick is a software suite..."
Насколько мне позволяют мои скромные познания в англицком, сие есть "программный пакет". Ну ладно, будем считать его пакетом. Убедили.
Друзья, пардон, но всё-таки определение неверное.
Ммм... чую светлую сторону силы в мыслях ваших... на размышление время требуется некоторое мне :-)
2 zer пишет...
Пасиб!!! Очень кстати прочитал вашу статью :)
А я давно хотел разобраться с настройками IM. Не далее как вчера сам сидел и читал её :-)
Как раз нужно промаштабировать уйму фоток для галереи
Именно под такие цели IM и заточен.
2 Анонимный пишет...
А вообще день ото дня просто поражаюсь величию и простоте линукса
Аналогично. В самом деле, именно в никсах (Линукс\БСД) так много простых мелочей, но без которых очень некомфортно в других системах. Консоль, нормальное автодополнение, find\grep\sed\, ssh... простые вещи, а поди ж ты :-)
а прога что надо для пакетной обработки фото. и главное как все просто и быстро)))
Действительно. Это не по одной картинке мышкой тыркать: ввввжик - и пара сотен обработано :-)
еще раз спасибо!
На здоровье! :-)
Подскажите пожалста, в чём я дурак?
Беру изображение JPEG 24 бит цветности (сканированный рисунок) и пытаюсь его скормить конвектору:
convert -colorspace GRAY 1.jpg 2.jpg
на что получаю:
Bogus input colorspace
Если перевожу в оттенки серого Гимпом - потом всё работает, например:
convert -colorspace GRAY 1.jpg 2.xpm
Хотя понятно, что конвертирования цветовой палитры не происходит, но всё же! Оччень интереснО!
PS Автору огромное уважение, его записи уже столько раз выручали!
При масштабировании желательно указывать фильтр сглаживания.((-filter)
>Подскажите пожалста, в чём я дурак?
Не верный синтаксис, надо так: convert 1.jpg -colorspace GRAY 2.jpg
Хостер дал путь, я вписал в галеру куда надобно в админке, после этого она превьюхи перестала делать, у меня до этого была похожая проблема с другой галерой, переключил на GD - работает.
Вот я и мыслю - или хостер не знает, что она не работает, или я дурак.
Есть ли быстрый способ проверить ее работу - т.е. работоспособность и наличие на хосте?
Хостер то дал :) если есть ссх - проверь через него выполнить любую тестовую команду - и гугл тебе в помощь. Если в ссх пашет, то проблема в пхп (скорее всего). Вообще имаджмаджик либо присутсвует в пхп либо нет, пути указывать не надо как правило, пути знает модуль пхп, который и делает системные вызовы. А если ты напрямую пытаешься послать команды на имаджмаджик из пхп - то это может и не получиться :)
Можно ли каким либо способ обрезать картинку с левой стороны? подскажите плиз...
Есть такая картинка:
http://pic.ipicture.ru/uploads/090225/PZW2JJVRfc.jpg
Посоветуйте, пожалуйста, если это не очень сложно, как:
1. Убрать фон.
2. Сделать чёрно-белым.
Делал -monochrome, то что нужно, но размер картинки увеличивается в 2 раза.
Заранее спасибо
Спасибки за обзор. Искал чем бы массово отконвертировать пачку файлов. Причем под оффтопиком ) Оказалось бинарники под оффтопик есть на оффсайте. Порадовался.) Еще раз спасибо.
Едиственное чего не понял - можно ли выполнить два преобразования в одну команду. То есть я делаю вот так (на примере одного файла):
converter 1.png 1.tif
converter -colorspace CMYK 1.tif 1r.tif
Ну то есть из png в тиф и потом в CMYK, А вот можно ли это как-то сделать за один раз?
А как это можно сделать через GUI? Есть программа для Gnome?
Помогите пожалуйста решить задачу.
Есть куча скринов с разных видео. Они имеют разные размеры и пропорции по ширине и высоте.
Как мне можно вырезать картинки с пропорцией 3 к 4 из центра кадра?
Здравствуйте virens, может вы подскажете, как можно указать чтобы горизонтально расположенные рисунки ресайзил до одной ширина, а вертикальные до другой (к примеру горизонтальные до 500px, а вертикальные до 400px) ?
converter -colorspace CMYK 1.png 1r.tif
навеки в закладках, спасибо!
Присоединяюсь к sysa! IrfanView выполняет пакетное изменение размера изображения по наибольшей стороне. Как это осуществить в mogrify.exe? Применение -resize MMMxNNN при 1024х768 на рисунок 768х1024 действует как 1024х1365.
Кстати, mogrify.exe удаляет оригинал, поэтому в свои скрипты можно добавить что-то наподобие for %%a in ("*.jpg") do copy "%%a" "%%~na.jpg.bak"
Скачал пакет "ftp://mirror.aarnet.edu.au/pub/imagemagick/binaries/", нашел convert.exe, но то же самое. Изменяет размер независимо от portrait/landscape положения. Пока вижу выход уменьшать картинку в процентном соотношении, если заранее известно, что все фото одинакового разрешения ;(
Как можно использовать здесь преобразование Фурье для морфинга одного изображения в другое?
Привет всем. помогите пожалуйста,а то я мозгом уже потёк.
нужен скрипт который бы ресайзил картинку и наносил на неё водяной знак. вот что я написал >>>
#!/bin/sh
# Dialog box to choose thumb's size
SIZE=`zenity --list --title="Выберите размер новой картинки" --radiolist --column="Выбор" --column="Размер по большой стороне" "" "100X100" "" "150X150" "" "200X200" "" "250X250" "" "300X300" "" "350X350" "" "400X400" "" "450X450" "" "500X500" "" "550X550" "" "600X600" "" "650X650" "" "700X700" "" "750X750" "" "800X800" "" "850X850" "" "900X900" "" "950X950" "" "1000X1000" "" "1050X1050" "" "1100X1100" "" "1150X1150" "" "1200X1200" "" "1250X1250"`
if [ "${SIZE}" == "" ]; then
zenity --error --text="Размер не выбран. Для использования выберите размер. "
exit 1
fi
#####
# Creating thumbnails for watermark. Directory for watermark "$HOME/WaterMark/", file "stamp.png"
convert -resize "${SIZE}" -bordercolor black -quality 100 "$HOME/WaterMark/stamp.png" "$HOME/WaterMark/stampTMP.png"
STAMP=$HOME/WaterMark/stampTMP.png
if [ "${STAMP}" == "" ]; then
zenity --error --text="Файл водяного знака не выбран. Выберите водяной знак , или
в домашнем каталоге создайте папку WaterMark,
и положите в неё водяной знак с именем stamp.png "
exit 1
fi
#####
# How many files to make the progress bar
PROGRESS=0
NUMBER_OF_FILES=`find -iname "*.jpg" -maxdepth 1 | wc -l`
let "INCREMENT=100/$NUMBER_OF_FILES"
mkdir -p thumbnails
# Creating thumbnails. Specific work on picture should be add there as convert's option
(for i in *.jpg *.JPG; do
echo "$PROGRESS";
echo "# Обработка $i";
PIC=`convert -resize "${SIZE}" -bordercolor black -quality 90 "${i}" thumbnails/${i%.*}".jpg"`
composite -gravity south -geometry +0+10 "${STAMP}" "${PIC}" "${PIC}'.jpeg'"
#####
#composite -gravity south -geometry +0+10 "${STAMP}" "${PIC}" "${PIC}"
#####
let "PROGRESS+=$INCREMENT"
done
) | zenity --progress --title "$Creating создание..." --percentage=0
#process png
# How many files to make the progress bar
PROGRESS=0
NUMBER_OF_FILES=`find -iname "*.png" -maxdepth 1 | wc -l`
let "INCREMENT=100/$NUMBER_OF_FILES"
mkdir -p thumbnails
# Creating thumbnails. Specific work on picture should be add there as convert's option
(for i in *.png *.PNG; do
echo "$PROGRESS";
echo "# Обработка $i";
convert -resize "${SIZE}" -bordercolor black -quality 90 "${i}" thumbnails/"${i}"
let "PROGRESS+=$INCREMENT"
done
) | zenity --progress --title "$Creating создание..." --percentage=0
в папке $HOME/WaterMark файл stamp.png это водяной знак в большом разрешении.
пытаюсь сделать что-бы после резайза водяного знака он писался не в файл, а в переменную. потом ресайзелись выбранные картинки по одной писались тоже в переменную потом на них наносился водяной знак и уже тогда запись в файл в новую директорию thumbnails.
Делаю start.bat с содержимым for %fname in (*.jpg) do mogrify -resize 640 %fname; и ничего не работает как поправить?
Отправить комментарий