изображение,
обработка
14 коммент.
Решение: в этом деле нам может помочь морфологический анализ[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.