Estou tentando calcular momentos Zernike de ordem superior (por exemplo m=0
, n=46
) para alguma imagem. No entanto, estou com um problema em relação ao polinômio radial (consulte a Wikipedia ). Este é um polinômio definido no intervalo [0 1]. Veja o código MATLAB abaixo
function R = radial_polynomial(m,n,RHO)
R = 0;
for k = 0:((n-m)/2)
R = R + (-1).^k.*factorial(n-k) ...
./ ( factorial(k).*factorial((n+m)./2-k) .* factorial((n-m)./2-k) ) ...
.*RHO.^(n-2.*k);
end
end
No entanto, isso obviamente tem problemas numéricos próximos RHO > 0.9
.
Eu tentei refatorá-lo para polyval
pensar que poderia ter alguns algoritmos melhores nos bastidores, mas isso não resolveu nada. Convertê-lo em um cálculo simbólico criou o gráfico desejado, mas foi incrivelmente lento mesmo para um gráfico simples como o mostrado.
Existe uma maneira numericamente estável de avaliar esses polinômios de alta ordem?