Участник:Kiseliov/Метод регуляризации Тихонова
Автор: Киселёв Е. И.
ЧАСТЬ. Свойства и структура алгоритмов
Общее описание алгоритма
Метод регуляризации Тихонова заключается в следующем:
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:
[math]\displaystyle{ K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ), -\infty\lt x_1,x_2\lt \infty }[/math]
Здесь [math]\displaystyle{ K(x_1,x_2 )∈L_2 (\mathbb{R}^2) }[/math] – аппаратная функция прибора (ядро), [math]\displaystyle{ u(x_1,x_2 )∈L_2 (\mathbb{R}^2) }[/math] – искаженное изображение, а [math]\displaystyle{ z(x_1,x_2 ) }[/math] – искомое реконструируемое изображение.
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:
[math]\displaystyle{ z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2 }[/math]
Здесь [math]\displaystyle{ \bar K (x_1,x_2 ) }[/math] – спектр ядра, [math]\displaystyle{ \bar u (x_1,x_2 ) }[/math] – спектр искаженного изображения, а [math]\displaystyle{ M(\omega_1,\omega_2) }[/math] – заданная четная функция, обладающая следующими свойствами:
- [math]\displaystyle{ M(\omega_1,\omega_2) }[/math] кусочно-непрерывна в любой конечной области
- [math]\displaystyle{ M(\omega_1,\omega_2) }[/math] неотрицательна: [math]\displaystyle{ M(0,0)\ge0 }[/math] и [math]\displaystyle{ M(\omega_1,\omega_2)\gt 0 }[/math] при [math]\displaystyle{ \omega_1,\omega_2\neq0 }[/math]
- для достаточно больших [math]\displaystyle{ |\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C\gt 0 }[/math]
- для [math]\displaystyle{ \forall \alpha \gt 0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2) }[/math]
Математическое описание алгоритма
Пусть нам даны спектры искажённого изображения [math]\displaystyle{ \bar u_{ij} }[/math] и ядра [math]\displaystyle{ \bar K_{ij} }[/math] - это квадратные матрицы, состоящие из комплексных чисел, размера [math]\displaystyle{ N\times N }[/math]. Тогда спектр исходного изображения в позиции [math]\displaystyle{ (i, j) }[/math] находится по формуле:
[math]\displaystyle{ \bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r} }[/math]
Здесь [math]\displaystyle{ \vartriangle x=\frac{4R}{N} }[/math], где R - один из параметров ядра (известная, наперёд заданная величина).[math]\displaystyle{ (\bar K_{ij})^* }[/math] - сопряжение спектра ядра. [math]\displaystyle{ \alpha }[/math] и [math]\displaystyle{ r }[/math] - параметры метода.
В реализации будем считать [math]\displaystyle{ \alpha = 0.5 }[/math] и [math]\displaystyle{ r = 1 }[/math] (наиболее подходящие параметры в нашем случае).
Вычислительное ядро алгоритма
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции [math]\displaystyle{ (i, j) }[/math] вычисления производятся независимо по формуле, указанной пункте 1.2.
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили [math]\displaystyle{ r = 1 }[/math]). Итого, 15 операций. Формулы применяется независимо в каждой точке [math]\displaystyle{ (i, j) }[/math] [math]\displaystyle{ \Rightarrow }[/math] вычислительная сложность ядра алгоритма - 15 операций.
Макроструктура алгоритма
Макроструктура алгоритма представляет собой проход по всем точкам [math]\displaystyle{ }[/math](i, j)[math]\displaystyle{ }[/math] и вычисление [math]\displaystyle{ }[/math](i, j)[math]\displaystyle{ }[/math] позиции результирующей матрицы по формуле, указанной в пункте 1.2.
Схема реализации последовательного алгоритма
Реализация указанного алгоритма на C++:
#define _USE_MATH_DEFINES
#include <cmath>
#include <complex>
#include <complex.h>
#include <omp.h>
using namespace std;
int TikhonovReg(const int N, const complex<double>* image, const complex<double>* kernel, const int R, const double alpha, const int r, complex<double>* restored)
{
// DeltaX in formula (we want to compute this values once)
int delta_x = (4 * R) / N;
complex<double> delta_x_pow2 = delta_x * delta_x;
complex<double> delta_x_pow4 = delta_x_pow2 * delta_x_pow2;
// For loop gets parallel. Each step of loop for point (i, j) is executed separately
#pragma omp parallel for collapse(2) num_threads(8)
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
// Index (i, j) in 1d mass
long index = i * N + j;
// Move coordonate system center to the center of image
int m = i - N / 2;
int n = N / 2 - j;
// Calculating formula
complex<double> upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;
complex<double> kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();
complex<double> down_part1 = kernel_squared_module * delta_x_pow4;
int m_pow2 = m * m;
int n_pow2 = n * n;
double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));
complex<double> down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);
complex<double>down_part = down_part1 + down_part2;
restored[index] = upper_part / down_part;
}
}
Последовательная сложность алгоритма
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно [math]\displaystyle{ 15 }[/math]. Всего формула будет применена [math]\displaystyle{ N^2 }[/math] раз. Итого, в последовательном варианте сложность составит [math]\displaystyle{ 15 * N^2 }[/math] операций.
Информационный граф
Ресурс параллелизма алгоритма
Поскольку в каждой позиции [math]\displaystyle{ (i, j) }[/math] вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть [math]\displaystyle{ N^2 }[/math].
Входные и выходные данные алгоритма
Входные данные: Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).
Выходные данные: Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.
Свойства алгоритма
ЧАСТЬ. Программная реализация алгоритма
Особенности реализации последовательного алгоритма
Локальность данных и вычислений
Возможные способы и особенности параллельной реализации алгоритма
Масштабируемость алгоритма и его реализации
Динамические характеристики и эффективность реализации алгоритма
Выводы для классов архитектур
Существующие реализации алгоритма
Литература
- Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.
- Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.
- Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.