Invertendo uma grade de índice com valor real
OpenCV'sremap()
usa uma grade de índice com valor real para amostrar uma grade de valores de uma imagem usando interpolação bilinear e retorna a grade de amostras como uma nova imagem.
Para ser mais preciso, deixe:
A = an image
X = a grid of real-valued X coords into the image.
Y = a grid of real-valued Y coords into the image.
B = remap(A, X, Y)
Então, para todas as coordenadas de pixel i, j,
B[i, j] = A(X[i, j], Y[i, j])
Onde a notação de chaves redondasA(x, y)
denota o uso de interpolação bilinear para resolver o valor de pixel da imagem A usando cordas com valor flutuantex
ey
.
Minha pergunta é: dada uma grade de índiceX
, Y
, como posso gerar uma "grade inversa"X^-1
, Y^-1
de tal modo que:
X(X^-1[i, j], Y^-1[i, j]) = i
Y(X^-1[i, j], Y^-1[i, j]) = j
E
X^-1(X[i, j], Y[i, j]) = i
Y^-1(X[i, j], Y[i, j]) = j
Para todas as coordenadas de pixels inteirosi, j
?
FWIW, os mapas de imagem e índice X e Y têm a mesma forma. No entanto, não existe uma estrutura a priori para os mapas de índice X e Y. Por exemplo, eles não são necessariamente transformações afins ou rígidas. Eles podem até ser invertíveis, p. E seX, Y
mapeia vários pixels emA
para a mesma coordenada exata de pixels em B. Estou procurando idéias para um método que encontre um mapa inverso razoável, se houver.
A solução não precisa ser baseada em OpenCV, pois não estou usando o OpenCV, mas outra biblioteca que possui umremap()
implementação. Embora todas as sugestões sejam bem-vindas, estou particularmente interessado em algo "matematicamente correto", ou seja, se meu mapa M for perfeitamente invertível, o método deve encontrar o inverso perfeito, dentro de uma pequena margem de precisão da máquina.