Добрый день,
имею очень китайский объектив и хочу затабулировать для него дисторсию, причем дисторсия не центрально симметрична, и имеет реально недецкие искажения. Автофокуса у объектива нет.
Я хочу отписать дисторсию массивом размера с число пикселей так, что
пиксель, который видит камера, в реалии на плоскости матрицы сенсоров попадает на позицию
Итак, у меня есть градуировочный функционал (набор картинок, по которым я градуирую дисторсию), который можно записать так
здесь
индекс
бежит по реперным точкам,
индекс
бежит по номеру картинки,
- параметры поворота картинки относительно камеры (я не могу гарантировать, что я всегда и супер точно располагаю картинку относительно камеры), реально там унитарная матрица поворотов и вектор линейного переноса, то есть 6 параметров,
то, куда в пикселах попала
-ая реперная точка для
-ой картинки,
- функция отображения
-ой точки для заданной (
) трансформации,
Дополнительно я хочу потребовать, что массивы
и
имеют по
и
очень маленькие отклонения от единицы, то есть я формулирую задачу минимизации функции вида
Не найдя ничего лучшего я вижу возможность решать эту задачу покомпонентной минимизацией, то есть на четном шаге мы фиксируем значения
и ищем значения
, а не нечетном, наоборот.
Задача минимизации
, ИМХО, довольно легко решается, так как она разваливается на
независимых задач с 6 неизвестными, для которых можно посчитать аналитически (хоть и не сильно просто) и градиент, и Гессиан, тогда Ньютон в окрестности решения должен быстро сходиться. А вот задача по
меня немного озадачила.
Тут все линейно, все сводится к двум системам линейных уравнений с разреженной матрицей вида
- единичная матрица,
- диагональная матрица, где на диагонали стоят единички в позициях, которые определены индексами
,
,
,
вектор, в котором ненулевые значения определены
.
Я понимаю как решить систему или перестановкой и полным
, или сопряженным градиентом с или без предобуславливателя, но мне не нравится ее размерность.
и
у меня маленькие, около сотни, и все сопутствующие параметры
поместятся в память микроконтроллера, объем которого около 500 КБайт, а вот размерность матрицы (даже не матрицы) а просто решения
у меня будет около 2-10 миллионов, причем будет две такие векторные системы, и, даже если рассмотреть итерационное решение методом сопряженного градиента без предобуславливателя, где умножение на матрицу будет происходить совсем без генерации самой матрицы, мне потребуется не менее 5 векторов по 10 миллионов, и я совсем не впишусь в память. У процессора конечно есть внешняя память около ГБайта, но это флеш и в ней не поитерируешь, но посчитанную таблицу хранить можно.
Понятно, можно задать
на сетке, в которой, например, задана только каждая 10-ая точка, и аппроксимировать все, что между ними либо линейно, либо кубическими сплайнами, размерность задачи, конечно, будет существенно меньше, и есть вероятность, что взяв билинейную интерполяцию на каждой 24-той точке на 10МПикселей мне потребуется только 500КБайт, но есть сомнения, что точности хватит, да и по памяти совсем впритык. Получаемые формулы будут очень похожими, но довольно громоздкими, поэтому я их тут не привожу.
Вопрос.
Скажите, пожалуйста, как еще можно регуляризовать эту задачу, чтобы
натянуть сову на кактус, то есть чтобы выполнить условие, что две соседние точки в
отстоят друг от друга почти на единицу, но не генерировать явно весь тот массив точек?
Спасибо!
PS: Чтобы подтвердить мои слова, почему я выбрал такую сложную модель для дисторсии, прилагаю фото этой камеры листа миллиметровки. Дисторсия видна совершенно не вооруженным глазом.