Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Еще немного про волновой фронт

Продолжаю свои мучения с "полиномами Жао".
В упор не понимаю, как с ними работать: хорошие значения для коэффициентов Цернике получаются лишь для очень простых векторных полей, аппроксимирующихся полиномами максимум второй степени. При повышении степени получается какой-то фигвам.


Так как "полиномы Жао" состоят из линейной комбинации двух градиентов полиномов Цернике, преобразовывать коэффициенты Жао в коэффициенты Цернике надо хитро.

Для теста я взял простой "волновой фронт" вида
100.*(x-0.3)*y+200.*x*y²+300.*yy⁴
Вычислил градиенты и стал восстанавливать, ограничив предельную степень полиномов Цернике пятеркой.
В среднем отклонение восстановленного изображения от оригинала получилось около 2.5. Однако, при восстановлении нормалей длина отклонений получилась уже около 10.

При восстановлении коэффициентов Цернике получилось вот что. Если пользоваться коэффициентом sqrt((n+3)/(n+1)), получается вот что:
Coefficients for Zernike (sqrt((n+3)/(n+1)):
 i    Z[i]  gradZ[i]  S[i]
 0    63.0     0.0     0.0
 1   -26.6   -26.6   -26.6
 2    27.9    29.0    43.2
 3    36.2    36.2    36.2
 4    57.2    59.6    75.1
 5   -80.2   -85.2  -106.2
 6     0.0     0.0     0.0
 7     0.0     0.0     0.0
 8     8.7    10.1    10.0
 9   -31.2   -31.3   -31.3
10     0.0     0.0     0.0
11     0.0     0.0     0.0
12    17.0    15.5    15.5
13   -21.0   -21.0   -21.0
14    20.9    21.0    21.0
15     0.0     0.0     0.0
16     0.0     0.0     0.0
17     0.0     0.0     0.0
18    -0.3    -0.0    -0.0
19     0.3     0.0     0.0
20     0.2     0.0     0.0

(первый столбец — номер в нотации Нолля, второй — коэффициент Цернике для "волнового фронта", третий — восстановленный из поля нормалей коэффициент, четвертый — соответствующий коэффициент Жао).

Если схитрить и заменить коэффициент у второго слагаемого в формуле для "полинома Жао" на sqrt((n+1)/n), получится красивей:
Coefficients for Zernike (sqrt((n+1)/n):
 i    Z[i]  gradZ[i]  S[i]
 0    63.0     0.0     0.0
 1   -26.6   -26.6   -26.6
 2    27.9    29.0    43.2
 3    36.2    36.2    36.2
 4    57.2    56.1    75.1
 5   -80.2   -80.5  -106.2
 6     0.0     0.0     0.0
 7     0.0     0.0     0.0
 8     8.7    10.1    10.0
 9   -31.2   -31.3   -31.3
10     0.0     0.0     0.0
11     0.0     0.0     0.0
12    17.0    15.5    15.5
13   -21.0   -21.0   -21.0
14    20.9    21.0    21.0
15     0.0     0.0     0.0
16     0.0     0.0     0.0
17     0.0     0.0     0.0
18    -0.3    -0.0    -0.0
19     0.3     0.0     0.0
20     0.2     0.0     0.0

и отклонения восстановленного изображения от оригинала становятся меньше. Но все равно заметны сильные расхождения оригинальных и восстановленных коэффициентов. Да и непонятно, что такое sqrt((n+1)/n).
Надо разбираться дальше.
Tags: волновой фронт, цернике
Subscribe

  • Что-то не выходит с RGB-панелью

    Мне подсказали, что у моей панели P4 используется протокол HUB75E. Нигде не смог найти официальных документов на этот протокол - только всякие…

  • Новый кикад - просто ужас!

    Пока маюсь дурью под Звенигородом, решил было поработать. Но оказалось, что кикад я давно не пересобирал и после последнего обновления системы он не…

  • А что, в С так нельзя?

    Пытаюсь передать в функцию цвет как массив. Функция такая: void Pattern_draw3(Img3 *img, Pattern *p, int xul, int yul, uint8_t colr[3]); И…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments