Получение обратного ядра данного двумерного ядра свертки
Это, по сути, обобщение вопроса - Вывод обратного фильтра ядра свертки изображения .
Постановка задачи
Для данного сверточного ядра $ f \ in \ mathbb {R} ^ {m \ times n} $ найдите свое обратное ядро, $ g \ in \ mathbb {R} ^ {p \ times q} $ такое, что $ f \ ast g = h = \ delta $.
Решение I
Можно построить матричную форму оператора свертки.
Форма Matrix может дублировать различные режимы фильтрации изображений (эксклюзивные):
- Граничные условия (Применяется как заполнение изображения и применяется Свертка в действительном режиме).
- Zero Padding
Заполнение изображения нулями.
- Круговой
Использование кругового / периодического продолжения изображения.
Свертка в частотной области соответствия.
- Репликация
Репликация значений ребер (ближайший сосед).
Обычно создает наименьшее количество артефактов в реальном мире.
- Симметричный
Зеркальное отображение изображения по краям.
- Форма свертки
- Полное
Размер вывода в полном объеме - $ \ left (m + p - 1 \ right) \ times \ left (n + q - 1 \ right) $.
- То же самое
Размер вывода соответствует размеру ввода («Изображение»).
- Действительно
Размер вывода - это размер полного перекрытия изображения и ядра.
При использовании Фильтрации изображений выходной размер соответствует входному размеру, поэтому матричная форма является квадратной, а обратная определяется.
При использовании Convolution Matrix матрица может быть не квадратной (если не выбрано «Same»), поэтому следует вывести псевдообратную форму.
Следует заметить, что хотя входная матрица должна быть разреженной, обратная матрица не является.
Более того, хотя матрица свертки будет иметь особый вид (Тёплиц пренебрегает граничными условиями), обратное не будет.
Следовательно, это решение является более точным, чем следующее, но оно также использует более высокую степень свободы (решение не обязательно в форме Теплица).
Решение II
В этом решении обратное вычисляется с использованием минимизации следующей функции стоимости:
$$ \ arg \ min_ {g} \ frac {1} {2} {\ left \ | f \ ast g - h \ right \ |} _ {2} ^ {2} $$
Производная определяется по:
$$ \ frac {\ частичный \ frac {1} {2} {\ left \ | f \ ast g - h \ right \ |} _ {2} ^ {2}} {\ частичный g} = f \ star \ left (f \ ast g - h \ right) $$
Где $ \ star $ - операция корреляции.
На практике свертка в целевой функции выполняется в режиме full
(идиома MATLAB).
На практике это делается:
* * 1068
Там, где код переворачивается mF
для Correaltion и используется допустимый (в матричной форме это - Adjoint / Transpose -> вывод меньше).
Задача оптимизации является строго выпуклой и может быть легко решена с помощью градиентного спуска:
for ii = 1:numIteraions
mObjFunGrad = conv2(conv2(mF, mG, 'full') - mH, mF(end:-1:1, end:-1:1), 'valid');
mG = mG - (stepSize * mObjFunGrad);
end
Полный код доступен в моем StackOverflow Q2080835 GitHub Repository .