[Из песочницы] Восстановление смазанных и расфокусированных изображений с помощью фильтра Винера. Реализация на 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.

© Habrahabr.ru