Пользователь
0,0
рейтинг
6 апреля 2013 в 21:56

Разработка → Blind Deconvolution — автоматическое восстановление смазанных изображений

Смазанные изображения — один из самых неприятных дефектов в фотографии, наравне с расфокусированными изображениями. Ранее я писал про алгоритмы деконволюции для восстановления смазанных и расфокусированных изображений. Эти, относительно простые, подходы позволяют восстановить исходное изображение, если известна точная траектория смаза (или форма пятна размытия).
В большинстве случаев траектория смаза предполагается прямой линией, параметры которой должен задавать сам пользователь — для этого требуется достаточно кропотливая работа по подбору ядра, кроме того, в реальных фотографиях траектория смаза далека от линии и представляет собой замысловатую кривую переменной плотности/яркости, форму которой крайне сложно подобрать вручную.


В последние несколько лет интенсивно развивается новое направлении в теории восстановления изображений — слепая обратная свертка (Blind Deconvolution). Появилось достаточно много работ по этой теме, и начинается активное коммерческое использование результатов.
Многие из вас помнят конференцию Adobe MAX 2011, на которой они как раз показали работу одного из алгоритмов Blind Deconvolution: Исправление смазанных фотографий в новой версии Photoshop
В этой статье я хочу подробнее рассказать — как же работает эта удивительная технология, а также показать практическую реализацию SmartDeblur, который теперь тоже имеет в своем распоряжении этот алгоритм.
Внимание, под катом много картинок!


Начало

Этот пост является продолжением серии моих постов «Восстановление расфокусированных и смазанных изображений»:
Часть 1. Теория — Восстановление расфокусированных и смазанных изображений
Часть 2. Практика — Восстановление расфокусированных и смазанных изображений
Часть 3. Повышаем качество — Восстановление расфокусированных и смазанных изображений
Рекомендуется прочитать хотя бы первую теоретическую часть, чтобы лучше понимать, что такое свертка, деконволюция, преобразование Фурье и прочие термины. Хоть я и обещал, что третья часть будет последней, но не смог удержаться и не рассказать про последние веяния в области восстановления изображений.
Я буду рассматривать Blind Decovolution на примере работы американского профессора Rob Fergus «Removing Camera Shake from a Single Photograph». Оригинал статьи можно найти на его страничке: http://cs.nyu.edu/~fergus/pmwiki/pmwiki.php
Это не самая новая работа, в последнее время появилось много других публикаций, которые демонстрируют лучшие результаты — но там используется совсем сложная математика ((для неподготовленного читателя) в ряде этапов, а основной принцип остается тем же. К тому же, работа Фергуса является своего рода «классикой», он одним из первых предложил принципиально новый подход, который позволил автоматически определять ядро смаза даже для очень сложных случаев.

Модель искажения

И так, приступим.
Возьмем фотоаппарат и сделаем смазанный снимок — благо для этого не требуется особенных усилий :)


Введем следующие обозначения:
B — наблюдаемое смазанное изображение
K — ядро размытия (траектория смаза), kernel
L — исходное неразмытое изображение (скрытое)
N — аддитивный шум

Тогда процесс смаза/искажения можно описать в виде следующего выражения

B = K*L+N

Где символ "*" это операция свертки, не путать с обычным умножением!
Что такое свертка, можно прочитать в первой части
В наглядном виде это можно представить следующим образом (опустив для простоты шумовую составляющую):


Так что же является наиболее сложным?
Представим себе простую аналогию — число 11 состоит из двух множителей. Каковы они?
Вариантов решения бесконечно:
11 = 1 x 11
11 = 2 x 5.5
11 = 3 x 3.667
и т.д.
Или, переходя к наглядному представлению:


Целевая функция

Чтобы получить конкретное решение нужно вводить ограничения, как-то описывать модель того, к чему мы стремимся.
Т.е. нужно больше информации. Одним из вариантов этого является задание целевой функции — это такая функция, значение которое тем выше (в простом случае), чем ближе получаемый результат к желаемому.
Исследования показали, что несмотря на то, что реальные изображения имеют большой разброс значений отдельных пикселей, градиенты этих значений имеют вид распределения с медленно убывающими границами (Heavy-tailed distribution). Такое распределение имеет пик в окрестности нуля и, в отличие от гауссового распределения, имеет значительно большие вероятности больших значений (вот такое масло масляное).
Это совпадает с интуитивным представлением, что на реальных изображениях в большинстве случаев присутствуют большие области более-менее постоянной яркости, которые заканчиваются объектами с резкими и средними перепадами яркости.

Вот пример гистограммы градиентов для резкого изображения:


И для размытого изображения:


Таким образом мы получили инструмент, которые позволяет нам измерить «качество» получаемого результата с точки зрения четкости и похожести на реальное изображение.

Теперь мы можем сформулировать основные пункты для построение завершенной модели:
1. Ограничения накладываемые моделью искажения B = K*L+N
2. Целевая функция для результата реконструкции — насколько похожа гистограмма градиентов на теоретическое распределение с медленно убывающими границами. Обозначим ее как p(LP)
3. Целевая функция для ядра искажения — положительные значения и низкая доля белых пикселей (т.к. траектория смаза обычно представлена тонкой линией). Обозначим ее как p(K)

Объединим все это в общую целевую функцию следующим образом:


Где q(LP), q(K) распределения, получаемые подходом Variational Bayesian

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

Пирамидальный подход

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

Продемонстрируем итеративное построение ядра на примере.
Исходное изображение:


Процесс уточнения ядра:

Первая и третья строки показывают оценку ядра на каждом уровне пирамиды изображений.
Вторая и четвертая строки — оценка неискаженного изображения.

Результат:


Блок-схема алгоритма

Осталось собрать все вместе и описать алгоритм целиком:



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

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

Наверное, самое интересное — это поиграться с алгоритмом Blind Deconvolution вживую на реальных изображениях!
Мы реализовали похожий вариант и добавили как новую функцию в SmartDeblur 2.0 — все по-прежнему бесплатно :)
Адрес проекта: smartdeblur.net
(Исходники и бинарники от предыдущей версии можно найти на GitHub: github.com/Y-Vladimir/SmartDeblur )

Пример работы:


Другой пример:


И в заключение, результат работы на изображении c конференции Adobe MAX 2011:


Как видно, результат практически идеален — почти как у Adobe в их демонстрации.

Технические детали

Пока что максимальный размер обрабатываемого изображение установлен как 1200*1200. Это связано с тем, что алгоритмы потребляют очень много памяти. Даже на изображении 1000 пикселей — больше гигабайта. Поэтому введено ограничение на размер.
Позже увеличим его, после того как оптимизируем деконволюцию и пирамидальное построение.
Интерфейс выглядит следующим образом:



Для работы с программой требуется лишь загрузить изображение и нажать «Analyze Blur» и согласиться с выбором всего изображения — анализ может занят несколько минут. Если результат не устраивает, можно выбрать другой регион (выделить мышкой на изображении двигая ее вправо-вниз, немного не очевидно, но пока так :) ). Правой кнопкой выделение убирается.
Галочка «Agressive Detection» изменяет параметры, чтобы выделять только самые важные элементы ядра.

Пока что хорошие результаты достигаются далеко не на всех изображениях — поэтому будем очень рады фидбеку, это поможет нам улучшить алгоритмы!

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

Подробнее
Реклама

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

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

  • +4
    > SmartDeblur 2.0 — все по-прежнему бесплатно :)
    > Исходники и бинарники от предыдущей версии

    Я так понимаю, что проект теперь с закрытым кодом? Жаль…
    • +30
      Да, пока что исходники закрыты, чтобы избежать случаев злоупотребления ими (с предыдущей версией было много ребилдов с изменением авторства, несмотря на лицензию GPL, попытки продавать и пр). Думаю, чуть позже их откроем.
      • –19
        GPL это разрешае
        • +43
          Но не изменять авторство.
      • +2
        Лучшее средство от плагиата — широкая известность и доступность. Возможно — в форме плагина для gimp или какого-либо популярного средства работы с изображениями (аналогично тому как RIOT доступен в виде модуля IrfanView).
        • +3
          Так и получается одни делают дело, а другие на этом пиарятся. Увы не все так просто :(
          • 0
            Любой, кто хоть раз воспользовался Save for Web на базе RIOT (хоть в gimp, хоть в irfanview) может не быть в курсе, что это сторонний модуль, только если он слепой. Так что принципиальной проблемы тут не вижу.
  • +11
    Было бы очень кстати, если бы это было плагигом для Gimp.
    • +14
      Плагин для гимпа и фотошопа тоже планируется — когда точно, сложно сказать.
      • +1
        А что с адобовской версией дешейкера? После того как они показали на Max 2011 результат его работы, ничего больше о нем не слышно.
        • +1
          Сложно сказать — их демки были на изображениях с искусственным искажением, чтобы продемонстрировать wow-эффект.
          Может быть допиливают, может отложили пока.
      • 0
        Если 8BF, то rfanview скорее всего тоже подцепить сможет.
        Автору огромное спасибо, будем ждать.
  • 0
    А какой у вас будет результат на изображение от Adobe?
    • +4
      Один из примеров есть в статье, после фразы «И в заключение, результат работы на изображении c конференции Adobe MAX 2011» — получилось вполне неплохо.
      А другие примеры вы можете попробовать сами.
      • +6
        Прошу извинений. Не понял сразу. Думал, что это и есть итог самого Adobe.
  • +1
    А нет ли алгоритма, чтобы восстанавливать исходное по серии смазанных? Это может быть удобно, когда темно, снимаешь с рук, будет смаз, но можешь снять серию
    • +2
      Как вариант — можно снять серию с короткой выдержкой и повышенным ISO и потом совместить несколько несмазанных, но шумных изображений. Например с помощью RegiStax
    • +1
      Да это было бы неплохо. У меня в камере sony nex5 есть такая функция как съемка быстрой серии кадров (6-7 штук) и потом на основе первого и наложения сверху остальных программно устраняются шумы и смаз. Результат выходит просто фантастический (для тех кто знает какой снимок получится на таких iso с такой выдержкой с рук почти без освещения).
      Люди правда пугаются когда фотоаппарат затвором щелкает как автомат
      • 0
        я сейчас тоже купил nex-6 и там это есть, но, кажется, за дополнительные деньги.

        но хотелось бы такой софт иметь отдельно, а не в камере
        • 0
          За дополнительные деньги? Вряд ли. Это должно находиться в меню выбора режима съемки (наравне с авто, p, a, m, и т.д.) и называться что-то типа режим анти-размытия или устранения смаза и т.д.
          Единственно минус — в этом случаем снимается только jpeg фото, но зато полного размера. В некоторых ситуациях — когда объектив без оптической стабилизации, помещение темное, вспышка не применима — это просто спасает.
          • 0
            Множество было случаев, когда на город спускается вечер — камеры начинают мазать, друзья убирают компактные мыльницы уже часов в 6 вечера, те у кого аппараты посерьезней, типа любительских зеркалок — могут дотянуть до 7-8 часов, а я просто перевожу режим на анти-смаз и спокойно снимаю до 3 часов ночи, при освещении типа одной 60Вт лампочки или уличного фанаря, на выходе получаю 30-40% вполне вменяемых кадров и на следующий день удивляю результатом ) Желательно конечно еще объектив иметь светлый — дырку придется открывать почти на полную.
          • 0
            Наткнулся на обзор nex-6 — действительно, этот функционал вынесли в магазин приложений (магазин приложения для камеры!!) и он теперь стоит 200 рублей >_<
            Но это очень крутая функция, рекомендую.
            Магазин приложения для камеры!!! (все еще не отошел от шока)
            • 0
              А можете показать результаты такой обработки серии кадров?
  • 0
    А можно увидеть результаты обратных преобразований из четких снимков размытые, и зная ядро снова получить исходные, будут ли снимки одинаковыми (в %)?
    • 0
      Если не добавлять шума и не терять точности — то результат будет практически идентичен исходному изображению.
      • 0
        А ведь смазанные изображения в разы лучше сжимаются JPEG, JPEG2000, нет ли потенциала в этом направлении?
        Может быть потерь будет заметно меньше, чем выигрыша в объеме?
  • +1
    результат на последней паре фото просто впечатляет
    • 0
      Это может быть искусственное искажение — на них всегда отличный результат.
      Но самое первое изображение точно реальное (натюрморт) — фоткал я сам. С птицой в лесу тоже реальное.
      А в целом не на всех изображениях удается получить хороший результат, поэтому будем очень признательны за любой фидбек с примерами.
      • 0
        Сложность сильно зависит от угла объектива. Широкоугольные фото восстановить сложнее — ядро сильно видоизменяется от края до края кадра. Фотографии на длинном фокусе (пример от Adobe как раз такой) намного проще.
  • –15
    11 = 3 x 3.667

    Это в какой вселенной??? Пишите уж тогда «3.(6)»
    • +7
      Это в любых операциях с плавающей точкой, там почти всегда идет округление :)
    • –16
      А какие это двоишники тут минусуют? Речь не просто о результатах каких то выкладок. Речь именно о двух множителях! Хабр, мля! )))
    • –9
      Интересно и не один не смог обосновать свою позицию! Только бы насрать втихаря. Айтишники и так-то не особо интегрированы в социум. А тут вообще законченных социапатов выращивают.
      Зато грамматике сколько внимания уделяют!
      • +4
        Думаю, тут все просто.
        Пример со множителями рассматривался в контексте приближенных вычислений, а в них процессор не оперирует дробями, только float представлением числа.
        Поэтому с точки зрения компьютера выражение «11 = 3 x 3.667» недалеко от истины. Ну разве что шестерок поболее будет и в конце появятся «шумовые» цифры, вызванный особенностями нормализованного представления чисел с плавающей запятой — но для объяснения принципа это не так важно.
        • –12
          C точки зрения компьютераи задача о квадратуре круга решаема с любой заданной точностью. Но это плевок в сторону математики. И как я понял, на Хабре к математике такое отношение в порядке вещей. Зато не дай бог выкинуть мягкий знак из инфинитива. Издержки российского образования?
          А программа Ваша паршиво работает. Ну то есть может на синтетических примерах (типа Адобовского Motion Blur) она и выдаёт что-то удобоваримое. Но на реальных кадрах… И не очень понятен механизм «удаления смаза». Зачем такой локальный гипер-контраст? Он никак не скомпенсирует смаз.
          И проще, имхо, не перебором вычислять трассу, а предоставить это пользователю. Пусть выделит точечный источник света, который как раз и примет форму трассы. Или какой-то характерный краевой объект. Доверять всё автомату — бессмысленно.
          • +2
            И проще, имхо, не перебором вычислять трассу, а предоставить это пользователю. Пусть выделит точечный источник света, который как раз и примет форму трассы. Или какой-то характерный краевой объект. Доверять всё автомату — бессмысленно.

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

            image
            Получив при этом такую траекторию?


            Также не совсем понял про «локальный гиперконтраст» — где он?
            И на каких кадрах вы пробовали и получили плохой результат — можете ими поделиться?
            • –2
              Я слабо себе представляю как можно получить такую трассу! Выдержка на минуту и алкоголик с абсинентным синдром в роли фотографа?

              На первых двух вообще мимо кассы, хотя там явный смаз. На последней более-менее удобоваримое что-то получилось. Но для примера сделал третий вариант, это тупо Smart Sharp на максимум с радиусом в 2 пикс. То есть направление работы алгоритма вполне явно. Да, и ещё — Вы про «локальный гиперконтраст» спрашивали. Так вот выкрученный шарп (нерезкое маскирование) им и является. Разве не видно тучи ореолов и каймы на деталях изображения?



              • +1
                Кстати, со второй картинкой у меня получилось так:

      • 0
        Да, кстати, прошу прощения, что попытался всех под одну гребёнку собрать. Не обратил внимания, что было и достаточно плюсов. Так что не всем тут плевать на математику в контексте «чисел с плавающей запятой».
      • +2
        Интересно и не один не смог обосновать свою позицию!

        www.codinghorror.com/blog/2009/05/why-do-computers-suck-at-math.html
        • –3
          Дык давайте тогда будем считать пи = 4. Ну ладно 3 (компьютеры ведь обычно округляют как антье). И на любые упреки — «а вот так работают математические сопроцессоры».
          А ещё компьютеры не умеют генерировать действительно случайных чисел. И поэтому теорию вероятностей -> «фф топку»!
          При искусство вообще молчу…
          Дурдом какой-то…
  • +2
    Учитывается ли, что при съёмке камера может не только сдвинуться, но и повернуться вокруг оси, и в разных частях снимка ядро будет разным?
    • 0
      Нет, предполагается, что траектория смаза одинакова по всему изображению. Если это не так — то можно попробовать обрабатывать частями
      • +4
        Ну вот поэтому у вас и получаются хорошие результаты только на искусственно смазанных изображениях.
        Реальные камеры болтаются в 6 степенях свободы, и учитывать нужно как минимум 5 (если речь не о макро). У вас же в ядре всего две координаты.
        Просто оставлю здесь эту картинку:

        PS. Ну всё равно круто, чё.
        • +4
          Не совсем так — доминирующие причины смаза вызваны только тремя степенями свободы, это вращение вокруг трех осей. Другие три степени свободы, а именно смещение вдоль осей практически не вызывают смаз. Это нужно на полметра сместить фотик во время экспозиции, чтобы эффект проявился.
          Поэтому остается поворот вокруг трех осей, где достаточно смещение на доли градуса чтобы появился заметный смаз. Из них повороты по двум осям (две правые фиолетовые стрелки) производят смаз, который успешно компенсируется.
          И только смаз вызванный вращением вдоль оптической оси (левая фиолетовая стрелка) не может быть проанализирован текущим алгоритмом.
          Так что не все так плохо
          • 0
            Ну тогда Вам до кучи по поводу «синтезированных примеров». Алгоритм будет работать только на снимках с одним доминирующим планом. Поскольку «смаз» по разному проявится на ПП и ЗП. Т.е. для заднего плана величина смаза (при той же трассе) будет гораздо больше. В общем получается достаточно узкоспециальное применение.
            • 0
              Как раз в случае смазов вращения передний и задний план будут смазаны одинаково, с точки зрения линейных размеров их проекции.

              Так-то да, 1 градус поворота смажет передний план на 0.1 м, а задний на 1 м, но проекция будет смазана в обоих случаях на одинаковую величину.

              p.s. А вот в случае смаза из-за «стрейфов» — да, там будут уже разные смазы проекций переднего и заднего плана.
            • 0
              Если смаз вызван движением фотоаппарата, то все изображение смазано примерно одинаково. Если же причина смаза движение отдельных объектов, то да — будут сложности. Впрочем, можно обрабатывать такие кадры частями.
  • 0
    Алгоритм поможет «вылечить» смаз создаваемый вращением сенсора относительно оси съёмки (в этом случае области близкие к оси вращения будут слабо смазаны, в отличие от переферии)?
    Упс. Уже спросили.
    • +2
      Попробовал на фотографии с не большим нерановмерным смазом. При небольших kernel size да, «четче» становится, плюс артефакты лезут. Чем больше kernel size, тем становится хуже и фотография превращается в такое:

      Тьфу, не туда комментарий отправил.
      • +2
        А можете прислать оригинал? Похоже на багу в финальной деконволюции.
      • 0
        Спасибо, проблема, похоже, действительно в оригинале, а точнее в RAW-конвертере, которым делался оригинал.
      • 0
        Очень крутой эффект!
  • +6
    небольшое пожелание. сделайте, пожалуйста, в вашеё чудесной программе галочку: «я понимаю что делаю, снять ограничение», которая будет снимать ограничение по размеру изображения. пусть программа съест несколько гигабайт памяти, не страшно. зато обработает большую картинку :)
    • +3
      Дело не в этом — галочку добавить просто. По факту Windows устанавливает лимит памяти на процесс примерно 1.4-1.5 гигабайта для 32-битных приложений. Для размера 1200 пикселей текущее потребление примерно 1-1.2 гигабайта. Чуть больше уже вызывает crash, хотя у меня ОС 64 битная и физической памяти 12 гиг.
      Нужно либо создавать отдельную версию и компилировать под 64 бита, либо же значительно оптимизировать потребление памяти — что-то из этого будет позже сделано.
      • 0
        Если в приложении нет завязки на 32битные int для всяких адресных дел и подобного, то можно воспользоваться флагом LARGEADDRESSAWARE, который скажет ОС выделять больше памяти. И ссылка на обсуждение использования данного флага blog.lexa.ru/2013/02/21/q_3gb_switch.html
        • 0
          Пробежался по ссылке, как я понял, при использовании /LARGEADDRESSAWARE увеличился лимит всего лишь с 1.1 до 1.2 гигабайта.
          Но попробую так — спасибо.
          • 0
            Там похоже наблюдалась фрагментация, так как далее в комментариях обсуждаются варианты, как посмотреть, как реально используется виртуальная память. У автора требуются очень большие аллокации (до 600+Мб), а их в фрагментированном даже 4гб адресном пространстве можно не найти.
          • 0
            Как уже было отмечено, виртуальное адресное пространство фрагментировано.
            Нужно использовать несколько аллокаций.
            Первый раз получить, скажем, 1GB, а дальше уже кусками не больше 500МБ. Если блок не выделяется, разбить пополам и т.д.
            • 0
              Сложновато получается, и выигрыш минимален.
              • 0
                А насколько реализуем вариант — скормить часть картинки для вычисления ядра(или сделать для этого авто-кроп от целого изображения), а потом использовать уже не только оперативную память, а еще и файл дампа для просчета большого изображения?
                ПО, которое собирает панорамы да и фотошоп используют дампы на жестком диске и спокойоно переваривают, пусть не быстро, зато без ограничений.
          • 0
            Нет, в режиме /3GB — доступен ~гигабайт с копейками в нижней половине 4Gb (остальное — DLL-ки всякие).
            И еще доступны 2Gb если 32-бинарник (помеченный этим флагом) запущен в 64-битной ОС и, соответственно, 1GB если он запущен в 32-битной ОС, которую загрузили в режиме /3GB.

            Т.е. в хорошем случае (вас запускают в 64-битной оси) — будет втрое больше, чем без этого флага.
            • 0
              Ага — спасибо за информацию!
  • 0
    Некоторые снимки очень похожи на заблуренные пост-фактум.
    • +2
      Все снимки, кроме может быть адобовского, реальные смазанные.
  • +1
    (заглядывая в ближайшее будущее) не удаляйте неудачные фотки со своих фотоаппаратов! скоро всех их можно будет легко исправить
    • +1
      Скорее бы уже этот алгоритм добавили в фотоаппараты, чтобы они сами убирали смазы на длинных выдержках.
      Съемка с рук в любых условиях даже на бюджетной оптике, о чем еще можно мечтать?
      • +2
        Давно есть в hardware-реализациях.
        • 0
          Так это же немного разное? Софтверную стабилизацию уже можно применять когда hardware не справилось.

          Какая камера сможет снимать без смаза с рук на выдержке больше 1/10 сек? Обычно такие кадры уходят в помойку, но с реализацией как в топике эти кадры можно восстановить.

          Самый классный хардварный стабилизатор — штатив, ну или стедикам.
          • 0
            Любая. С широкоугольным объективом.
      • +8
        В фотоаппараты лучше добавлять датчики движения камеры во время экспозиции и получать траекторию смаза напрямую, тогда не нужно будет применять хитрые техники для оценки ядра искажения.
        • 0
          какие-нибудь инерционные, гироскопические?
          • +1
            Ага. На самом деле такие датчики уже есть в камере — именно за счет них осуществляется работа оптического стабилизатора.
        • 0
          Я тоже сначала подумал, что можно использовать датчики для этого, но на тех же телефонах акселерометры/гироскопы всегда имеют какую-то погрешность.

          Интересно другое, почему ведущие производители фото-техники еще не применили алгоритм Blind Deconvolution? Наверно и с гироскопами тоже были испытания. Может результат работы алгоритма не подошел для массового использования в фотоаппаратах?

          PS Попробовать бы использовать гироскоп телефона для оценки ядра искажений.
          • 0
            Все производители фототехники уже давно это компенсируют аппаратно. Через стабилизаторы в камере или объективы.
            • 0
              А откуда тогда эти фотки со смазами? В фотошопе нарисовали? Проблема надумана?

              Про широкоугольный объектив отличное предложение, вы бы еще предложили не снимать в темных помещения или пользоваться вспышкой.
              • 0
                Это был ответ на вот эту Вашу фразу:
                Интересно другое, почему ведущие производители фото-техники еще не применили алгоритм Blind Deconvolution? Наверно и с гироскопами тоже были испытания.

                Фотки со смазами? Часть в фотошопе рисуют для презентаций. Да и стабилизаторы помогают максимум на 2 ступени.

                Вы спросили:
                Какая камера сможет снимать без смаза с рук на выдержке больше 1/10 сек

                А я ответил — любая с широкоугольным объективом (при прочих равных). Вспышка не поможет при достаточно ярком заднем плане. Да и светлое пространство не панацея, когда например, нужна большая ГРИП.
          • 0
            Интересно другое, почему ведущие производители фото-техники еще не применили алгоритм Blind Deconvolution?

            Много чего еще не применили в фотоаппаратах. Например съемка серией с последующим объединением для уменьшения шумов, улучшения разрешения и экспозиции только-только начали внедрять. Хотя идея давно витает в воздухе.
    • +1
      Уже лет 10 не удаляю ни одного оригинала. Правда, идея была несколько другой — что у фотографий есть не только художественное, но и информационное значение.
  • +3
    Версию под Mac OS X очень хочется.
  • 0
    it's a miracle
  • +1
    Может вы введение какие-нибудь ключи запуска, снимающие ограничение на размер файла? Гигабайты памяти – не страшны.
  • 0
    Распараллеливание планируется?
    • 0
      Да, планируется.
      Сейчас основная загвоздка в скорости — преобразование Фурье. На среднем изображении оно вызывается несколько тысяч раз. В текущей версии используется OpenCV, которые не позволяет делать FFT в несколько потоков.
      Распараллеливание на уровне кода «в лоб» приведет к разы большему потреблению памяти.
      Это все решаемо, но требует время.
      • 0
        Попробуйте fftw3: я вообще не понимаю, зачем вам в этой задаче opencv, если все алгоритмы — свои.

        А еще для небольших изображений (или кусков изображений) можно GPU использовать: скажем, выдрать кусочек изображения 1000х1000, подобрать для него ядро, потом выдрать другой кусочек — подобрать ядро для него. По идее, так можно будет и смазы из-за вращения определять и ликвидировать.
        • 0
          FFTW я как раз использовал в предыдущей версии SmartDeblur, который доступен вместе с исходниками.
          На OpenCV (от него используется только преобразование Фурье) пришлось перейти из-за закрытия исходников.
          • 0
            Упс. Не учел, что новые исходники у Вас закрытые.
            Но для CUDA и MKL это не помеха, правда MKL денег стоит.
          • 0
            Черт, у вас исходники закрыты!
            Печально. Я надеялся, что смогу вашу утилиту собрать, поковыряться…
            • 0
              Как вариант — могу предложить у Фергуса скачать матлабовские исходники и поиграться с ними.
              В SmartDeblur другие алгоритмы, но для экспериментов сорцы Фергуса будут в самый раз, т.к. они достаточно простые для понимания и изучения.
      • 0
        А если при наличии GPU это преобразование фурье на него выгружать? Nvidia говорит, что быстрее получится, да и в CUDA соответствующая библиотека есть, так что писать свой код для GPU не придется.

        Ну и да, +1 к использованию fftw3 раз лицензия позволяет его использование. Кроме того его API позволяет перейти и на Intel MKL простой подстановкой, что может еще поднять производительность, если есть возможность использовать MKL.
  • 0
    Не так давно надо было решить практическую задачу — фото документов улучшить (уникальные документы, были плохо сфотографированы), вертел-крутил эти фото при помощи вашей программы, но, увы, не смог улучшить. Попробую вторую версию, напишу о результатах!
    • 0
      В общем, то, что можно было разглядеть, стало чётче, что разглядеть было нельзя, так и нельзя, а жаль, чудес не бывает всё-таки :)
      • 0
        Можете прислать мне — попробую
        • 0
          Вот, например: photo.qip.ru/users/dombaisaglara/4170662/101734384/#mainImageLink

          Там много брака, можете потренироваться :) Причём, это не искусственные фото, у человека вот так только получилось снять, спешил.
          • 0
            Спасибо! Буду пробовать.
            Что получится, выложу результаты
  • 0
    Надеюсь ООО «Бунге СНГ» занесло как следует? ;)

    А если по делу, то возможно ли такое же с видео? Судя по видео на YouTube с включённой борьбой с «шевелёнкой» у них получаются видео от которых можно получить морскую болезнь. Или есть специализированные средства и ваши методы для видео не подойдут?
    • 0
      Не сразу понял про «Бунге СНГ» — что дома было, то и сфоткал )
      Насчет видео — думаю, применить можно. Выдернуть все кадры, по одному обработать и склеить обратно в видео.
      Но не пробовал
  • 0
    Улучшится ли качество, если для каждого цветового канала подбирать ядро независимо?
    • 0
      Качество улучшится если вместо преобразования в чб учитывать все три канала вместе.
      Но не думаю, что это даст существенного улучшения качества
  • 0
    Скажите, а экспорт в 16 битовый цвет можно добавить?
    • 0
      А в чем смысл этого? Входное изображение все равно 8-битное.
      • 0
        Так тем более

        Внутренняя обработка если я верно понимаю идёт во float, в линейном пространстве?

        А экспорт импорт — через сраные 8 бит
        • 0
          Перед обработкой делается гамма-коррекция, далее все в double.
          • 0
            Так повторюсь — тем более

            Вы при обработке воюете за каждый бит, а при загрузке огрубляете изображение до неприличного. Современные камеры дают 13 стопов сигнал шум, в идеале может 14 стопов.

            По хорошему, нужно попробовать импорт прямо линейных данных с raw файла, например с помощью dcraw или libraw, и посмотреть даст ли это эффект.
            • 0
              RAW особого эффекта не даст, мы пробовали на 16 битных TIFF. Основная загвоздка — несовершенство алгоритмов, т.к. далеко не все реальные фотографии получается восстановить.
              • 0
                Я всё равно не понимаю, зачем делать хуже если можно хорошо. Кстати, какая гамма идёт по стандарту, 2.2? А если у меня sRGB? А если AdobeRGB? А если часть файлов так а часть эдак?

                Ох, ну уговорить у меня вас не получилось, ну ладно, что я могу поделать. Делайте как делайте :-)
                • 0
                  Скажем так — поддержка RAW и 16-битного формата в перспективе нужна, это очевидно, но сейчас у нас есть более приоритетные задачи по улучшению качества и алгоритмов.
                  Пока мы еще не уперлись в то, что нам не хватает 8-битного пространства. Тем более что большинство фоток, 8-битные JPEG.
          • 0
            И да, программа хорошая, позволяет действительно немного поправить небольшие ошибки автофокуса.
    • 0
      Кстати, какие форматы сейчас поддерживают 16 бит? Эти 16 бит линейные, или с гамма-коррекцией? И есть ли для них бесплатные библиотеки записи и чтения?
      • +1
        16 бит в основном с гаммой, а 32 бит — уже линейные (но бывает, конечно, и хоккей на траве и балет на льду).

        Я не самый большой специалист по библиотекам, и вот гугл подсказывет есть libtiff.

        В конце-концов, если уж совсем лень, есть формат PBM, который примитивен, и конвертер в него или из него — это задача для студента первого курса. Если бы при импорте/экспорте можно было бы выбирать галочкой с гаммой это или линейные значения, то меня вполне устроила такая бы функциональность.
  • 0
    А что же с шумом? В вашей модели он пока не учитывается?
    • 0
      Учитывается.
      В статье описывается один из вариантов Blind Deconvolution с достаточно сильными упрощениями для того, чтобы подход был понятен широкому кругу читателей. Те, кто интересуется деталями — можно посмотреть оригинальную статью, а также последние наработки в этой области, хотя бы с конференции SIGGRAPH
  • 0
    Эх, а я мечтаю о консольном режиме.
    Так будет удобно пользоваться откуда угодно, при этом не открывая исходники. Ну и вообще это более профессионально :)
    • 0
      Применять фильтры, не глядя на исходник и результат — профессионально? О_О
      • 0
        Нет, консольный интерфейс это профессионально. А сравнивать все равно можно при желании, кроме того так можно использовать для пакетной обработки или практически из любых языков программирования.
  • +1
    а можно разрешить редактировать ядро вручную? Так для экспериментов, ну и чисто визуально кажется, что в ядре есть лишние случайные ветвления.
    • 0
      Об этом я думал еще для первого SmartDeblur, пока руки не дошли — включим в последующие релизы
  • 0
    Получаются весьма интересные результаты если в кадре есть движущийся объект (кот) и выбрать область с ним
    • 0
      Можете поделиться результатами?
      • +3
        с рыжими неконтрастными котами при плохом освещении ему справится тяжело. Но вообще результат ожидаемый: коты стали немного четче, а всё остальное oversharp с характерной полосатостью «вдоль» траектории движения котов. Трудно сделать: надо что бы части тела кота двигались с одинаковой скоростью, надо что бы освещение было нормальное, надо что бы кот занимал значительную часть снимка, что бы выделять только его, без окружающей обстановки и т.п.



        думаю интересный результат получится когда что-то большое будет двигаться в кадре, например машина.
        • 0
          Попробовал ради интереса, фото из серии неудачная проводка. Номер стал более читаемый.


          • 0
            Это всё тупо от перешарпа. Смаз тут никак не устраняется.
            • 0
              Пожалуй. Причем если выделять отдельные области, например тот же номер — результат становится ещё хуже.
            • 0
              Не совсем — шарпом такого добиться не получится. Траектория частично восстановилась и номер стал более читаемым.
              Изображение сложное по двум причинам:
              1. Очень неравномерный смаз. В центре его нету, а по краям достигает максимума
              2. Траектория смаза около 80 пикселей. Текущие ограничения не позволят восстановить ее целиком (размер kernel должен быть примерно в два раза больше длины траектории смаза)
              • 0
                Странно, что отдельные детали машины смазаны сильно по-разному. Подфарник и колесо почти нормальные, а номер размыт очень сильно. Как так может быть? Что-то я не представляю. Широкоугольная камера?
                • 0
                  Весьма похоже на Zoom Blur — там тоже в центре четко, а по краям размыто
                  • 0
                    К сожалению не могу сказать что выделывал фотограф, сам был в тот момент за рулем. Но насколько знаю никакой постобработки тут нет.
                    • 0
                      Классический Zoom Blur как раз и делается без пост обработки — вращается зум и в это время нажимается на спуск с достаточно длинной выдержкой.
                • 0
                  Объектив китовый.
                  • 0
                    Это что значит?
                    • 0
                      Тот, с которым аппарат и был куплен, то есть стандартный середнячок.
  • –1
    Прогресс не стоит на месте, скоро и такое замутят:
    Скрытый текст
    image
    • +1
      Зашёл в комменты в поисках этой картинки :-)

      По теме — интересная программа, надо будет попробовать. Художественные фото с её помощью, конечно, не сделаешь, но вот что-то, снятое «для истории», или, как в комменте выше, с камеры наблюдения — вполне.
      • 0
        Сильно зависит от фото — какие-то удается восстановить даже до приемлемого художественного уровня, какие-то не удается даже улучишть.
        На страничке с примерами приведены как раз восстановления близкие к идеальным.
  • 0
    по фотам впечатление, будто они не сняты размытыми, а искусственно сдублирован слой, чуть смещен в сторону и все это затем заблюрено — четко видно двоение элементов снимка. При реальной съемке — рука дрогнула, фокус не туда навелся, у меня так не выходило.
    • +1
      У меня такое тоже часто получается.
      Пример механизма следующий — нажимаем на спуск, затвор открывается и некоторое время экспонирует матрицу, получается первый видимый отпечаток объекта, потом палец отпускается фотоаппарат движется оставляя след на снимке, далее фотик останавливается (затвор еще открыт), объект некоторое время экспонируется еще раз уже в новом месте матрицы, далее затвор закрывается.
      В итоге получаем двоение снимка со небольшим шлейфом-смазом между двумя этими двумя положениями.
  • 0
    По фотографии с ветками видно, что 2D пространство мало для таких операций, так как ядро искажения разное для всех планов, и без карты глубины (или стереофото, из которого можно получить карту глубины), которая позволит получить ядро искажения для всех планов, и передного, и заднего, и промежуточных здесь никуда.
    То есть на этом снимке правая часть ветки хорошо восстановилась, а всё что ближе имеет другое ядро искажения, поэтому и двоится.
    • 0
      Ядро искажения зависит от глубины только для расфокусировки (или же когда фотик движется параллельно, типа съемка из поезда, но это крайне редко). В примере с ветками есть небольшое различие в ядре для левого и правого края фотографии по другим причинам. Но в целом она восстановлена вполне неплохо
  • 0
    Крайне интересно.
    Еще и потому, что обещанный фильтр отсутствует в CS6, насколько я понял.

    … Но, к сожалению, на практике я не получил сколько нибудь приемлемых результатов на черно-белых сканах негативов.
    Возможно проблема в четких царапинах и пятнах на них, или м.б. отсутствии цветовой информации?
    Никакие варианты не позволили мне улучшить фото.

    Как пример могу отправить несколько тестовых фото вам (если интересно)
    • 0
      Да, очень интересно — отправляйте!
      • 0
        Интересно, а если заблурить такой скан, распознается ли ядро правильно? Или вернет все к изначальному, размазанно-поцарапанному изображению?
        • +1
          Алгоритм разблюрит, найдет царапины и решит, что устранил размытость и нашел четкие объекты :)
    • 0
      «Чёткие царапины» должны сильно помешать. И дать резкий пик в «нуле», т.е в оригинальном изображении.
  • 0
    А мы столько лет поносили Голливуд, а они знали…
  • 0
    При запуске версии 1.27 под мак сообщается, что есть обновление. Но фактически его нет?
    • 0
      Это побочный эффект того, что код от версии 1.27 общий для всех ОС — по идее нужно было еще передавать тип платформы.
      В целом да — обновление показывает, но версия пока только для Windows. Впрочем, скоро ожидается и под другие платформы.
  • 0
    Мы выпустили версию SmartDeblur 2.1.

    Основные изменения:
    — Поддержка больших изображений (до 36MP на 64-битной ОС и до 15MP на 32-битной)
    — Возможность редактирования полученного kernel (траектории смаза)
    — Увеличение скорости за счет оптимизаций и использования Intel IPP в качестве FFT
    — Улучшение интерфейса

    Подробнее здесь: habrahabr.ru/post/180393/

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