Разглаживание изображения - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь удалить изображение в Python, но столкнулся с некоторыми проблемами.Вот что я пробовал, но имейте в виду, что я не эксперт по этой теме.В соответствии с моим пониманием, если вы знаете функцию разброса точек, вы должны иметь возможность просто размыть изображение, выполнив деконволюцию.Тем не менее, это, похоже, не работает, и я не знаю, делаю ли я что-то глупое или просто не правильно понимаю вещи.В книге по вычислительной физике Марка Ньюмана (с использованием Python) он затрагивает эту тему в задаче 7.9.В этой задаче он предоставляет изображение, которое он намеренно размыл, используя функцию рассеяния точки Гаусса (psf), и цель задачи состоит в том, чтобы размыть изображение, используя гауссову.Это достигается путем деления 2D-БПФ размытого изображения на 2D-БПФ PSF, а затем выполняется обратное преобразование.Это работает достаточно хорошо.

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

Blurred Text

Blurred Point Light Source

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

Одна вещь, которую я попытался сделать, это заменить небольшие значения (меньше, чем эпсилон)в преобразовании psf либо с 1, либо с epsilon, и я попробовал это с огромным диапазоном значений для epsilon.Это дало изображение, которое было не просто шумом, но и не размытой версией изображения;это выглядит как странная, размытая версия исходного (не размытого) изображения.Вот изображение из моей программы (вы можете игнорировать значение сигмы, которое не использовалось в этой программе).

enter image description here

Я считаю, что яЯ имею дело с проблемой шума, но я не знаю почему, и я не знаю, что с этим делать.Любой совет был бы очень признателен (учитывая, что я не являюсь экспертом в этой области).

Обратите внимание, что я намеренно не опубликовал код, потому что я думаю, что это несколько неактуально на данный момент.Но я был бы счастлив сделать это, если кто-то думает, что это будет полезно.Я не думаю, что это проблема программирования, потому что я использовал ту же технику, и она отлично работает, когда у меня есть известная функция разброса точек (например, когда я делю БПФ исходного изображения в фокусе на БПФ вне-фокусировать изображение, а затем обратное преобразование).Я просто не понимаю, почему я не могу использовать свою экспериментально измеренную функцию разброса точек.

1 Ответ

0 голосов
/ 13 декабря 2018

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

  1. Почему вы не можете решить эту проблему с помощью простой деконволюции.
  2. Схема того, как можно выполнить размытие изображения.
  3. Деконволюция по БПФ и почему это плохая идея
  4. Альтернативный метод деконволюции

Но сначала несколько обозначений:

Я использую I для представления изображения и K для представления ядра свертки. I * K - свертка образа I с ядром K . F (I) - (n-мерное) преобразование Фурье изображения I и F (K) - это преобразование Фурье ядра свертки K (это также называется функцией рассеяния точки, или PSF).Аналогично, Fi является обратным преобразованием Фурье.

Почему вы не можете решить эту проблему с помощью простой деконволюции:

Вы правы, когда говорите, что мы можем восстановить размытое изображение Ib = I * K путем деленияПреобразование Фурье Ib с помощью преобразования Фурье K .Однако размытие линз не является операцией размытия в виде свертки.Это модифицированная операция сверточного размытия, в которой ядро ​​размытия K зависит от расстояния до фотографируемого объекта.Таким образом, ядро ​​изменяется от пикселя к пикселю.

Вы можете подумать, что это не проблема с вашим изображением, поскольку вы измерили правильное ядро ​​в положении изображения.Однако это может быть не так, поскольку часть изображения, которая находится далеко, может влиять на ту часть изображения, которая находится близко.Один из способов решения этой проблемы - обрезать изображение так, чтобы видна была только бумага.

Почему деконволюция с помощью БПФ - плохая идея:

Теорема о сверточности утверждает, что I * K = Fi ( F (I) F (K)) .Эта теорема приводит к разумному предположению, что если у нас есть изображение, Ib = I * K , которое размыто ядром свертки K , то мы можем восстановить размытое изображение, вычисляя I = ( F (Ib) / F (K)) .

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

Теперь позвольте мне объяснить, почему труднодеконволюция изображения с помощью БПФ.Размытие по умолчанию удаляет высокочастотную информацию.Таким образом, высокие частоты K должны стремиться к нулю.Причина этого заключается в том, что высокочастотная информация I теряется, когда она размыта - таким образом, высокочастотные компоненты Ib должны стремиться к нулю.Для этого высокочастотные составляющие K также должны стремиться к нулю.

В результате того, что высокочастотные составляющие K почти равны нулю, мы видим, что высокочастотные составляющие Ib значительно усиливаются (так как мы почтиделим на ноль), когда мы деконволюции с БПФ.Это не проблема в бесшумном корпусе.

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

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

  1. Пиксели вне изображения имеют то же значение, что и ближайший пиксель внутри изображения
  2. Пиксели вне изображения имеют постоянное значение (например, 0)
  3. Изображение является частью периодического сигнала, поэтому ряд пикселей над самой верхней строкой равен нижнему ряду пикселей.

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

В дополнение к этому, кажется, что метод инверсии, основанный на БПФ, значительно более чувствителен к ошибочным ядрам, чем итерационные методы (например, градиентный спуск и FISTA).

Альтернативный метод для деконволюции

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

Пусть ||I || ² будет квадратом суммы всех пикселей I .Решение уравнения

Ib = I * K

относительно I эквивалентно решению следующей задачи оптимизации:

min L (I) = min || I * K - Ib || ²

относительно I .Это можно сделать с помощью градиентного спуска, поскольку градиент L задается как

DL = Q * (I * K - Ib)

где Q - это ядро, которое вы получаете путем транспонирования K (это также называется согласованным фильтром в литературе по обработке сигналов).

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

from scipy.ndimage import convolve

blurred_image = # Load image
kernel = # Load kernel/psf
learning_rate = # You need to find this yourself, do a logarithmic line search. Small rate will always converge, but slowly. Start with 0.4 and divide by 2 every time it fails.
maxit = 100

def loss(image):
    return np.sum(convolve(image, kernel) - blurred_image)

def gradient(image):
    return convolve(convolve(image, kernel) - blurred_image)

deblurred = blurred_image.copy()
for _ in range(maxit):
    deblurred -= learning_rate*gradient(image)

Вышеуказанный метод, возможно, является самым простым из итерационных алгоритмов деконволюции.Они используются на практике с помощью так называемых регуляризованных алгоритмов деконволюции.Эти алгоритмы работают, сначала определяя функцию, которая измеряет количество шума на изображении, например, TV (I) (общее отклонение I ).Затем процедура оптимизации выполняется для L (I) + wTV (I) .Если вас интересуют такие алгоритмы, я рекомендую прочитать статью FISTA Амира Бека и Марка Тебулля.Работа довольно трудоемкая, но вам не нужно понимать большую ее часть - только о том, как реализовать алгоритм устранения размытости на телевидении.

В дополнение к регуляризатору, мы используем ускоренные методы, чтобы минимизировать потери L (I) * * тысяча сто шестьдесят девять.Одним из таких примеров является ускоренный градиентный спуск Нестерова.См. Адаптивный перезапуск для ускоренных градиентных схем. Автор Brendan O'Donoghue, Emmanuel Candes, для получения информации о таких методах.

Схема того, как можно выполнять размытие изображения.

  1. Обрезать изображение так, чтобы все находилось на одинаковом расстоянии от камеры
  2. Найти ядро ​​свертки таким же образомВы сделали это сейчас (сначала протестируйте алгоритм деконволюции на синтетически размытых изображениях)
  3. Реализуйте итерационный метод для вычисления деконволюции
  4. Деконволюция изображения.
...