Me cuesta entender el modelo de distorsión de OpenCV . Utilizan coeficientes "radiales" $k_n$ y coeficientes "tangenciales $p_n$ entre otros que no me interesan.
$$ x' = x (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2 p_1 x y + p_2(r^2 + 2 x^2) \\ y' = y (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + p_1 (r^2 + 2 y^2) + 2 p_2 x y $$
Para entenderlo, he separado los dos términos en lo que $\Delta$ compensación que producen, así es como se ve para $x$ :
$$ \begin{array}{rlcccc} x' &= x &+ &\underbrace{x(k_1 r^2 + k_2 r^4 + k_3 r^6)} &+ &\underbrace{2 p_1 x y + p_2(r^2 + 2 x^2)}\\ &= x &+ &\Delta x_{radial} &+ &\Delta x_{tangential} \end{array} $$
A continuación, he representado esos valores como un campo vectorial con octave (similar a Matlab).
Distorsión radial
function radialDistortion (k1, k2, k3)
max = 10;
[x, y] = meshgrid(-max:.5:max);
r2 = x.**2 + y.**2;
k = k1*r2 .+ k2*r2.**2 .+ k3*r2.**3;
quiver(x, y, x.*k, y.*k, 0);
axis("square");
endfunction
Llamada con
radialDistortion(0.0002, 0, 0)
produce lo siguiente
Lo entiendo, esto es radial al eje óptico, siendo así punto simétrico al centro (donde está el eje óptico). Esto no era demasiado difícil.
Distorsión tangencial
function tangentialDistortion (p1, p2)
max = 10;
[x, y] = meshgrid(-max:.5:max);
r = x.**2 + y.**2;
xy = x.*y*2;
quiver(x, y, xy*p1 + (r+2*x.**2)*p2, xy*p2 + (r+2*y.**2)*p1, 0);
axis("square");
endfunction
Llamada con
tangentialDistortion(-.0007, .0007)
produce esto
¿Cómo es esto "tangencial" a nada? A mí me parece que está corrigiendo una lente inclinada (girada alrededor de la diagonal de abajo a la izquierda y de arriba a la derecha), lo que concuerda con la razón de esta distorsión que se da en la bibliografía: desalineación de la lente.
¿Significa eso que es tangencial a la superficie de la lente?
Al final, se trata de algún modelo matemático que describe algún fenómeno óptico para corregirlo. Pero me gustaría entender por qué se llama "tangencial".
Si la posición de P' también se desplaza tangencialmente con respecto a CP (a lo largo de la tangente al círculo de radio CP), se dice que la distorsión es tangencial.
No, no lo es. He modificado la función anterior para mostrar el desplazamiento "tangencial" de los puntos que están en un círculo.
function tangentialDistortionOnCircle (p1, p2)
radius = 10;
x = radius * cos(0:2*pi/20:2*pi);
y = radius * sin(0:2*pi/20:2*pi);
r = x.**2 + y.**2;
xy = x.*y*2;
quiver(x, y, xy*p1 + (r+2*x.**2)*p2, xy*p2 + (r+2*y.**2)*p1, 0);
axis([-radius-5 radius+5 -radius-5 radius+5 ], "square");
endfunction
Llamada con estos parámetros:
tangentialDistortionOnCircle(.007, .007)
da este resultado
Esto no me parece en absoluto un desplazamiento tangencial. Si lo fuera, parecería un remolino alrededor del centro. Pero ese no es el caso.