Градиенты полиномов Цернике, продолжение.
May. 31st, 2013 12:20 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вчера мне было не до них: писал учебные программы на пару курсов для аспирантов.
Сегодня более-менее (скорее, "менее") разобрался.
Итак, перепробовав различные варианты компоновки "полиномов Жао", я остановился на таком (чтобы не париться с вставкой картинок, делаю прямую ссылку на codecogs):

Аналогично разложению волнового фронта по полиномам Цернике, при разложении градиента волнового фронта по "полиномам Жао" используется умножение на нормирующий коэффициент:
^{-1})
В результате разложения градиента волнового фронта по "полиномам Жао", получаем коэффициенты aj, а потом вычисляем коэффициенты при полиномах Цернике:
}%20-%20\sqrt\frac{n+3}{n+1}\,a_{j%27(n%27=n-2,%20m%27=m)}.)
Для экспериментов я решил построить "волновой фронт" не по наобум взятым полиномам N-й степени, а получить его как композицию полиномов Цернике с наобум взятыми коэффициентами. Градиент же вычислялся как разделенная разность соседей данного пикселя (похоже, именно это и было причиной плохих результатов для восстановления фронта по полю градиентов).
Сразу же выяснилось, что при использовании всего фронта ошибка восстановления его по градиенту обратно пропорциональна корню четвертой степени из количества опорных точек. При использовании же части фронта ошибка тем больше, чем меньше размер используемого куска. Если использовать половину поля (полоса размером 1x0.5 поля вокруг центра), то результаты получаются совершенно дурацкие.
Еще выяснилась такая особенность: т.к. "полиномы Жао" используют градиенты с разницей в 2 порядка, для корректного восстановления волнового фронта необходимо брать степень "полиномов Жао" на 2 больше, чем результирующая степень полиномов Цернике.
Ниже приведу немного результатов. Столбцы данных имеют такие обозначения: j - индекс Нолля, n,m - индексы Цернике, Z[i] - коэффициент Цернике после декомпозиции "волнового фронта", gradZ[i] - коэффициент Цернике после декомпозиции градиента "волнового фронта" по "полиномам Жао", S[i] - коэффициент Жао, Zori[i] - исходные коэффициенты Цернике, по которым и строился "фронт".
Поле 111х111, максимальная степень — 6:
При повышении максимальной степени до N результаты при степенях 0..4 не меняются, результаты в степенях 5..N-2 становятся ближе к нулю (как и должно быть). Как я уже говорил выше, степень "полиномов Жао" должна быть на 2 больше степени полиномов Цернике, поэтому дальше я не буду приводить коэффициенты при степенях 5 и 6.
256x256:
получились практически идеальные результаты!
Однако, когда мы спускаемся к реалиям, получаем приличную ошибку. Вот, например, что будет если использовать "всего лишь" 1024 точки (32х32):
А если их будет лишь 256 (16х16), точность будет еще ниже:
Следующим шагом экспериментов будет построение поля градиентов к "волновому фронту" в точках, распределенных аналогично точках на диафрагме Гартманна БТА, и попытка восстановления "фронта". Посмотрим, что получится.
Сегодня более-менее (скорее, "менее") разобрался.
Итак, перепробовав различные варианты компоновки "полиномов Жао", я остановился на таком (чтобы не париться с вставкой картинок, делаю прямую ссылку на codecogs):
Аналогично разложению волнового фронта по полиномам Цернике, при разложении градиента волнового фронта по "полиномам Жао" используется умножение на нормирующий коэффициент:
В результате разложения градиента волнового фронта по "полиномам Жао", получаем коэффициенты aj, а потом вычисляем коэффициенты при полиномах Цернике:
Для экспериментов я решил построить "волновой фронт" не по наобум взятым полиномам N-й степени, а получить его как композицию полиномов Цернике с наобум взятыми коэффициентами. Градиент же вычислялся как разделенная разность соседей данного пикселя (похоже, именно это и было причиной плохих результатов для восстановления фронта по полю градиентов).
Сразу же выяснилось, что при использовании всего фронта ошибка восстановления его по градиенту обратно пропорциональна корню четвертой степени из количества опорных точек. При использовании же части фронта ошибка тем больше, чем меньше размер используемого куска. Если использовать половину поля (полоса размером 1x0.5 поля вокруг центра), то результаты получаются совершенно дурацкие.
Еще выяснилась такая особенность: т.к. "полиномы Жао" используют градиенты с разницей в 2 порядка, для корректного восстановления волнового фронта необходимо брать степень "полиномов Жао" на 2 больше, чем результирующая степень полиномов Цернике.
Ниже приведу немного результатов. Столбцы данных имеют такие обозначения: j - индекс Нолля, n,m - индексы Цернике, Z[i] - коэффициент Цернике после декомпозиции "волнового фронта", gradZ[i] - коэффициент Цернике после декомпозиции градиента "волнового фронта" по "полиномам Жао", S[i] - коэффициент Жао, Zori[i] - исходные коэффициенты Цернике, по которым и строился "фронт".
Поле 111х111, максимальная степень — 6:
i n m Z[i] gradZ[i] S[i] Zori[i] 0 0 0 -0.0 0.0 0.0 0.0 1 1 -1 1.1 1.0 4.2 1.1 2 1 1 -0.8 -0.8 -0.4 -0.8 3 2 -2 5.5 5.4 2.7 5.5 4 2 0 -3.3 -3.3 0.4 -3.2 5 2 2 -0.0 -0.1 0.8 0.0 6 3 -3 6.8 6.6 3.3 6.8 7 3 -1 5.5 5.3 2.3 5.5 8 3 1 0.0 0.0 0.3 0.0 9 3 3 0.0 0.0 -0.0 0.0 10 4 -4 0.0 0.0 0.0 0.0 11 4 -2 0.0 -0.1 -2.1 0.0 12 4 0 3.2 3.2 2.9 3.3 13 4 2 1.4 1.3 0.7 1.4 14 4 4 8.0 7.7 3.9 8.0 15 5 -5 -0.0 0.0 0.0 16 5 -3 0.0 -2.7 -2.7 17 5 -1 -0.0 -2.5 -2.5 18 5 1 0.0 0.2 0.2 19 5 3 0.0 -0.0 -0.0 20 5 5 0.0 -0.0 -0.0 21 6 -6 0.0 0.0 0.0 22 6 -4 0.0 0.0 0.0 23 6 -2 0.0 -1.6 -1.6 24 6 0 -0.0 -0.3 -0.3 25 6 2 -0.0 -0.5 -0.5 26 6 4 -0.0 -3.2 -3.2 27 6 6 -0.0 0.0 0.0
При повышении максимальной степени до N результаты при степенях 0..4 не меняются, результаты в степенях 5..N-2 становятся ближе к нулю (как и должно быть). Как я уже говорил выше, степень "полиномов Жао" должна быть на 2 больше степени полиномов Цернике, поэтому дальше я не буду приводить коэффициенты при степенях 5 и 6.
256x256:
i n m Z[i] gradZ[i] S[i] Zori[i] 0 0 0 -0.0 0.0 0.0 0.0 1 1 -1 1.1 1.1 4.4 1.1 2 1 1 -0.8 -0.8 -0.4 -0.8 3 2 -2 5.5 5.5 2.7 5.5 4 2 0 -3.2 -3.2 0.4 -3.2 5 2 2 -0.0 -0.0 0.9 0.0 6 3 -3 6.8 6.7 3.4 6.8 7 3 -1 5.5 5.4 2.3 5.5 8 3 1 0.0 0.0 0.3 0.0 9 3 3 0.0 0.0 0.0 0.0 10 4 -4 0.0 0.0 0.0 0.0 11 4 -2 0.0 -0.1 -2.1 0.0 12 4 0 3.3 3.2 2.9 3.3 13 4 2 1.4 1.4 0.7 1.4 14 4 4 8.0 7.9 3.9 8.0
получились практически идеальные результаты!
Однако, когда мы спускаемся к реалиям, получаем приличную ошибку. Вот, например, что будет если использовать "всего лишь" 1024 точки (32х32):
i n m Z[i] gradZ[i] S[i] Zori[i] 0 0 0 -0.2 0.0 0.0 0.0 1 1 -1 1.0 0.5 3.6 1.1 2 1 1 -0.8 -0.8 -0.4 -0.8 3 2 -2 5.5 5.1 2.6 5.5 4 2 0 -3.8 -3.8 -0.3 -3.2 5 2 2 -0.2 -0.3 0.5 0.0 6 3 -3 7.0 6.4 3.2 6.8 7 3 -1 5.5 4.9 2.2 5.5 8 3 1 0.0 0.1 0.3 0.0 9 3 3 0.0 0.0 0.0 0.0 10 4 -4 0.0 0.0 0.0 0.0 11 4 -2 0.0 -0.5 -2.0 0.0 12 4 0 2.8 2.8 2.7 3.3 13 4 2 1.4 1.2 0.7 1.4 14 4 4 7.9 6.9 3.5 8.0
А если их будет лишь 256 (16х16), точность будет еще ниже:
i n m Z[i] gradZ[i] S[i] Zori[i] 0 0 0 -0.9 0.0 0.0 0.0 1 1 -1 1.4 0.5 3.1 1.1 2 1 1 -0.8 -0.7 -0.4 -0.8 3 2 -2 5.5 4.7 2.5 5.5 4 2 0 -5.0 -4.2 -0.9 -3.2 5 2 2 -0.3 -0.6 0.2 0.0 6 3 -3 7.5 6.1 3.1 6.8 7 3 -1 5.4 4.2 1.8 5.5 8 3 1 0.0 0.1 0.2 0.0 9 3 3 0.0 0.0 0.0 0.0 10 4 -4 0.0 0.0 0.0 0.0 11 4 -2 0.0 -0.8 -1.8 0.0 12 4 0 1.4 2.1 2.5 3.3 13 4 2 1.3 1.0 0.6 1.4 14 4 4 7.0 5.5 3.0 8.0
Следующим шагом экспериментов будет построение поля градиентов к "волновому фронту" в точках, распределенных аналогично точках на диафрагме Гартманна БТА, и попытка восстановления "фронта". Посмотрим, что получится.