Задача: улучшить фотографию, сделать более чёткими края и убрать, по возможности, шум с изображения.
Решение: в этом деле нам может помочь морфологический анализ[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.
Решение: в этом деле нам может помочь морфологический анализ[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.
Да, заумно написал :). А не знаешь как можно проделать тоже что и с "почта россии", только с .pdf документом?
ОтветитьУдалитьНедавно читал что Adobe собирается открыть pdf, было бы хорошо, а то не то что в линукс, в виндовс нет ничего чтобы нормально можно было с ним работать.
Спасибо, из той серии, статью не читал, но как понадобится буду знать где смотреть;-)
ОтветитьУдалитьserhiy cherevko
ОтветитьУдалитьВы странные вещи какие-то пишете. Спецификация на PDF была доступна всегда.
Что конкретно Вы хотите делать с PDF?
спасибо :)
ОтветитьУдалить2 serhiy cherevko
ОтветитьУдалитьДа, заумно написал :)
Да вроде старался попроще: тыкнуть сюда, слою поставить прозрачность... чего сложного-то!?
А не знаешь как можно проделать тоже что и с "почта россии", только с .pdf документом?
Эм... если честно не сразу понял - имеется в виду утолщение линий, но с документом в формате PDF? Тогда в гимпе открыть PDF на нужной странице и далее по тексту. Гимп нормально PDF/PS открывает, проблем нет.
2 Tigro said...
Спасибо, из той серии, статью не читал, но как понадобится буду знать где смотреть;-)
Не за что - это по материалам конференции МИФИ. Просто функция в Гимпе есть, но не многие знают, что это и для чего можно использовать.
Наверное я чего-то не понял с этими спецификациями. Имелось ввиду, что есть отсканированная статья (книжка), но текст почти не виден.
ОтветитьУдалить2 serhiy cherevko
ОтветитьУдалитьИмелось ввиду, что есть отсканированная статья (книжка), но текст почти не виден.
Ещё раз: проблемы нет, открываем в гимпе и дилатацией утюжим. Если что - лучше пишите в почту.
А можете чего-нибудь посоветовать на тему такого случая?
ОтветитьУдалитьДан скан с чб репродукции, причем разрешение сканирования было значительно выше разрешения печати - офсетная точка размером 3х3 пиксела. Надо сделать рисунок более контрастным и уменьшить, чтоб при этом не получился ни муар, ни блюр лишний.
2 portnov
ОтветитьУдалитьДан скан с чб репродукции, причем разрешение сканирования было значительно выше разрешения печати - офсетная точка размером 3х3 пиксела. Надо сделать рисунок более контрастным и уменьшить, чтоб при этом не получился ни муар, ни блюр лишний.
Сложно что-то советовать, не видя конкретного изображения. Вот чего делать не стоит, так это рваться применять "нечёткую маску" - она как раз и может дать муар. Присылайте уменьшенную копию в jpg на почту, поглядим.
Полезная штука,конечно...
ОтветитьУдалитьТоже есть скан,и не один,а сотни.
Пятна,нечёткий текст,серый неровный фон,да ещё бывает строки под наклоном...
Интересно,что нужно сделать и в какой последовательности?
С Image Magik эксперементировал,но просмотрел инструкцию-вроде там подобного фильтра нет.
Статья класс, наверное самый просто метод повышения резкости и подавления шумов в Gimp. Кстати что думаете насчет плагина к гимпу под названием Grayscoration - собственно шумодав.
ОтветитьУдалитьСпасибо большое!!!! Просто огромное, сейчас вожусь с обработкой изображений (алгоритмы и все-такое и не всегда ясно как на практике..), а тогда нет смысл учить что-то, у вас примеры классные, Гонсалес слишком ужал материал из-за компактности и когда что-то хочется побольше узнать приходится лазить и искать...и не всегда внятный ответ находится
ОтветитьУдалитьСпасибо! Как программисту-практику помогло! Нашёл исходники алгоритмов дилатации и эрозии, вставил в свой проект вышеописанные супертехники и наступил коммунизм :)
ОтветитьУдалитьСпасибо за статью, мне помогло.
ОтветитьУдалить