Восстановление смазанных и расфокусированных изображений с помощью фильтра Винера. Реализация на C++ OpenCV

В продолжении статьи про восстановление расфокусированных и смазанных изображений хочу поделиться своими результатами восстановления реальных изображений с помощью фильтра Винера. В качестве библиотеки обработки изображений использовалась OpenCV 3.4. Фотокамера – Nikon D320, объектив Nikon DX AF-S NIKKOR 18-105mm, расфокусировка осуществлялась вручную, съёмка осуществлялась без штатива.


Результаты восстановления расфокусированных изображений


При расфокусировке искажающая система хорошо аппроксимируется цилиндрической функцией рассеяния точки (ФРТ) радиуса r.


o_psf
Цилиндрическая ФРТ


Ниже приведены результаты восстановления трёх реальных расфокусированных изображений одного и того же объекта (страницы книги). Съёмка проводилась без штатива с расстояния примерно 50 см. Степень расфокусировки объектива вручную увеличивалась от кадра к кадру. Параметры фильтра Винера r и отношение сигнал/шум (SNR) подбирались вручную таким образом, чтобы обеспечить наилучшее визуальное качество восстановления. Для компенсации краевых эффектов производится плавное уменьшение яркости изображения на краях.


o1f
Изображение A


o1r_gamma-var_640
Результат восстановления изображения A. r = 53, SNR = 5200


o2f
Изображение B


o2r_gamma-var_640
Результат восстановления изображения B. r = 66, SNR = 4400


o3f
Изображение C


o3r_gamma-var_640
Результат восстановления изображения C. r = 102, SNR = 7100


Видно, что даже при существенной расфокусировке читаемость текста практически
полностью восстанавливается.


Результаты восстановления смазанных изображений автомобильных номеров


Смаз изображения возникает при взаимном движении камеры и объекта относительно друг друга во время экспозиции. Рассмотрим только тот случай, когда снимаемый объект линейно перемещается относительно неподвижной камеры. В таком случае искажающая система хорошо аппроксимируется ФРТ в виде отрезка, который направлен вдоль движения объекта. Такая ФРТ задаётся двумя параметрами: L длина и THETA угол смаза.


m_psf
ФРТ при линейном смазе


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


m1
Искажённое изображение двух легковых автомобилей


Ниже представлены результаты восстановления номеров обоих автомобилей с помощью фильтра Винера. Значение параметров L, THETA и SNR подбирались таким образом, чтобы обеспечить наилучшее визуальное качество восстановления номера автомобиля.


m2
Результат восстановления номера светлого автомобиля. L = 78, THETA = 15, SNR = 300


m3
Результат восстановления номера тёмного автомобиля. L = 125, THETA = 0, SNR = 700


Видно, что даже при значительном смазе удаётся восстановить читаемость номеров
автомобилей.


Алгоритм фильтрации реализован на C++ OpenCV в виде консольного приложения.
Исходные коды можно найти по ссылкам ниже.


https://github.com/VladKarpushin/out_of_focus_deblur/tree/full_color_version
https://github.com/VladKarpushin/motion_deblur
https://docs.opencv.org/4.0.0-alpha/de/d3c/tutorial_out_of_focus_deblur_filter.html
https://docs.opencv.org/4.0.0-alpha/d1/dfd/tutorial_motion_deblur_filter.html


Литература


  1. R.C. Gonzalez, R.E. Woods. Digital image fundamentals. 1987.
  2. И.С. Грузман, В.С. Киричук, В.П. Косых, Г.И. Перетягин, А.А. Спектор. Цифровая обработка изображений в информационных системах. 2000.
Поделиться публикацией

Комментарии 19

    +1
    Классно! А известны ли алгоритмы, позволяющие из нескольких последовательных фотографий сделать одну, но с более высоким разрешением?
    +5

    Ранее на хабре отписывался о разработке софта такого же назначения автор SmartDeblur — https://github.com/Y-Vladimir/SmartDeblur, сделавший позже из него платное ПО — http://smartdeblur.net/. Давно правда новые версии не выходили. Посмотрите, возможно вам пригодятся наработки Владимира.

      +1
      Спасибо. Работу Владимира видел, очень хорошая программа.
      0
      А как заглянуть за диффракционный предел? Я тут обнаружил что почти все камеры телефонов(в зависимости от диаметра диафрагмы) работают практически на своем лимите в видимом спектре света — производители ставят слишком мальнькую диафрагму и всё, привет блюр. А в нормальном состоянии блюр около 1го пикселя в диаметре, и поэтому малозаметен (но портит лично мне нервы). Я пробовал sharp постпроцессинг(есть во многих фоторедакторах), четкость повышается, но всеравно выглядит не натурально в сравнении с суперсемплингом.
      Ps проколите в черной бумаге иголкой дырку диаметром 0.5 мм либо меньше, и увидете предел во всей красе, даже невоуруженным взглядом.
      Pss круги на примерах в статье возможно возникают из за того что реальная диафрагма скорее всего многоугольник неправильной формы, а не круг.
        +1

        По поводу эксперимента с чёрной бумагой и иголкой. В статье автора YUVladimir уже проводился такой эксперимент. Действительно, форма PSF также зависит и от размера диафрагмы. Конечно, форма реальной PSF отличается от идеального круга.

          0
          Это явление, наблюдаемое при достижении дифракционного предела, носит название диск Эйри — в частности, так выглядит функция рассеяния точки при очень малом размере диафрагмы (пинхол)
        +3
        Рад видеть статью по восстановлению размытых изображений.
        P.S. Я как раз автор того SmartDeblur и серии статей по этой теме )
          +1
          Не пробовали ли вы сделать обратную гамма-коррекцию перед применением фильтра?
          Как правило, выходной сигнал с цифровых камер приводится к стандарту цвета sRGB. Если смешать чёрный (0) и белый (255) цвета, исходя из физического уровня яркости, то получится серый цвет с интенсивностью 186, а не 127, как получилось бы при простом вычислении среднего. Возможно, это даст лучший результат в отношении устранения артефактов.
            +3
            Да, также хотелось бы заметить, что полностью избавиться от эффектов «звона» (см., например «Результат восстановления изображения А») не получится. Дело в том, что наша PSF технически является фильтром нижних частот; в процессе размытия изображения (свёртки) спектр исходного изображения умножается на спектр ядра свёртки, в результате чего амплитуды высокочастотных составляющих, которые передают мелкие детали изображения, занижаются. Если амплитудно-частотная характеристика PSF имеет нули, то некоторые частоты гасятся полностью. Наглядный пример для одномерного случая — прямоугольная функция и её Фурье-образ, sinc-функция, которая имеет бесконечное множество нулей; такой «фильтр» обнуляет частотные компоненты, период которых целое число раз укладывается в прямоугольное окно. Соответственно, восстановить исходную амплитуду таких частотных компонент в процессе деконволюции невозможно. Мы можем только косвенно судить о ней, например, поставив условие неотрицательности исходного сигнала (изображения). О подобных нюансах писал автор известной программы.
              0

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

              0
              А смаз только линейный обрабатывается?
                0
                Да, только линейный.
                0
                Обработка осуществлялась на ПК intel 2.3 GHz, RAM 8Gb. Размер изображения 5184x3456, глубина цвета – 8 бит. Время обработки не превышает трех секунд
                  0
                  А если побольше битиков использовать?
                    0
                    Если цветное изображение, то получалось <6 секунд.
                      0
                      Я имел в виду из равки больше битов одного цвета взять, если ч/б изображение тремя цветами усреднять не факт, что какой-то сильный профит будет.

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

                Самое читаемое