Пользователь
0,0
рейтинг
30 сентября 2012 в 22:53

Разработка → Восстановление расфокусированных и смазанных изображений. Повышаем качество

Представляю вашему вниманию заключительную статью из трилогии «Восстановление расфокусированных и смазанных изображений». Первые две вызвали заметный интерес — область, действительно, интересная. В этой части я рассмотрю семейство методов, которые дают лучшее качество, по сравнении со стандартным Винеровским фильтром — это методы, основанные на Total Variaton prior.
Также по традиции я выложил новую версию SmartDeblur (вместе с исходниками в open-source) в которой реализовал этот метод. Итоговое качество получилось на уровне коммерческих аналогов типа Topaz InFocus. Вот пример обработки реального изображения с очень большим размытием:



Введение


Описывать базовую теорию деконволюции здесь я не буду, о ней очень подробно было написано в предыдущих статьях. Тем, кто не читал их или подзабыл, рекомендую для начала ознакомиться с ними, чтобы понять терминологию и классические подходы:

Часть 1. Теория;
Часть 2. Практика.

Прежде чем перейти к описанию Total Variation (далее TV prior), необходимо понять, какие же недостатки есть у алгоритмов типа классического Винеровского фильтра? Самые основные — это эффект типа звона (периодический ореол на краях объектов) даже при небольшом уровне шума, размывание границ и мелких деталей, а также плохое шумоподавление с точки зрения человеческого восприятия. Все это сильно мешает практическому применению фильтра Винера ограничивая его применение задачами технического восстановления изображений, например для прочтения интересующих надписей.
Поэтому в последнее время было разработано большое количество самых разных методов, цель которых состоит в улучшении визуального качества. Надо заметить, что количество деталей при этом, как правило не возрастает.

Описание TV prior


Основное качество Total Variation prior с точки зрения результата — сохранение резких краев и сглаживание артефактов деконволюции. Записывается следующим образом:

К сожалению, вычисление этого функционала нельзя сделать простым образом, поскольку здесь требуется применение весьма сложных техник оптимизации.
В качестве альтернативы можно использовать сглаженный функционал вместо абсолютного значения:

Когда эпсилон стремится к нулю, результат стремится к первоначальному определению Total Variation, но процесс оптимизации становится более сложным. И наоборот, при достаточном большом эпсилон результат оптимизации будет напоминать фильтр Винера с размытием краев. К сожалению, приведенная выше формула имеет неквадратичный вид, поэтому она не может быть просто вычислена в частотном пространстве Фурье, как это получалось с фильтрами Винера и Тихонова. Поэтому необходим один из методов пошаговой оптимизации для нахождения приближенного решения — например классический метод градиентного спуска:

Где тау вычисляется по следующей формуле:

А градиент сглаженного функционала определяется как:

Количество итераций должно быть достаточно большим — несколько сотен.

Это самый базовый подход в реализации TV prior, что называется «в лоб». Тем не менее, даже он дает очень неплохие результаты. На базе его в научных публикациях появилось много исследований, которые пытаются еще улучшить качество, а также уменьшить время расчета.

Практическая реализация


Описанные формулы, в принципе, несложные, хотя и очень громоздкие в реализации. Основная проблема — достичь высокого быстродействия, т.к. количество итераций очень большое и каждая итерация содержит много сложных действий. А именно — несколько сверток изображения целиком, вычисления полного градиента и дивергенции.
Скажу сразу, добиться хорошей скорости работы мне пока не удалось, на изображении размером несколько мегапикселей время финального вычисления составляет 2-3 минуты. Но Preview работает быстро — порядка 0.2 секунды.
Сборку под Windows можно скачать по адресу:
github.com/downloads/Y-Vladimir/SmartDeblur/SmartDeblur-1.27-win.zip
Исходники (под лицензией GPL v3) доступны по ссылке: github.com/Y-Vladimir/SmartDeblur

Основные изменения по сравнению с прошлой версией, которая была описана во второй части:
  • Добавлены два метода деконволюции: TV prior и фильтрация по Тихонову
  • Добавлена поддержка восстановления Гауссового размытия
  • Улучшена скорость работы (примерно в 2.5 раза)
  • Уменьшено потребление памяти (примерно в 1.5 раза)
  • Максимальный размер обрабатываемого изображения по умолчанию 3000 (но можно менять в настройках)
  • Добавлена секция настроек
  • Добавлен Updates Checker
  • Поддержка Drag&Drop
  • Добавлен Help Screen с примером изображения и советами по настройке
  • Исправлен баг с рябью в режиме preview

Язык C++ с использованием Qt.

Сравнение


Ну и теперь самое главное — на какое же качество можно рассчитывать при обработке размытых изображений. Будем сравнивать с топовым коммерческим аналогом Topaz InFocus. Остальные аналоги (типа FocusMagic) уже давно не поддерживаются или дают уж совсем неприемлемые результаты обработки. Итак поехали.
Сначала возьмем рекламный пример с сайта Topaz InFocus: www.topazlabs.com/infocus/_images/licenseplate_compare.jpg


Вот результат от Topaz InFocus:



А вот результат работы SmartDeblur при следующих параметрах:
Type: Motion Blur, Length: 10.1, Angle: -45, Smooth: 60%


Как видим, результаты очень схожие. И не так очевидно, что лучше. Topaz InFocus, судя по всему, тоже использует алгоритм, похожий на TV prior плюс пост-обработка в виде шарпинга краев. Надо заметить, что приведенное исходное смазанное изображение, с очень большой вероятностью, является синтетическим. Т.е. взято неискаженное изображение и применен фильтр Motion Blur. Это видно по практически идеальному восстановлению, а также по подозрительно целым параметрам искажения — угол 45 градусов и длина 10 пикселей.

Теперь возьмем реальное изображение, которое я вчера сфоткал на свой Canon 500D с ручным уводом фокуса:


Результат от Topaz InFocus при следующих параметрах:
Type: Out-of-Focus, Radius: 5.5, Suppress Artifacts: 0.34


Результат SmartDeblur при следующих параметрах:
Type: Out of Focus, Radius: 5.9, Smooth: 60%


Тут ничья, можно сказать. Параметры в каждой программе подбирались так, чтобы обеспечить наилучшее качество.

Еще один реальный пример снятый мною:


Результат SmartDeblur при следующих параметрах:
Type: Motion Blur, Length: 6.6, Angle: -37, Smooth: 53%


Выводы


Подошла к концу третья заключительная статья. Получилась она не особо большой, но, надеюсь, будет полезной. Как видим полученное качество обработки уже вполне приемлемо для реального применения. Основная проблема, которая остается — в местах, где есть светлые объекты, после обработки получается заметный эффект звона. Думаю, это связано с тем, что на светлых участках нарушается линейность отображения яркости пикселей, что дает неверную интерпретацию о его реальной яркости. Возможно, нужна логарифмическая предобработка яркости, либо еще что-то.

Еще раз напомню:
Сборку под Windows можно скачать по адресу:
github.com/downloads/Y-Vladimir/SmartDeblur/SmartDeblur-1.27-win.zip
Исходники (под лицензией GPL v3) доступны по ссылке: github.com/Y-Vladimir/SmartDeblur

И как обычно — буду очень рад замечаниям и предложениям по SmartDeblur!
Кто будет пробовать программу — учтите, что параметр качества Smooth в режиме превью и в режиме High-Quality ведет себя весьма по-разному. Поэтому финальный результат ползунка сглаживания можно оценить только после завершения просчета High-Quality.

P.S. Огромная просьба ко всем, кто мне пишет на почту. После публикации двух предыдущих статьей мне пришло (и продолжает приходить) большое количество писем с просьбой восстановить номера машин на кадрах с камер видеонаблюдения, когда весь номер занимает площадь несколько пикселей.
Я этим не занимаюсь! SmartDeblur этого тоже делать не умеет. Это задача совсем другого рода, а именно Super-Resolution, когда из нескольких изображений малого разрешения получается изображение высокого разрешения с новыми деталями, которых не было на исходных данных. Может быть когда-нибудь ей и займусь, но точно не в ближайшее время.

UPDATE Ссылка на продолжение:
Blind Deconvolution — автоматическое восстановление смазанных изображений

--
Vladimir Yuzhikov (Владимир Южиков)
Vladimir Yuzhikov @YUVladimir
карма
325,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (86)

  • +18
    Круто
    • +2
      Спасибо!
  • +3
    Результат очень впечатляющий
  • +2
    Отличная статья, отличная программа, не задумывались над продажей буржуйским друзьям?
    • +64
      SmartDeblur изначально задумывался как Open-Source проект.
      А так у буржуев уже сейчас есть платный Topaz InFocus.
      Кстати, в нем, по непонятной причине, максимальный радиус обработки ограничен 6-ю пикселами, что делает невозможным восстановления средних и сильных искажений.
      • +10
        И самое забавное, что за самый главный комментарий вас не «отплюсовали».
        Спасибо о задумках публикации вашего труда как Open-Source проект, это очень важно.
  • НЛО прилетело и опубликовало эту надпись здесь
    • +3
      Да, можно — причем с большой вероятностью успеха. Правда нужны будут дополнительные приседания в виде вырезания нужного фрагмента и предобработки краев, не без этого :)
      А также можно восстанавливать «скрытые» поля на скриншотах (такое частенько попадается в публикациях хабра), которые были смазаны или размыты
      • +30
        > А также можно восстанавливать «скрытые» поля на скриншотах (такое частенько попадается в публикациях хабра), которые были смазаны или размыты

        Бля…
        • 0
          Не все так просто на самом деле. Результат очень зависит от того, в каком формате сохранен скриншот (png, jpeg), какой програмой делался смаз. В некоторых случаях восстановить легко используя просто SmartDeblur, в других случаях требуется ручной подбор ядра искажения.
        • 0
          Ну я, например, перед выкладыванием «смазываю» до почти однотонности, там не разберёшь :) опять же, некоторые закрывают такие данные банальными черными прямоугольниками. Так что не всё так ужасно…
          • 0
            Покажите пример смазывания «до почти однотонности», посмотрим :)
      • 0
        Я же теперь замучаю вашу программу…
      • +7
        /me будет использовать только замазывание черным :(
        • +1
          Старый-добрый pixelate, он же — «квадраты» тоже не теряет актуальности, как и разного рода smear-кисти.
  • –2
    Напомнило статью habrahabr.ru/post/136853/
    Похожее изображение habrastorage.org/storage2/e2e/12d/6be/e2e12d6be301a6dd467f365a236e46d2.png
    image
    • +14
      Упс! Поспешил с выводами. Не заметил что это продолжение серии статей автора.
  • +3
    • +1
      Тоже напомнило, причем в стиле анекдота про американскую космическую ручку за миллион долларов и русский карандаш ;)
    • 0
      Кстати, судя по алгоритму (да и ссылка в статье на них есть), над Adobe'овским плагином работают те же люди, что и над «Robust Motion Deblurring».

      Так что, хоть в CS6 плагин и не появился, предварительные результаты можно «пощупать» в демо-версии.
  • +1
    Напомнило: www.youtube.com/watch?v=xPYe2x8QnFo. Интересно как они проводят «восстановление» изображения.
  • +1
    Ура, даёшь decensored!
  • 0
    Сборка под win нормально работает в wine, кстати.
    • +2
      По идее исходники должны еще под линуксом и макосью собираться (по крайней мере, прошлая версия собиралась), так что можно получить нативные бинарники.
      • +1
        У меня нормально собралось, да.
  • +2
    Хм. Возникла идея: а нельзя ли генерировать случайные параметры (например с помощью генетических алгоритмов), восстанавливать с ними изображение, содержащее текст, и потом пытаться распознать его?
    Чем качественнее будет результат распознавания, тем лучше были подобраны изначальные параметры.
    • 0
      чем качественнее результат распознавания — это очень субъективный критерий.
      • 0
        Предлагаю следующие:
        • Количество распознанных символов (не очень хороший критерий прямо таки).
        • Правильность распознанных символов в определенном случае. Например, в автомобильных номерах не могут быть любые символы, кроме цифр и букв, а в обычном тесте нет слова «плонета», зато есть «планета».


        Лучше всего их каким-то образом комбинировать, для чего потребуются субъективные или эмпирические коэффициенты.
    • +2
      Это уже есть и называется Blind Deconvolution (слепая деконволюция)
      Там точный вид ядра искажения неизвестен, и используется итеративный алгоритм в стиле:
      1. Взяли первоначальное приближение обработали, померили качество.
      2. Далее немного поменяли параметры ядра искажения
      3. Повторяем пункт 1-2 пока не достигнем необходимого уровня качества
      Понятие «качество» вычисляется на основе статистических характеристик (т.е. делается предположение, что исходное изображение описывается некоторыми статистическими параметрами, распределениями, ...) и это значение максимизируется
  • +22
    >>восстановить номера машин на кадрах с камер видеонаблюдения, когда весь номер занимает площадь несколько пикселей.
    >>Я этим не занимаюсь! SmartDeblur этого тоже делать не умеет.

    Для подобной работы можно попробовать использовать астрономический софт, которым достигается приемлемый уровень детализации облаков того же Юпитера при наблюдении с Земли на любительском оборудовании.
    Для этого снимается ролик на камеру, потом с помощью Registax складывается, обрабатывается и достигается многократное повышение детализации.

    Было


    Стало


    Обработано в регистаксе 600 кадров из 4000. Кроп, масштаб 50%. Точка сверху — Ганимед.

    Фото не моё, просто советую тем, кому может быть нужно.

    • +1
      Да, Registax и его аналоги как раз являются реализацией алгоритма Super Resolution в чистом виде.
      Основная проблема в том, что к задачам восстановления номером он напрямую тоже не подходит, т.к в астрономии мы имеем много снимков неподвижного объекта, а с камер наблюдения мы получаем несколько кадров одной и той же машины, но под разными ракурсами (разные геометрические искажения), а зачастую еще и с разных камер (с разными характеристиками).
      Можно попробовать привести все номера к одному размеру и одной форме и скормить Registax'у — может что и получится.
      • 0
        Ну, мало-ли, может быть преступники приехали на машине и, допустим, минуту машина стояла, пока к банкомату петли приваривали. Тогда можно попробовать.
        • 0
          Так тоже не получится. Нужны небольшие смещения на каждом кадре, а не просто несколько статичных кадров со стационарной камеры.
          • 0
            жаль.
            А Юпитер «штормит» будь-здоров-как в атмосфере. Видимо, это и является ключевым моментом.

            Ещё более жаль, что я в этой математике вообще ничего не понимаю, просто полный ноль.
            • 0
              Да, основное — это чтобы были небольшие смещения объекта. При съемке с рук, или как в астрономии когда из-за турбулентности изображение прыгает.
              • 0
                Логичным образом напрашивается прошивка моторизованных камер, чтобы камера всегда немного шевелилась, буквально на один градус круги описывала. Тогда можно будет применять такие алгоритмы до тех пор, пока техника не позволит без подобных ухищрений разглядывать сетчатку глаза человека в ста метрах от камеры.
                • 0
                  И даже с таким подходом мало что улучшится. Это будет работать только днем для неподвижных обьектов. Если обьекты движутся, ничего не получится. А вечером и ночью такие флуктуации будут вызывать смаз. В итоге будет обратный результат.
                  • 0
                    Что же делать!? :)
                    Грелку ставить перед камерой, чтобы воздух шевелился?
                    • 0
                      Что делать? Ставить нормальную камеру высокого разрешения ))
  • +2
    Спасибо.
    Только вот в GUI не нужно жёстко задавать цвета. Ибо может получиться такое: (Так программа выглядит у меня)
    • +1
      Жесть :)
    • 0
      Но в любом случае я не делал резиновый layout и не использовал системные цвета — т.к. имитировался риббон.
      Поэтому при изменении размера шрифта или цветовой гаммы что-то может поплыть
      • 0
        Так и вышло. :)
      • 0
        Выпилив из *.ui файлов все <property name="styleSheet"> получилось такое:

        • 0
          А в обычном режиме как теперь все выглядит?
          • 0
            Вы про цвета? Вот так:
            • 0
              Терпимо, но как-то совсем неопрятно без стилей смотрится
  • –3
    Думаю, вам надо патентовать программу.
    • +2
      В России алгоритмы не патентуются, можно лишь получить «Свидетельство о регистрации программы для ЭВМ» — от него пользы мало
      Да и что там патентовать — старый добрый Винеровский фильтр и другие классические алгоритмы? )
      • 0
        «Свидетельство о государственной регистрации программы для ЭВМ» имеет смысл делать студентам и аспирантам, при защите дипломных и диссертаций хорошо помогает.
    • +1
      Автор же делает Open-Source, это хобби и изначально некоммерческое. Зачем сразу патентовать, даже если есть что?

      Зато вам теперь, если понадобится что-то подобное реализовать, достаточно взять код
      • 0
        Фигасе мне минусов понаставили.
        Любой труд должен оплачиваться.
        • 0
          Open source двигают в основном не бедные люди. Подобно тому, как в 19 веке физикой занимались исключительно богатые меценаты.

          Я уверен, что у автора есть стабильный доход и он это делает для души. Когда ЗП или доход удовлетворяют, основная мотивация переходит в то, чем ты занимаешься, а не сколько тебе за это платят.
          • +1
            В россии встречал только людей работающих на энтузиазме.
            И буржуев которые выдают разработки за своё и в дальнейшем получавшим за это огромные деньги.
  • –3
    Я вот все хочу узнать url календаря SQL :) Поможете?
    www.youtube.com/embed/gxbGyGpPY3U

    Скрины:

     

     
    • 0
      Это все на ту же тему, что и автомобильные номера с камер видеонаблюдения.
      Здесь имеем изображение низкого разрешения с кучей jpeg-артефактов.
      Попробуйте, как советовалось выше, использовать registax.
  • 0
    Мне недавно потребовалось тоже восстановить размытое изображение — пользовался функцией ImageDeconvolve из Mathematica.
  • 0
    Среди примеров не хватает обычного смаза надписи. Условно говоря, задираем диафрагму, делаем выдержку в 1с и снимаем с рук любую вывеску.

    ЗЫ А ещё есть такая мерзость, как долгая шевелёнка. Это когда не просто смаз в одном направлении, а трясущиеся по нескольким направлениям за время съёмки руки.
  • +2
    Со смазом ситуация такая — чем ближе траектория смаза к прямой линии, тем лучше будут результаты.
    Это все касается стандартного функционала SmartDeblur, если же использовать кастомную PSF, то можно восстанавливать любой смаз — главное чтобы он был однородным по всему изображению, т.е. именно смаз от дрожания камеры, а не от того, кто то быстро движется.
  • +1
    Что-то похожее уже было сделано в 2003 году: refocus.sourceforge.net
    • 0
      Refocus уже давно не поддерживается. Да и весьма неудобен в работе.
  • +2
    Поразительно.
    Никогда бы не подумал, что из подобного исходного материала можно восстановить в таком качестве.
  • +1
    Вот уж не думал что такое возможно. Круто.
  • 0
    Вы всё ещё смеётесь над старыми фильмами, в которых картинку с уличной камеры увеличивали в 50 раз и видели каплю крови на лацкане пиджака убийцы?
    • +6
      Да :)
  • +5
    Вот бы еще кто-нибудь написал на основе этого плагин к GIMP…
    • 0
      И к фотошопу заодно
    • +1
      На то он и Open Source, что может и найдётся спец…
      • +1
        Вообщем-то да, исходники открыты, код весьма простой и компактный, язык C++. Так что желающие могут весьма быстро портировать под плагины. Я сам заниматься этим не планировал — пока есть куда тратить время :)
        Изначально задумка была по-быстрому набросать прототип работающей деконволюции и выложить все это в опен соурс, раз уж хорошо разобрался с темой обработки изображений. Получилось немного больше чем хотел.
        • 0
          За это и уважаю :)
  • 0
    Вааще не думал, что это возможно 8-0…
  • +3
    Классно, будем знать, что теперь некоторые кадры вовсе не так безнадежны, как кажется, и их можно «вытянуть».

    P.S. Просматривая комменты, ожидал увидеть здесь пару-тройку портянок с комиксами-пародиями на CSI. Странно, не нашел. Поголовье боянистов сокращается? ))
    • 0
      В двух других статьях зато запостили )
  • +2
    Автору огромное спасибо, и отдельно — за Open source!

    Это ведь так когда-нибудь появятся программы, и видео восстанавливающие после тряски.
    Всегда догадывался, что математика — царица наук. :)
    • +2
      И вдвойне приятно, что проект делается в России.
  • +1
    Эх, так руки чесались добавить картинку про CSI, оказалось, в одном из предыдущих постов уже добавили.
    • 0
      Автору очень большой респект.
  • 0
    gpl это хорошо, но почему бы не сделать еще коммерческую лицензию?
    • +1
      Цель была в том, чтобы исходники были доступны всем для изучения, но при этом не создавались бы закрытые коммерческие продукты на базе смартдеблюра. Под GPL все производные продукты также должны быть опенсоурсными.
      • 0
        никто не мешает продолжать делать open source для некоммерческого использования, обучения, и прочее. Просто оговорить что для коммерческого использования лицензия lgpl и стоит столько-то. Для многих проектов есть возможность gpl бесппатно, либо другие лицензии платно. Если честно, я не понимаю зачем себя ограничивать :)
        • 0
          Ну тут никто не мешает обратиться по почте и договориться о лицензии.
          Я думал вы имели ввиду почему сразу не LGPL.
  • 0
    Автор! У Вас талант! Спасибо за софт. Есть реализация деконволюции в виде плагинов для ImageJ, но SmartDeblur получился значительно удобнее.
    • 0
      Спасибо!
  • +2
    все те, кто занимается оптическим распознаванием и сталкивается с необходимостью извлекать текст с переблюренных изображений, могут стать намного счастливее благодаря вам. =)
    спасибо!
    • 0
      Наздоровье )
      Буду очень признателен за удачные (да и неудачные) примеры таких заблюренных изображений и результатов обработки
  • 0
    Спасибо! Надо попробовать.
    Впечатляет!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.