Деконволюция в принципе может позволить вам обратить вспять нерезкость, но это работает лучше всего, когда у вас есть изображения с низким уровнем шума, и вы можете точно извлечь так называемую функцию разброса точек. Настройки вашей камеры вызвали размытие, потому что точка на сцене влияет не только на один пиксель, но на группу пикселей. Профиль значений серого называется функцией разброса точек. Учитывая функцию разброса точек, задача устранения нерезкости математически хорошо определена, но она не имеет единственного решения, когда к изображению добавляется шум.
Существует множество алгоритмов, позволяющих реконструировать наиболее вероятное изображение. Я использую бесплатную ImageJ программу с плагином Parallel Iterative Deconvolution и плагином DeconvolutionLab .
С установленными этими программами у вас должна быть функция разброса точек в виде файла изображения. Вы должны выполнить всю работу в линейном цветовом пространстве и разложить все цветовые каналы как отдельные файлы изображений.
Но все это довольно обычная простая работа, получение функции разброса точек - нетривиальная часть, которая требует больше всего работы. Если ваше изображение содержит объект, похожий на точку (например, звезду), то вы можете использовать этот объект в качестве функции разброса точек. Но предположим, что это не так. Тогда лучшее, что вы можете сделать, - это найти на своем изображении контрастные края, которые, по вашему мнению, должны быть резкими переходами, размазанными по нескольким пикселям исключительно из-за нерезкости. Если существует несколько таких ребер, движущихся в разных направлениях, то функция разброса точек становится хорошо определенной. Но если мы сделаем простое предположение об изотропной функции разброса точек, то достаточно одного края и математика значительно упростится.
Предположим, вы берете свое изображение, трансформируетесь в линейное цветовое пространство и увеличиваете изображение до некоторого острого края. При достаточном увеличении кривизна почти исчезнет. Если вы выберете край, яркость которого не изменяется быстро с обеих сторон, то при увеличении вблизи края яркость с обеих сторон будет стремиться к некоторому постоянному значению вдали от каждого края. Но сейчас есть статистические колебания из-за шума.
Итак, у вас есть одна область, где средняя яркость равна v1 на некотором расстоянии от края, а в другой области она равна v2. Вблизи края происходит постепенный переход от v1 к v2, который в случае изотропной функции рассеяния точки P (r), которая зависит только от расстояния r до центрального пикселя, определяется как:
v (d) = v1 + 2 (v2-v1) Интеграл от d до бесконечности arccos (d / r) r P (r) dr
где d - расстояние от края до области 1, где мы принимаем d за отрицательное значение, указывающее на перемещение в область 2.
Тогда удобно использовать математический макрос ImageJ для преобразования значений серого в g (d), определенный как:
g (d) = (v (d) -v1) / (2 * (v2-v1))
Итак, если v1 = 100 и v2 = 30, вы просто пишете макрос как
v1 = 100; v2 = 30; v = (v -v1) / (2 * (v2-v1))
Тогда отношение между g (d) и функцией разброса точек может быть выражено как:
g '(d) = -интеграл от d до бесконечности r / sqrt (r ^ 2-d ^ 2) p (r) dr
Это интегральное уравнение для P (r) можно перевернуть, чтобы получить:
P (r) = 2 / pi Интеграл от r до бесконечности g '' (s) / sqrt (s ^ 2-r ^ 2) ds
Что можно переписать, заменив s = r cosh (t) как:
P (r) = 2 / pi Интеграл от 0 до бесконечности от g '' [r cosh (t)] dt
Мне кажется удобным сделать преобразование изображения, отображающего функцию g, записав его как:
g (d) = 1/2 / [1 + exp (f (x)]
Итак, я положил f = log [1 / (2 * g) - 1]
с использованием математического макроса ImageJ.
Тогда линейное приближение вида f (d) = p d уже будет работать достаточно хорошо, так как это уже правильно отразит значение в нуле и асимптотику в плюс и минус бесконечности. Но это первый шаг к лучшему приближению. Тогда проблема состоит в том, как сделать такое соответствие, если у нас есть какое-то изображение, отображающее f в виде значений серого, и у вас есть некоторый край, проходящий по изображению приблизительно по прямой линии.
Вы не хотите тратить много времени, пытаясь возиться с измерением расстояний до линии, которая, во-первых, не очень четко определена. Вместо этого вы делаете линейное соответствие в терминах координат изображения x и y:
f (x, y) = a + b x + c y
Для вычисления a, b и c требуется, чтобы вы вычислили суммы f, x, y, f*x, f*y, x^2, y^2 and x*y
, что вы можете легко сделать с помощью средств измерений ImageJ. Тогда из этого следует подгонка f как функции расстояния d до линии вида f (d) = p d, где p = sqrt (b ^ 2 + c ^ 2). Кроме того, вы можете создать изображение, в котором в качестве значений серого указано расстояние до линии, а это просто f / p. Это «изображение карты расстояний» полезно для подгонки более высокого порядка в форме f(d) = p1*d + p3*d^3 + p5*d^5+...
Получив точное функциональное представление f (d), легко численно оценить интеграл, который дает функцию разброса точек.