ImageMagick — набор программ (консольных утилит) для чтения и редактирования файлов множества графических форматов.
Обработка изображений происходит через обращение к консольной утилите convert. Помимо преобразования изображений из одного формата в другой (например из текста pdf в картинку png) утилита может заменить графический редактор. Склейка и обрезка изображений, изменение яркости и контраста, применение фильтров - всё это умеет convert. Кроме того операции с консольной утилитой легко автоматизируются. Есть возможность создавать специальные скрипты для ImageMagic которые будут производить сложные операции с изображением.
Многие скрипты можно скачать с официального сайта.
Поворот
Повернуть по часовой стрелке на 90 градусов:
0 - радиус. лучше задавать именно 0.
20 - сигма (размер ядра?). Чем больше тем сильнее будет размыто изображение.
Медианный фильтр
Регулировка яркости и контраста
Более радикальный способ уменьшения числа цветов - оставить лишь два. Каждый пиксель яркостью меньше 50% будет черным, а яркостью больше - белым.
Если операция занимает много времени, то добавлением ключа -monitor можно порадовать себя информацией о прогрессе.
В результате должно получится что-то похожее:
2. Удаление тени.
Для удаление тени используем следующую формулу для яркости каждого пикселя:
R - яркость пикселя в результирующем изображении. I1, I2 - яркость соответствующих пикселей на входных изображениях.
0.5 добавим чтобы сильно не потерять яркость, ведь используется вычитание которое яркость уменьшит.
Чтобы задать такую операцию, которая называется Извлечение зерна (Grain extract) зададим несколько параметров программе:
В данном случае будем использовать свою операцию, поэтому зададим значение oper как Mathematics.
Далее нужно привести параметры этой операции, которая и будет задавать нашу формулу. По умолчанию в ImageMagic используется формула:
A*I1 * I2 + B * I1 + C * I2 + D.
Её можно видоизменить задавать значение коэффициентов. A, B, C, D.
Чтобы она выглядела как формула приведённая выше зададим такие значения коэффициентов:
A = 0, B = 1, C = -1, D = 0.5.
Эти параметры операции Mathematics задаются ещё одним ключём:
В конце концов должна получится следующая команда:
Получим такую картинку:
Остаётся только подправить яркость, контраст (кому нужна серая бумага?) и немного текст. Убрать серый фон бумаги можно и подправив гистограмму, обрезав все относительно светлые пиксели.
3. Исправляем яркость и контраст.
Параметры подбираются тоже опытным путём.
Записи в нижней части изображения выглядят бледными.
4. Используем нерезкую маску (Unsharpen mask) чтобы исправить это, и увеличить читаемость.
Наконец можно сравнить исходное изображение с полученным поместив их рядом:
Цвета немного пострадали, но зато пропала тень, делающая картинку неоднородной.
Подобные операции требуются не только для лучшего восприятия человеком но и для работы алгоритмов машинного зрения. Которым для успешной работы требуются хорошие не зашумленные изображения, без лишних деталей.
Всё вместе
Дополнение
Если изображение имеет избыточно больное разрешение, то для ускорения обработки можно его уменьшить. Дополнительно можно убрать цвета.
Операцию повышения яркости и контрастности можно заменить работой с гистограммой (см. -level).
Фильтра Гаусса используется для размытия. Он является фильтром низких частот, т.е. обрубает высокие частоты (spatial frequency). Частоту которая служит порогом можно регулировать с помощью параметра фильтра - сигмы.
Значит можно использовать один фильтр Гаусса, который отбросит высокие частоты (условно: > x1 ) и другой фильтр Гаусса, которые отбросить частоты чуть ниже (условно: >x0).
x0 > x1.
Получатся два изображения, которые не содержат частот выше x1, а одно из них не содержит частот выше x1. Значит, вычитанием второго изображения из первого можно получить частоты лежащие в диапазоне от x0 до x1.
Это свойство и использовано в фильтре "Разница по Гауссу". Этот фильтр уберет слишком крупные детали (частоты < x0) и слишком крупные (частоты > x1).
Параметры фильтра обычно побираются экспериментально, но можно использовать числа из примера. Меньшее из чисел, не стоит делать большим - от него зависит размер границ. https://docs.gimp.org/ru/plug-in-dog.html
Изображение получится инвертированным поэтому инвертируем его снова (-negate), повысим контрастность (-normalize) и, наконец, "откусим" 60% самых светлых пикселей и 9% самых тёмных, уменьшив яркость ( 0.1 ).
Фильтр Разница по Гауссу является одним из семейства фильтров, которые призваны выделять контуры. Они используются в машинном зрении, например чтобы выделить контуры номерного знака на автомобиле.
Обработка изображений происходит через обращение к консольной утилите convert. Помимо преобразования изображений из одного формата в другой (например из текста pdf в картинку png) утилита может заменить графический редактор. Склейка и обрезка изображений, изменение яркости и контраста, применение фильтров - всё это умеет convert. Кроме того операции с консольной утилитой легко автоматизируются. Есть возможность создавать специальные скрипты для ImageMagic которые будут производить сложные операции с изображением.
Многие скрипты можно скачать с официального сайта.
Изменение одного из размеров..
...с сохранением соотношения сторон
# resize image to height 25, keeping aspect ratio convert -geometry x25 src/image1.png out/image1.pngЕсли операция требует двух параметров, то они часто разделяются символом x. В примере первый параметр (ширина) не задан.
Поворот
Повернуть по часовой стрелке на 90 градусов:
convert 1.png -rotate 90 rotated.png
Кадрирование
Равномерно обрезать изображение по всем краям оставив 90% ширины и 90% высоты
convert my_image.jpg -gravity center -crop 90% croped.jpg
Изменение DPI
Часто при преобразовании PDF в PNG программа сильно занижает DPI. Поэтому это значение стоит задать отдельно с помощью параметра -density.
convert -density 250 file.pdf new_file.png
-flatten - чтобы заменить прозрачность - белым
-transparent white - не работает
density нужно задавать до имени входного файла
Создание pdf из изображений
convert способен и выполнять обратную операцию - создание pdf из набора изображений. Каждое изображение в примере станет отдельной страницей документа
convert 1.jpg 2.jpg 3.jpg result.pdfМожно повернуть (или выполнить другие операции) отдельные картинки перед добавление в pdf
convert 1.jpg 2.jpg \( 3.jpg -rotate 90 \) result.pdf
Склейка изображений
Добавление изображений в вертикальную ленту: -append
Добавление изображений в горизонтальную ленту: +append
convert first.png second.png -append compare.png
convert first.png second.png +append compare.png
Повторение изображения.
convert first.png clone 0 +append first2.pngЭта команда повторит первое изображение (индекс 0) и поместит его
справа (+append) от оригинала.
Над копие можно производить отдельные операции, заключив эти операции и команду copy в скобки:
Копия перед добавлением к оригиналу будет повёрнута на 180 градусов:
convert 1.png \( -clone 0 -rotate 180 \) +append 1+1.png
Размытие
Размытие по Гауссу
-gaussian-blur 0x20
0 - радиус. лучше задавать именно 0.
20 - сигма (размер ядра?). Чем больше тем сильнее будет размыто изображение.
Медианный фильтр
-median 20
Показывать прогресс
Некоторые операции
занимают заметное количество времени, поэтому чтобы не скучать можно
включить отображение статуса и прогресса операции
-monitor
Регулировка яркости и контраста
convert -brightness-contrast -10x40 2.png out_bc.png
установить яркость -10, контраст 40. Значения изменяются в [-100, +100]
Регулировка уровней
Операция -level 25%,75%
возьмёт 25% самых тёмных пикселей сделав их чёрными, а 25% (100 - 75)
самых светлых сделает белыми [doc: Direct Level Adjustments]. При этом диапазон яркостей оставшихся
пикселей будет масштабирован, чтобы растянуть их по всей шкале яркостей.Эта операция называется линейной коррекцией. Она призвана повысит контрастность изображения.
Исходное изображение |
изображение после операций с гистограммой |
На изображениях выше видно, что черного и белого цвета стало больше. А серых оттенков - меньше. Можно исходное изображение в графическом редакторе (например GIMP) и выбрав операцию Уровни подвигать ползунки под гистограммой следя как изменяется картинка.
Оттенки теперь представлены 50% всех пикселей, остальные 50% (слева и справа) делят черные и белые пиксели. |
См также Sigmoidal Non-linearity Contrast.
Преобразовать в черно-белое
convert -type grayscale my_image.jpg gray.jpg;
Обрезка по уровню:
Более радикальный способ уменьшения числа цветов - оставить лишь два. Каждый пиксель яркостью меньше 50% будет черным, а яркостью больше - белым.
convert -evaluate Threshold 50% 1.png out1.png
Разделение всех пикселей на черные и белые может быть полезна для последующей машинной обработки изображения, но для человеческого глаза чаще проще воспринимать картинку где присутствуют полутона.
Фильтры
Оставить только горизонтальные линииconvert source.png -morphology close:5 "1x5: 1,1,1,1,1" result.png
Регулируя параметры фильтра, число затариваемых пикселей (здесь их пять) можно оставлять не все вертикальные линии, а определённой длинны.
Число 5 (после close) - это количество повторений фильтра.
Аналогично можно оставить только горизонтальные линии изменив 1x5 на 5x1.
Применение фильтров в документации: http://www.imagemagick.org/Usage/morphology/#kernel
Другой способ удаления линий: https://stackoverflow.com/questions/41619646/image-processing-to-remove-lines
Число 5 (после close) - это количество повторений фильтра.
Аналогично можно оставить только горизонтальные линии изменив 1x5 на 5x1.
Применение фильтров в документации: http://www.imagemagick.org/Usage/morphology/#kernel
Другой способ удаления линий: https://stackoverflow.com/questions/41619646/image-processing-to-remove-lines
Обработка сфотографированного документа. Непрактичный пример.
Часто на сфотографированном документе или конспекте оказывается тень, например когда фотокамера загораживает источник света. Сделать изображение однородным относительно просто, достаточно "извлечь" из изображения только саму тень не затронув текст. Такая операция называется выравнивание освещения.
Извлечь тень можно сильно сгладив изображение, так чтобы текст слился с фоном. Таким образом полученное размытое изображение будет содержать преимущественно яркость. Иногда даже удаётся таким образом удалить тени от изгибов (или сами изгибы) бумаги, если применять медианное размытие (фильтр).
Исходное изображение. |
Пусть исходное изображение сохранено в файле source.jpg
0. Диапазон яркостей изображения может быть узким. Тогда изображение выглядит малоконтрастным. Увеличим диапазон яркостей растянув гистограмму.
0. convert source.jpg -normalize source1.jpg
0. Диапазон яркостей изображения может быть узким. Тогда изображение выглядит малоконтрастным. Увеличим диапазон яркостей растянув гистограмму.
0. convert source.jpg -normalize source1.jpg
1. Выделим тень
60 - радиус в пикселях, на котором будет производится размытие вокруг данного пикселя. Подбирается экспериментально. Результирующее изображение не должно содержать заметных следов записей, только тени.convert source1.jpg -median 45 blur.jpg
Если операция занимает много времени, то добавлением ключа -monitor можно порадовать себя информацией о прогрессе.
В результате должно получится что-то похожее:
Изображение после применения медианного фильтра. Осталось только тень. |
2. Удаление тени.
Для удаление тени используем следующую формулу для яркости каждого пикселя:
R = I1 - I2 + 0.5
Здесь считаем, что яркость пикселя изменяется от 0 до 1. Потому что так считает ImageMagic.R - яркость пикселя в результирующем изображении. I1, I2 - яркость соответствующих пикселей на входных изображениях.
0.5 добавим чтобы сильно не потерять яркость, ведь используется вычитание которое яркость уменьшит.
Чтобы задать такую операцию, которая называется Извлечение зерна (Grain extract) зададим несколько параметров программе:
- -compose oper
В данном случае будем использовать свою операцию, поэтому зададим значение oper как Mathematics.
Далее нужно привести параметры этой операции, которая и будет задавать нашу формулу. По умолчанию в ImageMagic используется формула:
A*I1 * I2 + B * I1 + C * I2 + D.
Её можно видоизменить задавать значение коэффициентов. A, B, C, D.
Чтобы она выглядела как формула приведённая выше зададим такие значения коэффициентов:
A = 0, B = 1, C = -1, D = 0.5.
Эти параметры операции Mathematics задаются ещё одним ключём:
Наконец чтобы на выходе получилось одно изображение (на входе то будет два) используем ключ
- -define compose:args='0,-1,1,0.5'
- -composite
В конце концов должна получится следующая команда:
convert -compose Mathematics -define compose:args='0,1,-1,0.5' -composite blur.jpg source1.jpg result0.jpg
Получим такую картинку:
После извлечения зерна тень пропала! |
3. Исправляем яркость и контраст.
Параметры подбираются тоже опытным путём.
convert -brightness-contrast 30x60 result0.jpg result1.jpgРезультат:
за счёт увеличения яркости фон бумаги стал практически однородным и белым |
4. Используем нерезкую маску (Unsharpen mask) чтобы исправить это, и увеличить читаемость.
convert -brightness-contrast 30x60 result0.jpg result1.jpg
Наконец можно сравнить исходное изображение с полученным поместив их рядом:
convert +append source.jpg result1.jpg compare.jpg
Цвета немного пострадали, но зато пропала тень, делающая картинку неоднородной.
Подобные операции требуются не только для лучшего восприятия человеком но и для работы алгоритмов машинного зрения. Которым для успешной работы требуются хорошие не зашумленные изображения, без лишних деталей.
Всё вместе
convert source.jpg -normalize source1.jpg
convert source1.jpg -median 45 blur.jpg
convert -compose Mathematics -define compose:args='0,1,-1,0.5' -composite blur.jpg source1.jpg result0.jpg
convert -brightness-contrast 30x60 result0.jpg result1.jpg
convert -brightness-contrast 30x60 result0.jpg result1.jpg
Дополнение
Если изображение имеет избыточно больное разрешение, то для ускорения обработки можно его уменьшить. Дополнительно можно убрать цвета.
Операцию повышения яркости и контрастности можно заменить работой с гистограммой (см. -level).
Обработка сфотографированного документа. Практичный пример.
Автор не до конца понимает как это работает, но объяснить для гуманитариев попробует :)Фильтра Гаусса используется для размытия. Он является фильтром низких частот, т.е. обрубает высокие частоты (spatial frequency). Частоту которая служит порогом можно регулировать с помощью параметра фильтра - сигмы.
Значит можно использовать один фильтр Гаусса, который отбросит высокие частоты (условно: > x1 ) и другой фильтр Гаусса, которые отбросить частоты чуть ниже (условно: >x0).
x0 > x1.
Получатся два изображения, которые не содержат частот выше x1, а одно из них не содержит частот выше x1. Значит, вычитанием второго изображения из первого можно получить частоты лежащие в диапазоне от x0 до x1.
Это свойство и использовано в фильтре "Разница по Гауссу". Этот фильтр уберет слишком крупные детали (частоты < x0) и слишком крупные (частоты > x1).
Параметры фильтра обычно побираются экспериментально, но можно использовать числа из примера. Меньшее из чисел, не стоит делать большим - от него зависит размер границ. https://docs.gimp.org/ru/plug-in-dog.html
convert source.png -morphology Convolve DoG:15,100,0 -negate -normalize -level 60%,91%,0.1 result.png-morphology Convolve DoG:15,100,0 - применение фильтра "Разница по Гауссу" (Difference of Gaussians, IM doc).
Изображение получится инвертированным поэтому инвертируем его снова (-negate), повысим контрастность (-normalize) и, наконец, "откусим" 60% самых светлых пикселей и 9% самых тёмных, уменьшив яркость ( 0.1 ).
Фильтр Разница по Гауссу является одним из семейства фильтров, которые призваны выделять контуры. Они используются в машинном зрении, например чтобы выделить контуры номерного знака на автомобиле.
Алсо
Преобразование сканированного документа в текст
https://askubuntu.com/questions/16268/whats-the-best-simplest-ocr-solutiontesseract my_image.png my_text -l rus+eng
Ссылки
youtube: Ретушь в GIMP | Часть 3 | Частотное разложение
Whiteboard Picture Cleaner - простой однострочный скрипт для "очистки" фотографии маркерной доски.
Cжатие и улучшение рукописных конспектов
Обработка сканов с «манхэттенской» структурой
Whiteboard Picture Cleaner - простой однострочный скрипт для "очистки" фотографии маркерной доски.
Cжатие и улучшение рукописных конспектов
Обработка сканов с «манхэттенской» структурой