Пользователь
0,0
рейтинг
23 января 2012 в 23:04

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

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

Почему же для устранения смаза и расфокусировки практически ничего нету (unsharp mask не в счет) – может быть это в принципе невозможно? На самом деле возможно – соответствующий математический аппарат начал разрабатываться примерно 70 лет назад, но, как и для многих других алгоритмов обработки изображений, все это нашло широкое применение только в недавнее время. Вот, в качестве демонстрации вау-эффекта, пара картинок:



Я не стал использовать замученную Лену, а нашел свою фотку Венеции. Правое изображение честно получено из левого, причем без использования ухищрений типа 48-битного формата (в этом случае будет 100% восстановление исходного изображения) – слева самый обычный PNG, размытый искусственно. Результат впечатляет… но на практике не все так просто. Под катом подробный обзор теории и практические результаты.
Осторожно, много картинок в формате PNG!

Введение


Начнем издалека. Многие считают, что размытие необратимая операция и информация безвозвратно теряется, т.к. каждый пиксель превращается в пятно, все смешивается, а при большом радиусе размытия так и вовсе получим однородный цвет по всему изображению. Это не совсем так – вся информация просто перераспределяется по некоторому закону и может быть однозначно восстановлена с некоторыми оговорками. Исключение составляет лишь края изображения шириной в радиус размытия – там полноценное восстановление невозможно.

Продемонстрируем это «на пальцах», используя небольшой пример для одномерного случая – представим что у нас есть ряд из пикселей со значениями:
x1 | x2 | x3 | x4… – Исходное изображение

После искажения значение каждого пикселя суммируется со значением левого, т.е. x’i = xi + xi-1. По идее, надо еще поделить на 2, но опустим это для простоты. В результате имеем размытое изображения со значениями пикселей:
x1 + x0 | x2 + x1 | x3 + x2 | x4 + x3… – Размытое изображение

Теперь будем пробовать восстанавливать, вычтем последовательно по цепочке значения по схеме – из второго пиксела первый, из третьего результат второго, из четвертого результат третьего и так далее, получим:
x1 + x0 | x2 — x0 | x3 + x0 | x4 — x0… – Восстановленное изображение

В итоге вместо размытого изображения получили исходное изображение, к пикселям которого добавлена неизвестная константа x0 с чередующимся знаком. Это уже намного лучше – эту константу можно подобрать визуально, можно предположить, что она примерно равна значению x1, можно автоматически подобрать с таким критерием, чтобы значения соседних пикселей «скакали» как можно меньше и т.д. Но все меняется, как только мы добавляем шум (которые всегда есть в реальных изображениях). При описанной схеме на каждом шаге будет накапливаться вклад шума в общую составляющую, что в итоге может дать совершенно неприемлемый результат, но, как мы убедились, восстановление вполне реально даже таким примитивным способом.

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


А теперь перейдем к более формальному и научному описанию этих процессов искажения и восстановления. Будем рассматривать только полутоновые черно-белые изображения в предположении, что для обработки полноцветного изображения достаточно повторить все необходимые шаги для каждого из цветовых каналов RGB. Введем следующие обозначения:
f(x, y) – исходное неискаженное изображение
h(x, y) – искажающая функция
n(x, y) – аддитивный шум
g(x, y) – результат искажения, т.е. то, что мы наблюдаем в результате (смазанное или расфокусированное изображение)

Сформулируем модель процесса искажения следующим образом:
g(x, y) = h(x, y) * f(x, y) + n(x, y) (1)

Задача восстановления искаженного изображения заключается в нахождении наилучшего приближения f'(x, y) исходного изображения. Рассмотрим каждую составляющую более подробно. С f(x, y) и g(x, y) все достаточно понятно. А вот про функцию h(x, y) нужно сказать пару слов – что же она из себя представляет? В процессе искажения каждый пиксель исходного изображения превращается в пятно для случая расфокусировки и в отрезок для случая простого смаза. Либо же можно сказать наоборот, что каждый пиксель искаженного изображения «собирается» из пикселей некоторой окрестности исходного изображения. Все это друг на друга накладывается и в результате мы получаем искаженное изображение. То, по какому закону размазывается или собирается один пиксель и называется функцией искажения. Другие синонимы – PSF (Point spread function, т.е. функция распределения точки), ядро искажающего оператора, kernel и другие. Размерность этой функции, как правило меньше размерности самого изображения – к примеру, в начальном рассмотрении примера «на пальцах» размерность функции была 2, т.к. каждый пиксель складывался из двух.

Искажающие функции


Посмотрим как выглядят типичные искажающие функции. Здесь и далее будем использовать ставший уже стандартным для таких целей инструмент – Matlab, он содержит в себе все необходимое для самых разнообразных экспериментов с обработкой изображений (и не только) и позволяет сосредоточиться на самих алгоритмах, перекладывая всю рутинную работу на библиотеки функций. Впрочем, за это приходится расплачиваться производительностью. Итак, вернемся к PSF, вот примеры их вида:


PSF в случае размытия по Гауссу функцией fspecial('gaussian', 30, 8);


PSF в случае смаза фунцией fspecial('motion', 40, 45);

Операция применения искажающей функции к другой функции (к изображению, в данном случае) называется сверткой (convolution), т.е. некоторая область исходного изображения сворачивается в один пиксель искаженного изображения. Обозначается через оператор «*», не путать с обычным умножением! Математически для изображения f с размерами M x N и искажающей функции h c размерами m x n это записывается так:

(2)

Где a = (m — 1) / 2, b = (n – 1) / 2. Операция, обратная свертке, называется деконволюцией (deconvolution) и решение такой задачи весьма нетривиально.

Модель шума


Осталось рассмотреть последнее слагаемое, отвечающее за шум, n(x, y) в формуле (1). Причины шума в цифровых сенсорах могут быть самыми разными, но основные это – тепловые колебания и темновые токи. На величину шума также влияет ряд факторов, таких как значение ISO, тип матрицы, размер пикселя, температура, электромагнитные наводки и пр. В большинстве случаев шум является Гауссовым (который задается двумя параметрами – средним и дисперсией), а также является аддитивным, не коррелирует с изображением и не зависит координат пикселя. Последние три предположения являются очень важными для дальнейшей работы.

Теорема о свертке


Вернемся теперь к первоначальной постановке задачи восстановления – нам необходимо каким-то образом обратить свертку, при этом не забывая про шум. Из формулы (2) видно, что получить f(x, y) из g(x, y) не так-то просто – если решать, что называется, «в лоб», то получится огромная система уравнений. Но на помощь к нам приходит преобразование Фурье, не будем подробно на нем останавливаться, по этой теме уже было сказано немало. Так вот, есть такая теорема о свертке, которая гласит, что операция свертки в пространственной области эквивалентна обычному умножению в частотной области (причем умножение поэлементное, а не матричное). Соответственно, операция обратная свертке эквивалентна делению в частотной области, т.е это можно записать как:
(3)

Где H(u, v), F(u, v) – Фурье-образы соответствующих функций. Значит процесс искажения из формулы (1) можно переписать в частотной области как:
(4)

Инверсная фильтрация


Тут же напрашивается поделить это равенство на H(u, v) и получить следующую оценку F^(u, v) исходного изображения:
(5)
Это называется инверсной фильтрацией, но на практике практически никогда не работает. Почему же? Чтобы ответить на этот вопрос посмотрим на последнее слагаемое в формуле (5) – если функция H(u, v) принимает значение близкие к нулю или нулевые, то вклад этого слагаемого будет доминирующим. Это практически всегда встречается в реальных примерах – для объяснения этого вспомним как выглядит спектр после преобразование Фурье.

Берем исходное изображение,


преобразуем его в полутоновое и, используя Matlab, получаем спектр:

% Load image
I = imread('image_src.png');
figure(1); imshow(I); title('Исходное изображение'); 
% Convert image into grayscale
I = rgb2gray(I);
% Compute Fourier Transform and center it
fftRes = fftshift(fft2(I));
% Show result
figure(2); imshow(mat2gray(log(1+abs(fftRes)))); title('FFT - Амплитудный спектр (логарифмическая шкала)');
figure(3); imshow(mat2gray(angle(fftRes))); title('FFT - Фазовый спектр');



В результате получаем две компоненты: амплитудный и фазовый спектры. Про фазу, кстати, многие забывают. Обратите внимание, что амплитудный спектр показан в логарифмической шкале, т.к. его значения варьируются очень сильно – на несколько порядков, в центре максимальные значения (порядка миллионов) и быстро убывают практически до нулевых по мере удаления от центра. Именно из-за этого инверсная фильтрация будет работать только при нулевых или практически нулевых значениях шума. Продемонстрируем это на практике с помощью следующего скрипта:
% Load image
I = im2double(imread('image_src.png')); 
figure(1); imshow(I); title('Исходное изображение');
% Blur image
Blurred = imfilter(I, PSF,'circular','conv' );
figure(2); imshow(Blurred); title('Размытое изображение');
% Add noise
noise_mean = 0;
noise_var = 0.0;
Blurred = imnoise(Blurred, 'gaussian', noise_mean, noise_var);
% Deconvolution
figure(3); imshow(deconvwnr(Blurred, PSF, 0)); title('Результат');


          noise_var = 0.0000001                            noise_var = 0.000005

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

Существующие подходы для деконволюции


Но есть подходы, которые учитывают учитывают наличие шума на изображении – один из самых известных и самых первых, это фильтр Винера (Wiener). Он рассматривает изображение и шум как случайные процессы и находит такую оценку f' для неискаженного изображения f, чтобы среднеквадратическое отклонение этих величин было минимальным. Минимум этого отклонения достигается на функции в частотной области:
(6)
Этот результат был получине Винером в 1942 году. Подробный вывод здесь приводить не будем, те, кто интересуется, могут посмотреть его здесь . Функцией S здесь обозначаются энергетические спектры шума и исходного изображения соответственно – поскольку, эти величины редко бывают известны, то дробь Sn / Sf заменяют на некоторую константу K, которую можно приблизительно охарактеризовать как соотношение сигнал-шум.

Следующий метод, это «сглаживающая фильтрация методом наименьших квадратов со связью», другие названия: «фильтрация по Тихонову», «Тихоновская регуляризация». Его идея заключается в формулировке задачи в матричном виде с дальнейшем решением соответствующей задачи оптимизации. Это решение записывается в виде:
(7)
Где y – параметр регуляризации, а P(u, v) – Фурье-преобразование оператора Лапласа (матрицы 3 * 3).

Еще один интересный подход предложили независимо Ричардосн [Richardson, 1972] и Люси [Lucy, 1974]. Метод так и называется «метод Люси-Ричардсона». Его отличительная особенность в том, что он является нелинейным, в отличие от первых трех – что потенциально может дать лучший результат. Вторая особенность – метод является итерационным, соответственно возникают трудности с критерием останова итераций. Основная идея состоит в использовании метода максимального правдоподобия для которого предполагается, что изображение подчиняется распределению Пуассона. Формулы для вычисления достаточно простые, без использования преобразования Фурье – все делается в пространственной области:
(8)
Здесь символом «*», как и раньше, обозначается операция свертки. Этот метод широко используется в программах для обработки астрономических фотографий – в них использование деконволюции (вместо unsharp mask, как в фоторедакторах) является стандартом де-факто. В качестве примера можно привести Astra Image, вот примеры деконволюции. Вычислительная сложность метода очень большая – обработка средней фотографии, в зависимости от количества итераций, может знанимать многие часы и даже дни.

Последний рассматриваемый метод, а вернее, целое семейство методов, которые сейчас активно разрабатываются и развиваются – это слепая деконволюция (blind deconvolution). Во всех предыдущих методах предполагалось, что искажающая функция PSF точно известна, в реальности это не так, обычно PSF известна лишь приблизительно по характеру видимых искажений. Слепая деконволюция как раз является попыткой учитывать это. Принцип достаточно простой, если не углубляться в детали – выбирается первое приближение PSF, далее по одному из методов делается деконволюция, после чего некоторым критерием определяется степень качества, на основе нее уточняется функция PSF и итерация повторяется до достижения нужного результата.

Практика


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


% Load image
I = im2double(imread('image_src.png'));
figure(1); imshow(I); title('Исходное изображение');

% Blur image
PSF = fspecial('disk', 15);
Blurred = imfilter(I, PSF,'circular','conv' );

% Add noise
noise_mean = 0;
noise_var = 0.00001;
Blurred = imnoise(Blurred, 'gaussian', noise_mean, noise_var);
figure(2); imshow(Blurred); title('Размытое изображение');
estimated_nsr = noise_var / var(Blurred(:));

% Restore image
figure(3), imshow(deconvwnr(Blurred, PSF, estimated_nsr)), title('Wiener');
figure(4); imshow(deconvreg(Blurred, PSF)); title('Regul');
figure(5); imshow(deconvblind(Blurred, PSF, 100)); title('Blind');
figure(6); imshow(deconvlucy(Blurred, PSF, 100)); title('Lucy');

Результаты:


Фильтр Винера


Регуляризация по Тихонову


Фильтр Люси-Ричардсона


Слепая деконволюция

Заключение


И в конце первой части немного затронем примеры реальных изображений. До этого все искажения были искусственными, что конечно хорошо для обкатки и изучения, но очень интересно посмотреть, как все это будет работать с настоящими фотографиями. Вот один пример такого изображения, снятого зеркалкой Canon 500D с ручным уводом фокуса:



Далее запускаем несложный скрипт:


% Load image
I = im2double(imread('IMG_REAL.PNG'));
figure(1); imshow(I); title('Исходное изображение');

%PSF
PSF = fspecial('disk', 8);
noise_mean = 0;
noise_var = 0.0001;
estimated_nsr = noise_var / var(I(:));

I = edgetaper(I, PSF);
figure(2); imshow(deconvwnr(I, PSF, estimated_nsr)); title('Результат');

И получаем следующий результат:



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

И пример с реальным смазом — для его осуществления фотоаппарат был установлен на штатив, выставлена относительно длинная выдержка и равномерным движением в момент срабатывания затвора был получен смаз:


Скрипт примерно тот же, только тип PSF теперь «motion»:


% Load image
I = im2double(imread('IMG_REAL_motion_blur.PNG'));
figure(1); imshow(I); title('Исходное изображение');

%PSF
PSF = fspecial('motion', 14, 0);
noise_mean = 0;
noise_var = 0.0001;
estimated_nsr = noise_var / var(I(:));

I = edgetaper(I, PSF);
figure(2); imshow(deconvwnr(I, PSF, estimated_nsr)); title('Результат');

Результат:


Качество, опять же, заметно улучшилось — стали различимы рамы на окнах, машины. Артефакты уже другие, нежели в предыдушем примере с расфокусировкой.

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

P.S. Не так давно была опубликована статья на хабре про Исправление смазанных фотографий в новой версии Photoshop
Для тех, кто хочет поиграться с похожей технологией устранения смаза (возможно, той самой, что будет использоваться в фотошопе), можно по этой ссылке скачать демо-версию приложения, посмотреть примеры восстановления, а также почитать про принцип работы.

Литература


Гонсалес Р., Вудс Р. Цифровая обработка изображений
Гонсалес Р., Вудс Р., Эддинс С. Цифровая обработка изображений в среде MATLAB

UPD: Ссылка на продолжение

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

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

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

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

  • НЛО прилетело и опубликовало эту надпись здесь
    • +17
      Я уже не могу на нее смотреть во всех научных статьях и публикациях по обработке изображений :)
      • +17
        Слабак)
      • +28
        Посмотрите в ненаучных… :)
      • 0
        Такая амплитуда появления наводит на мысль, что фотограффия как раз была сделана для научных журналов. =)))
      • +1
        Необрезанное фото намного лучше выглядит :)
      • 0
        Ну вот Вам полная фотка из ненаучного журнала Playboy за ноябрь 1972 года. Такую Лену не только можно, но и нужно блюрить.
    • +3
      Восстановим справедливость — Лену тоже можно размазывать и потом Винеровским фильтром обратно собирать:
      image
      На самом деле в реальной жизни не всё так шоколадно. Тут важно знать закон, по которому происходит искажение, который в большинстве случаев неизвестен. Вот ещё любопытная статья, уже обсуждавшаяся на хабре:
      Image Deblurring using Inertial Measurement Sensors
      Вкратце — камеру снабдили сенсорами, чтобы при съёмке регистрировать шевелёнку и потом восстанавливать резкое изображение, зная закон перемещения камеры при съёмке.
      В астрономии тоже похожий математический аппарат применяется для получения более резких изображений галактик с целью определения их размеров. Закон размытия в этом случае получают из изображений недалеко отстоящих звёзд в предположении что звёзды являются точечными источниками.
      • 0
        Кстати в камерах такие сенсоры уже есть, во всяком случае в тех, где используется стабилизация матрицы. Было бы интересно, а нельзя ли использовать данные с сенсоров чтобы потом программно восстанавливать картинку, даже если уже нельзя смещать матрицу…
      • 0
        Интересное слово — шевелёнка…
  • +3
    Замечательно, очень часто нужно подретушировать смазанную фотку
    • +4
      Смаз, кстати, проще устраняется — причин несколько:
      1. Искажение PSF получается одинаковым для всех точек изображения, т.е. каждый пиксель превращается в одну и ту же (по форме) линию или траекторию. Для расфокусировки, в общем случае, это не так — часть объектов может быть в фокусе, часть вне фокуса, это зависит от расстояния. В математических терминах это назвается «трансляционно инвариантные искажения»
      2. Влияние шумов меньше, т.к. пиксель распределяется по гораздо меньшей площади в результате искажения (сравните линию и круглое пятно одинаковых размеров). Поэтому накопление шума происходит в меньшей степени.

      Этим и объясняется, почему в научных публикациях рассматривается, в основном, смаз. Да и в новом фотошопе будет реализовано (если успеют, конечно) устранение именно смаза.
      • 0
        Да ладно, в научных публикациях есть всё и давно, если смотреть в сторону радиофизики.

        Для «промаха» с фокусом, PSF непосредственно связана с объективом фотоаппарата, поэтому для определенных стекол может быть получена достаточно точно, вопрос лишь в потерях фазовой составляющей.

        Статья ваша супер! Молодец!
        • 0
          > если смотреть в сторону радиофизики
          Собственно, примерно оттуда и пришло — теория анализа систем управления.

          Насчет PSF — она, разумеется, связана с объективом фотика (с него и снимают образцовую PSF, обычно), но основная проблема, что PSF разная для каждой точки изображения и напрямую зависит от расстояния от данной точки на объекте до объектива. Простейший пример — лицо в фокусе (причем глаза полностью резкие, нос и уши чуток размытые), задний план размыт, сбиваем фокус — лицо размылось, задний план размылся еще сильнее (либо, наоборот, слабее).
          Это значительно усложняет задачу
  • +2
    Такими темпами хабр скоро в ВАКовский журнал превратится:)
    • +5
      Первая часть — это скорее обзор известной теории с иллюстрациями. Во второй сделаю максимальный акцент на практике
    • +66
      Уж лучше Хабру в эту сторону развиваться, чем в сторону новостей, пресс-релизов и копипаста.
    • +23
      Вы так говорите, как будто это плохо
    • +1
      Лучше так, чем в ализаровскую «желтуху» и трансляцию Engadget и HackerNews.
  • +12
    Так вот как в кино улучшают изображения!

    когда суперхакеры со спутника получают размытое изображение, потом «Щащаща… ВУАЛЯ!»
    • +90
      Ну раз никто не добавляет эту картинку, то это сделаю я. Автору спасибо за замечательную статью! image
      • –13
        оборжался на работе! хорошо что рядом никого не было! Я тоже всегда удивлялся откуда америкоты берут такие «странные» технологии!
      • +2
        Эх, опередили :)
    • 0
      Для этого необходимо получить несколько изображений. По одному восстановить картинку без значительной потери разрешения просто невозможно.
  • +3
    Стало интересно — поясните — почему 48-битный формат позволяет 100% восстановление исходного изображения?

    зы. для большого кол-ва формул я б гуглоапи юзал: code.google.com/apis/chart/infographics/docs/formulas.html
    • +3
      За подсказку с гуглапи спасибо!
      Насчет 48-битного формата — все просто, каждый пиксель в результате искажения размазывается по окрестности, т.е. исходная информация сохраняется в мельчайших перепадах яркости. Чем лучше мы сохраним эти перепады, тем точнее восстановление, когда мы будем собирать размазанный пиксель. Если в приведенных скриптах после искусственного искажения вставить сохранение на диск, а потом чтение этого же файла и выбрать формат PNG 24 бита (8 для каждого канала)

      imwrite(Blurred, 'image_blurred_disk_(15).png', 'png', 'bitdepth', '8');
      Blurred = im2double(imread('image_blurred_disk(15).png'));


      , то восстановление будет как в самой первой картинке до хабраката, если сохранить в jpg, то качество результата будет еще хуже, если же выставить 48 бит ('bitdepth', '16'), то получится исходная картинка.

      Т.е. на каждом этапе в цифровой камере и при последующей обработке происходит потеря информации:
      Информация с сенсора -> Преобразование в RAW -> Интерполяция с байеровского массива -> Преобразование в PNG 48 бит -> Преобразование в PNG 24 бит -> Преобразование в JPEG -> Ресайз
      • 0
        А, понятно, спасибо.
        При таком раскладе грех не встроить деблюр прямо в фотокамеры. (а в чуть более отдаленном будущем в видео, эх, устранение motion blur в рилтайме…).
        • +3
          И такие исследования уже ведутся:
          Эффективный метод стабилизации изображений от Microsoft
          Суть в том, что в то время, пока открыт затвор, записывается траектория движения/дрожания камеры с помощью трехосого гироскопа и акселерометра. Полученная траектория смаза есть ничто иное, как PSF — причем весьма точная, ну а дальше одним из алгоритмов деконволюции устраняется смаз.
  • +5
    Очень и очень впечатляет
  • +6
    Ждём новый фотошоп.
    www.youtube.com/watch?v=xxjiQoTp864
  • 0
    Мне пришло в голову другое сравнение:
    В старые добрые времена, когда снимали на пленку, картинки полученные с негативов всегда казались более резкими чем те что были получены со слайдов. Почему? Потому что у негатива есть зерно. То есть некая фактура изображения. Она делает картинку зрительно резче.

    Глазу, как и любому автофокусу надо за что то зацепиться.
  • +12
    Всё же насчет «может быть однозначно восстановлена» вы очень сильно погорячились.
    Людей, которые немного в теме, это утверждение сразу настраивает резко против статьи и заставляет искать попытки «впарить серебряную пулю». Хотя за вычетом этого утверждения, статья замечательная: в неё доступным и популярным языком изложена весьма сложная теория.

    Для неспециалистов поясню в чем подвох. Однозначность может быть, только если и изображение, и преобразования заданы абсолютно точно, то есть аналитически, то есть в виде формул.

    Если речь идёт о цифровых изображениях с современных камер, то (как и замечено в середине статьи) однозначно восстановить его уже не получится, даже если преобразования заданы аналитически. Банально не хватает разрядности.

    Применяемые в первой части статьи «теоретически точные» алгоритмы катастрофически неустойчивы к ошибкам, в том числе шумам квантования из-за нехватки разрядности. Достаточно сказать, что на практике цифровое преобразование Фурье необратимо для 8-битных изображений, если для хранения результатов преобразования использовать float-ы одинарной точности (32 бита). Для однозначного восстановления таких изображений нужно использовать только double (64 бит). Но и double не хватит для изображений с 16 битами на канал (48-битных тифов или пнг).

    Рассматриваемые далее в статье Винер и Тихонов — это заведомо приближенные методы, намного более устойчивые к шумам, но всё же формально не позволяющие говорить о какой-либо однозначности восстановления. Так что серебряной пули, увы, не существует.
    • 0
      > Всё же насчет «может быть однозначно восстановлена» вы очень сильно погорячились… Однозначность может быть, только если и изображение, и преобразования заданы абсолютно точно, то есть аналитически, то есть в виде формул.

      Да, вы все верно написали — 100% восстановление будет только при известной PSF и достаточной точности представления, для остальных случаев будет то или иное приближение, поэтому я и упомянул про "может быть однозначно восстановлена с некоторыми оговорками"
      Про потери информации на каждом этапе преобразования ответил чуть выше в вопросе про 48-битный формат.
      Как результат — пуля далеко не серебряная, но в некоторых случаях выручить может. Но, конечно, для фоток, снятых с мобильника трясущимися руками в сумерках уже ничего не может :)
  • +1
    Автор, признайтесь, вы с дьяволом никаких контрактов не подписывали?
    • +5
      Магии тут нет — ловкость рук чистая математика и никакого мошенничества :)
      • +5
        Если серьезно, то моё почтение. Очень круто.
  • 0
    интересно а так можно добится большего разрешения на матрице с низкой плотностью точек или для не самой хорошей линзы? поидее те же алгоритмы должны прокатить…

    смерть зеркалкам? :))
    • +1
      То, что вы описали, называется Super-resolution, когда из серии (или из видео) снимков неподвижной сцены с небольшими смещениями получается один снимок с улучшенным разрешением.
      Но проблемы все те же — шумы и помехи, ошибки квантования, округление, ограниченный динамический диапазон матрицы и пр. Чудес не будет, но в случае качественного исходного материала можно неплохо улучшить разрешение
      • –1
        пойду читать про супер разрешение.
        эх жду статью подробнее желательно с сорцами алгоритмов :)

        эх любопытство и желание узнать где эта граница невозможного мне с д700 такие алгоритмы не часто требуются =)))
  • 0
    Книги зачетные.
    Еще на эти темы можно результативно копать выпуски IEEE Transactions on Image Processing, пусть даже за мохнатые годы, когда они выходили на русском языке и рассылались по техническим библиотекам.
  • +2
    1) дефокус это всетаки не блюр, там соовсем другое искажение
    2) смазывание от движения объектива это тоже не классический «моушенблюр»
    3) для нормального восстановления таки надо строить модель искажения, то есть для какой части сцены какое искажение было внесено.
    • +2
      Отвечу по порядку:
      1) Как раз самый настоязий блюр — их же много разных, gaussian blur, average blur,… Вопрос только в виде PSF и ее неоднородности по кадру. В качестве первого приближения можно считать что для объективов это идеальный круг — иногда может быть правильным многогранником (если диафрагма прикрыта) с замысловатой формой краев.
      2) А что такое классический мушенблюр — вы имеете ввиду его реализацию в современных видеокартах? Так это лишь имитация. По моему, как раз классический motion blur при движении фотика — хотя вид кривой (ядра) может быть весьма непростым
      3) По-хорошему, да — надо строить точную карту искажений, но это крайне затруднительно сделать, имея на руках только снимок. Да и все перечисленные в статье методы уже не будут работать напрямую, т.к. они расчитаны на трансляционно инвариантные искажения. Хотя и можно обрабатывать сегментами или еще какие ухищрения применять.
      • 0
        1) нет :) для демонстрации почему нет, снимите источник света в нефокусе :) и в фокусе, и потом попытайтесь достичь блюром из первой картинки вторую :)
        2) если докапываться к словам, то да, моушнблюр классический это движение объекта съемки относительно камеры, но если брать «моушнблюр» как графический эффект из графического редактора, то он далек от оригинального блюра камерой (предметы для камеры на разном расстоянии, а для редактора эта информация недоступна)
        3) точную сделать затруднительно, но приближенную, довольно качественно, сделать можно. Пример эвристики: уменьшаем картинку, ищем контрастные места, эти же места анлизируем какое пробразование нужно наложить чтобы получить такое на большой картинке, проанализировав несколько разных мест картинки — делаем выводы о взаимосвязи искажений между собой (например вся картинка это моушен блюр на котором один предмет дальше другого)

        вообще гораздо интереснее восстановление из видео, когда из нескольких кадров в хреновом качестве можно сделать один в хорошем.
        • 0
          1) В разделе «Заключение» как раз есть похожий пример с размытием источника света (справа внизу от машины блик) — вполне восстанавливается, как видно
          2) Разницы особо нету — что объект движется относительно камеры, что наоборот, результат одинаковый.

          «предметы для камеры на разном расстоянии, а для редактора эта информация недоступна»
          Для моушин блюр расстояние до камеры практически не влияет (за исключением паралакса, но он крайне мал). Опять же посмотрите на мой пример восстановления реального смаза — качество вполне хорошее, значит PSF близка к истинной.
          3) Для моушен блюр примерно так и делают — на основе анализа картинки восстанавливают траекторию смаза. Посмотрите ссылки в разделе P.S. Там и программу скачать можно и поиграться с восстановлением реальных картинок.
          • 0
            1) вас не напрягает что «восстаовился» какойто круг вокруг блика? :)

            2) очень даже влияет, так как ближние объекты сдвигаются на меньшее расстояние чем дальние, и блюр будет разных «масштабов». Качество вашего ввостановления как раз плавает от дистанции до объекта :) посмотрите на машины внизу и на ближний край дома справа :)

            3) ну так и я про тоже :) это вы же сказали что «нельзя» :) :)
            • 0
              очень даже влияет, так как ближние объекты сдвигаются на меньшее расстояние чем дальние, и блюр будет разных «масштабов».

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

                2ftp.ru/?action=getfile&id=xfnsmbrriqccc0e29a49a485751b5d6ca104d1badc

                Как видно расстояние на матрице у дальнего объекта меньше чем у ближнего :)
                • 0
                  Все так, только вы привели схему для параллельного сдвига фотика — оно есть, но практически ни на что не влияет в силу малости. Это надо на многие сантиметры фотик дернуть, чтобы появились видимые смазы.
                  А вот небольшие повороты вокруг оптической оси — это именно то, что является доминирующей причиной смазов в реальных условиях, здесь достаточно повернуть фотик на доли миллиметра, чтобы появился огромный смаз. Именно его устраняют оптические стабилизаторы:

                  Стабилизация изображения — это технология, применяемая в фото- и видеосъёмочной технике, механически компенсирующая собственные угловые движения камеры

                  И вот в этом случае расстояние до объекта роли не играет
                  • 0
                    Ну если говорить строго — повороты нельзя назвать доминирующей причиной смаза. Туристы часто снимают в темноте из окна автобуса, и там смаз обусловлен сдвигом, а с ним приходит и параллакс.
                    А ещё можно крутануть камеру вокруг оптической оси, и это тоже надо учитывать при построении ядра.
                    Так что несмотря на очевидность такого способа восстановления, вывод его в удобный продукт штука сложная, и не зря в фотошопе он не появлялся так долго и был один unsharp mask.
                  • 0
                    Увы оно не малое, и на больших выдержках системы стабилизации его компенсировать не в состоянии. И так большая часть размазываний в реальной жизни — от дрожания рук а не от того что фотораф вращает фотоаппарат тудасюда.

                    Кроме того, спешу вас разочаровать, в случае с поворотом фотика относительно некоторой оси (тут уж схему нарисуйте сами) картина абсолютно такая же — для объектов на разном расстоянии разное смещение на матрице :))
                    • 0
                      «Увы оно не малое, и на больших выдержках системы стабилизации его компенсировать не в состоянии.»

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

                      «в случае с поворотом фотика относительно некоторой оси… картина абсолютно такая же — для объектов на разном расстоянии разное смещение на матрице :)) „

                      Простой эксперимент — поводите глазами вправо влево, смещаются ли объекты друг относительно друга? Нет, потому что не меняется положение центра оптической оси. Также и в фотике.
                      • 0
                        По поводу оптичесокой стабилизации — привет КЭП :)

                        По поводу простого примера с глазами — видимые размеры предметов меняются так как меняется перспективное искажение :) другое дело что вы этого не замечаете — мозг компенсирует. Рекомендую таки нарисовать себе картинку :)
                        • 0
                          При повороте вокруг нодальной точки объектива смещение объектов переднего и заднего планов не происходит совсем. Если поворот не вокруг этой точки, то небольшое смещение есть, но оно ооочень мало для объектов, которые находятся хотя бы дальше нескольких метров. А вот угловое смещение (из-за которого и идет смаз) на порядки превышает смещение из-за паралакса
                          Ссылка
                          • 0
                            ну даже по ссылке вам уже нарисовано :) зацените смещение у ближнего и у дальнего объекта
                            www.1panorama.ru/kak-sdelat-panoramu/lesson-01/02-panorama-kak-sdelat-povorot.jpg
                            :))) синий как был примерно посредине кадра так и остался, а красный аж полкадра «пролетел» :) такчто ещё раз повторюсь, моушнблюр от движения камеры и от «спецэффекта в редакторе» это разные блюры. Чтож вы такой упорный то?
      • 0
        Скорее всего, имеют в виду моушен-блюр на движущемся объекте, не связанном с фотоаппаратом — например, проехавшей мимо машине. Кажется, здесь даже выделение части сцены не поможет.
  • +2
    Вспомнился этот комментарий =)
  • +4
    Спасибо за статью. Коллега, вот Вы воспользовались несколькими библиотечными функциями Матлаба:
    deconvreg, deconvblind, deconvlucy для иллюстрации регуляризации по Тихонову, слепой деконволюции и фильтра Люси-Ричардсона. Винеровский фильтр прост как пять копеек и изложен во многих учебниках, а вот эти три — не очень тривиальны и не так широко известны. Вот если бы Вы (или кто-либо ещё) как-нибудь популярно изложили их внутреннее устройство и сущность тоже (что запросто может являться темой нескольких статей), то это было бы просто здорово. Понятно, что хабр — не «IEEE Transactions on Image Processing», но тем не менее пользы было бы очень много.
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Они довольно просто пишутся «на коленке». Почитайте Гонсалеса и Вудса, поймете, что это довольно просто.
  • –1
    Нихрена не понятно, но круто!
  • 0
    Автору уважение!!!
    И еще одна ссылочка на соседнюю проблему.

    А какой у нас блюр на кратинке?
    Aizenberg I., Bregin T., Butakoff C., Karnaukhov V., Merzlyakov N. and Milukova O., «Type of Blur and Blur Parameters Identification Using Neural Network and Its Application to Image Restoration». Lecture Notes in Computer Science, Vol. 2415, Springer, 2002, pp. 1231-1236.
    • 0
      Спасибо!
      На самой первой картинке блюр в виде круга: PSF = fspecial('disk', 15);
      • 0
        ;)
        В статье рассматривается проблема определения блюра несколько шире.

        Какой тип(радиал, гауссово размытие, смаз, дефокус ), и по возможности параметры этого смаза.
        Что поможет в применении алгоритмов восстановления представленными вами.
        • 0
          Конкретно на первой картинке до хабраката — там тип «lens blur» в терминах фотошопа, а в качестве PSF — просто круг диаметром 15, это видно из скрипта «PSF = fspecial('disk', 15);».
          В остальных примерах из скрипта также можно понять тип применяемого искажения.
          • 0
            ;)
            А на автомате?
            на потоке определять тип блюра и устранять его?

            да еще и параметры устранения подобрать?


            Вот вам и новая задачка. ;)
            • 0
              Этим как раз blind deconvolution занимается :)
              По этой теме много научных статей появилось в последнее время.
  • 0
    Я так понял, это просто передранный Гонсалес и Вудс? Только вместо Лены использовались свои фото?

    Кстати, не заметил предупреждения о том, что деконволюция — неустойчивый оператор и пользоваться им надо с осторожностью (стоит только «нарваться» на нули передаточной функции, как получим «большую радость» в виде бешеных артефактов и фазовых искажений).
    • +1
      Вообще, основная цель статьи — популяризовать теорию деконволюции для неподготовленного читателя, для тех, кто мало знаком с теорий обработки изображений. Поэтому во многих местах были сделаны упрощения, объяснения «на пальцах», аналогии.
      Все формулы, разумеется, взяты из Гонсалеса и Вудса, идеи скриптов из их же книжки. Все остальные объяснения, демонстрации, эксперименты написаны на основе моего понимания этой темы. Собственно, как и писал ранее — это больше обзор известной теории, нежели новое научное исследование. Но даже в таком виде, думаю, статья будет полезна читателям.

      > Кстати, не заметил предупреждения о том, что деконволюция — неустойчивый оператор и пользоваться им надо с осторожностью
      Да, вы правы — в следующей части упомяну и про это.
  • –1
    Автор, вы взяли изображение хорошего качества, испортили, восстановили.
    Но портили вы его математическими алгоритмами, которые дают много информации для обратных операций. Почему бы вам не взять простую расфокусированную фотку и продемонстрировать восстановление на ней?
  • –2
    Фарш невозможно провернуть назад.
    • 0
      В некоторых случаях, как показывают примеры, можно :)
  • 0
    Это отличный мануал к плагину Refocus для Gimp.
    refocus.sourceforge.net/
  • 0
    А можно пару примеров, где на исходной фото нельзя прочитать размытый текст, а на восстановленной — можно?
    • 0
      посмотрите на примеры в моем посте выше.
      вывески на стене, в правой части кадра
    • 0
      Могу пример с Astra Image дать:
      imageimage
      • –2
        Не, я исходник и сам прочитаю без восстановления, может не 100%, но читаемо.

        А вот так, чтобы вообще не читалось? И чтобы с фотика, а не гауссом блюрено?
        • 0
          Круто, я максимум что могу прочитать — это I, had, a :)
        • +13
          Сейчас специально распечатал на бумаге текст и сфоткал фотиком с ручной настройкой фокуса так, чтобы текст не читался. Вот что получилось:



          Далее берем скрипт:

          % Load image
          I = im2double(imread('IMG_6637.JPG'));
          I = edgetaper(I, PSF);
          figure(1); imshow(I); title('Исходное изображение');
          
          PSF = fspecial('disk', 70);
          
          estimated_nsr = 0.001;
          Restored = deconvwnr(I, PSF, estimated_nsr);
          imwrite(Restored, 'IMG_6637_Restored.JPG', 'jpg');
          figure(3), imshow(Restored), title('Wiener');
          

          И получаем:



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

          • +5
            Abbyy пора срочно внедрять такие фильтры себе в распознавалку.
          • 0
            Вот эту, будьте добры.
            • 0
              • 0
                А, пожалуйста:

                Сильно лучше не стало, т.к. исходное изображение пережато жипегом и буквы там высотой 4-5 пикселей. Лучше давайте нормальные исходники, а такой троллинг :)
                • 0
                  Да все понятно, это Lorem Ipsum, спасибо!
                • 0
                  Тут можно было бы резкие буквы для начала потереть, а то от них такой звон стоит… Симпатичный :)
  • +1
    Проблемы с методами деконволюции в основном в том, что наиболее качественные не являются полностью детерменистскими (нужно контролировать процесс человеком).
    Основная проблема даже не в том что неизвестно ядро искажений. а в том что всегда присутствуют шумы, что уменьшает устойчивость.

    Советую автору для слепой деконволюции предварительно сгладить картинку, чтобы уменьшить шумы, правда как сглаживать уже нужно определять экспериментально. Результат должен получиться заметно лучше. И в реальных фотографиях, конечно лучше применять методы деконволюции для разных областей, а не для всей картинки в целом.
  • +1
    Видео в хорошем качестве от адоба:
    tv.adobe.com/watch/max-2011-sneak-peeks/max-2011-sneak-peek-image-deblurring/
  • 0
    сделайте конечное приложение для улучшения качества смазанных и расфокусированных фото в Windows — расхватают как горячие пирожки
    • 0
      Их уже достаточно — Focus Magic, Topaz InFocus и пр.
      Работают, правда, весьма неудовлетворительно на реальных картинках (но на сайте картинки впечатляют)

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