1/30/2007

Работа с изображениями в Линукс: морфологический анализ в быту

Задача: улучшить фотографию, сделать более чёткими края и убрать, по возможности, шум с изображения.
Решение: в этом деле нам может помочь морфологический анализ[1] изображений, Линукс и графический редактор GiMP.

Даже люди, очень далёкие от фотографии и профессиональной работы с графикой знают, что если в Фотошопе или Гимпе ткнуть в пункт меню "Unsharp Mask" или "Sharpen", то картинка станет более чёткой, хотя вокруг контуров появляется "нимб" и усиливаются шумы. Кто-нибудь слыхал про такие методы оконтуривания, как Sobel или Laplas - при некоторых навыках работы со слоями так тоже можно знатно улучшать фотографии.
Конечно, работая с математическими системами MATLAB или GNU/Octave можно добиться существенно лучших результатов, но это уже профессиональное поле - а хотелось бы получить приемлемый результат без чрезмерных интеллектуальных усилий. И тут мы обращаем внимание на пункт "Общие" в меню "Фильтры" замечательного графического редактора GiMP...


Документ с тонкими линиями
Иногда нужно распечатать сканированные документы, которые распечатывал кто-то очень жадный: например, на струйном принтере в экономном режиме. В итоге буквы и линии прерываются, так что распечатать это со сканированного оригинала очень трудно. Например, вот такой чек:

Здесь, конечно, можно обойтись и Unsharp Mask, но мы попробуем обойтись: в случае с реальной проблемой этот фильтр не поможет. Нам поможет морфологическая дилатация [2].

Морфологическая дилатация
Немного теории
Не вдаваясь в тонкости: есть две основные операции морфологического анализа - дилатация (dilate) и эрозия (erode). Дилатация приводит к расширению, "разрастанию" пикселей изображения, эрозия - к истончению, "выветриванию" пикселей. Комбинируя эти две операции по очерёдности применения к изображению и пользуясь слоями, можно добиться очень интересных эффектов.

Идём в меню "Фильтры", выбираем "Общие", потом "Dilate" - видим результат: пиксели изображения "разрослись", что нам и требовалось.

После этого можно уже применять и другие фильтры повышения чёткости.


Подчёркивание контуров
Ситуация сложнее: нужно подчеркнуть контуры изображения, и желательно не слишком усиливать шумы, особенно на цветном изображении. Можно воспользоваться имеющимися в GiMP методами Собеля, Превита, Лапласа и ЛОГ, но они склонны усиливать шумы (особенно два последних). Нам нужен морфологический градиент (о чём, кстати, уже говорилось тут[3]).

Морфологический градиент
Немного теории

Выше говорилось о эрозии и дилатации - сейчас объединим их для нахождения градиента на изображении, то есть контуров рисунка. Морфологический градиент = (Изображение + Дилатация) - ( Изображение + Эрозия). Из интуитивных соображений понятно: если из разросшегося изображения вычесть истончённое, то сухой остаток и есть контуры.

Для этого в Гимпе копируем слой с исходным изображением на новый два раза (нужно применить две операции). После чего к одному слою применяем дилатацию, к другому - эрозию.

После чего слой с дилатацией размещаем над эродированным изображением, и дилатированному слою ставим режим "Вычитание":

Видим, что остались одни контуры. Теперь отключаем слой с исходным изображением и сводим видимые слои ("Изображение" - "Объединить видимые слои"). Для таких орлов, как мы, дальше - дело техники: можно, например, поставить получившемуся слою режим "Различие", поставить ему непрозрачность 40-50% и включить обратно слой с исходным изображением. Видим, что фотографии полегчало: контуры более явственные и шумы не очень выросли.

Следует отметить, что данный метод, при своей простоте, очень и очень мощный: контуры, выделенные морфологическим градиентом, менее чувствительны к шумам и содержат больше информативных деталей. Этому, кстати, посвящена вполне серьёзная работа[4].
Ощутив свою неимоверную крутость и не забыв при этом про себя похвалить авторов Гимпа, двигаемся дальше, к новым вершинам.


Очистка изображения от шумов и мелких неоднородностей

Всё здорово, но на изображении присутствует цветной шум и мелкие пакостные цветовые артефакты - хотелось бы от них по возможности избавиться, не затронув при этом контуры. В принципе, можно размыть изображение ("Фильтры" - "Размывание"), а потом пройтись Unsharp Mask, но мы поступим иначе и на волне предыдущих успехов немного углубимся в теорию.

Морфологическое размыкание

И снова чуток теории
Дальнейшее усложнение морфологических техник "на пальцах" будет сложнее пояснить. Но можно воспользоваться аналогией: представьте себе, что по контурам вашей картинки катится шарик некоторого радиуса. Точки соприкосновения этого шарика с контурами изображения станут новыми контурами. Размыкание
сглаживает контуры объекта, обрывает узкие перешейки и устраняет выступы небольшой ширины. Замыкание так же сглаживает участки контуров, но заполняет узкие разрывы и длинные углубления малой ширины, устраняет небольшие острова и заполняет промежутки контура.
Размыкание = Дилатация (Эрозии (Изображения) )
Замыкание = Эрозия (Дилатации (Изображения) )


В принципе, для того, чтобы уменьшить цветовой шум на фотографии, нужно применить морфологическое размыкание изображения. Для этого, как и прежде, копируем слой с исходным изображением. Далее применяем к скопированному слою сначала эрозию, а потом дилатацию. Теперь включаем слой с исходным изображением и ставим непрозрачность для разомкнутого слоя процентов 30-40% - далее, что называется, по вкусу.

Видно, что шумов стало меньше, и контуры особенно не пострадали. Но если хочется и шумы порубить, и контуры сохранить - есть для этого более навороченные техники, о чём ниже.

*Морфологический алгоритм OCCO
Это уже весьма продвинутая техника[5] для тех, кто ещё не уснул от предыдущих экзерсисов (OCCO = Opening-Closening-Closening-Opening, то есть Размыкание-Замыкание-Замыкание-Размыкание). Состоит она из сложения результатов размыкания и замыкания. Не буду утомлять теорией - идея довольно проста: сделать две копии слоя изображения, к первому слою применить сначала дилатацию, а потом эрозию, ко второму - сначала эрозию, потом дилатацию. После этого слоям с размыканием и замыканием поставить непрозрачность для начала по 50% и потом подогнать под свой случай по вкусу.

Результат на снимке: и шумов меньше, и контуры не пострадали.

Надеюсь, что это небольшое введение в практическое использование возможностей GiMP будет полезно.

Литература:
[1] Jean Serra,Image Analysis and Mathematical Morphology.Academic Press, London, 1982.
[2] Р. Вудс Р.Гонсалес, Цифровая обработка изображений, Москва, Техносфера, 1072 с., 2006
[3] М.В. Конник, Жизнь и борьба с GiMP, Записки дебианщика, ссылка, 2006.
[4] Н.Н. Евтихиев, М.В. Конник, Р.С. Стариков, Разработка алгоритмов выделения контуров для оптико-электронного корреляционного различения изображений, Научная сессия МИФИ-2007, том 15, с.137-138.
[5] Richard Alan Peters, A new algorithm for image noise reduction using mathematical morphology,IEEE Transactions on Image Processing, Volume 4, Number 3:554-568, 1995.

14 комментариев:

  1. Да, заумно написал :). А не знаешь как можно проделать тоже что и с "почта россии", только с .pdf документом?
    Недавно читал что Adobe собирается открыть pdf, было бы хорошо, а то не то что в линукс, в виндовс нет ничего чтобы нормально можно было с ним работать.

    ОтветитьУдалить
  2. Спасибо, из той серии, статью не читал, но как понадобится буду знать где смотреть;-)

    ОтветитьУдалить
  3. serhiy cherevko

    Вы странные вещи какие-то пишете. Спецификация на PDF была доступна всегда.

    Что конкретно Вы хотите делать с PDF?

    ОтветитьУдалить
  4. 2 serhiy cherevko
    Да, заумно написал :)
    Да вроде старался попроще: тыкнуть сюда, слою поставить прозрачность... чего сложного-то!?

    А не знаешь как можно проделать тоже что и с "почта россии", только с .pdf документом?
    Эм... если честно не сразу понял - имеется в виду утолщение линий, но с документом в формате PDF? Тогда в гимпе открыть PDF на нужной странице и далее по тексту. Гимп нормально PDF/PS открывает, проблем нет.

    2 Tigro said...
    Спасибо, из той серии, статью не читал, но как понадобится буду знать где смотреть;-)
    Не за что - это по материалам конференции МИФИ. Просто функция в Гимпе есть, но не многие знают, что это и для чего можно использовать.

    ОтветитьУдалить
  5. Наверное я чего-то не понял с этими спецификациями. Имелось ввиду, что есть отсканированная статья (книжка), но текст почти не виден.

    ОтветитьУдалить
  6. 2 serhiy cherevko
    Имелось ввиду, что есть отсканированная статья (книжка), но текст почти не виден.
    Ещё раз: проблемы нет, открываем в гимпе и дилатацией утюжим. Если что - лучше пишите в почту.

    ОтветитьУдалить
  7. А можете чего-нибудь посоветовать на тему такого случая?
    Дан скан с чб репродукции, причем разрешение сканирования было значительно выше разрешения печати - офсетная точка размером 3х3 пиксела. Надо сделать рисунок более контрастным и уменьшить, чтоб при этом не получился ни муар, ни блюр лишний.

    ОтветитьУдалить
  8. 2 portnov
    Дан скан с чб репродукции, причем разрешение сканирования было значительно выше разрешения печати - офсетная точка размером 3х3 пиксела. Надо сделать рисунок более контрастным и уменьшить, чтоб при этом не получился ни муар, ни блюр лишний.
    Сложно что-то советовать, не видя конкретного изображения. Вот чего делать не стоит, так это рваться применять "нечёткую маску" - она как раз и может дать муар. Присылайте уменьшенную копию в jpg на почту, поглядим.

    ОтветитьУдалить
  9. Полезная штука,конечно...
    Тоже есть скан,и не один,а сотни.
    Пятна,нечёткий текст,серый неровный фон,да ещё бывает строки под наклоном...
    Интересно,что нужно сделать и в какой последовательности?
    С Image Magik эксперементировал,но просмотрел инструкцию-вроде там подобного фильтра нет.

    ОтветитьУдалить
  10. Статья класс, наверное самый просто метод повышения резкости и подавления шумов в Gimp. Кстати что думаете насчет плагина к гимпу под названием Grayscoration - собственно шумодав.

    ОтветитьУдалить
  11. Спасибо большое!!!! Просто огромное, сейчас вожусь с обработкой изображений (алгоритмы и все-такое и не всегда ясно как на практике..), а тогда нет смысл учить что-то, у вас примеры классные, Гонсалес слишком ужал материал из-за компактности и когда что-то хочется побольше узнать приходится лазить и искать...и не всегда внятный ответ находится

    ОтветитьУдалить
  12. Спасибо! Как программисту-практику помогло! Нашёл исходники алгоритмов дилатации и эрозии, вставил в свой проект вышеописанные супертехники и наступил коммунизм :)

    ОтветитьУдалить
  13. Спасибо за статью, мне помогло.

    ОтветитьУдалить