Enregistrement d'image invariant à l'échelle log-polaire DFT

10

J'essaie de faire l'enregistrement d'image en utilisant la corrélation de phase comme décrit dans l'article de Reddy Chatterji . Dans mon cas, les images peuvent être redimensionnées et traduites les unes par rapport aux autres.

L'algorithme pour trouver l'échelle relative, si je comprends bien, est (voir: l'organigramme de l'article ):

F1 = DFT(I1)
F2 = DFT(I2)
H1 = Highpass(F1)
H2 = Highpass(F2)
L1 = LogPolar(Magnitude(H1))
L2 = LogPolar(Magnitude(H2))
PC = PhaseCorrelate(L1,L2)
PM = norm(PC)
R = IDFT(PhaseCorr/PM)
P = Peak(R)
Scale = LogBase^P[1]

L'échelle me donne des valeurs apparemment absurdes (très différentes d'une image à l'autre et jamais correctes).

Mais en ignorant l'échelle, la même approche de corrélation de phase fonctionne bien pour la traduction; et donc je soupçonne que j'ai un problème avec ma transformée log-polaire. Voici un exemple, où j'ai résolu pour la traduction - l'image de gauche est l'original et la droite a été recadrée et traduite - la solution est montrée au-dessus de l'original:

La traduction seule fonctionne

Pour la transformation log-polaire, je me transforme d'abord en espace polaire: où est l'image d'origine, est le le rayon de l'image (demi-largeur) et est le nombre d'échantillons dans la direction . J'échantillonne ensuite à partir de cela pour me transformer en espace polaire logarithmique: où comme décrit en 1 pour qu'il couvre tout l'espace polaire.IrNθθIlog(ρ,θ)=I(logb(ρ),θ)b=(2r)-Nρ

je^(ρ,θ)=je(r+ρcos(2πθNθ),r-ρpéché(2πθNθ))
jerNθθ
je^log(ρ,θ)=je^(Journalb(ρ),θ)
b=(2r)-Nρ

Voici les exemples d'images dans l'espace log-polaire avec (au cas où il y aurait quelque chose de mal):ρ=θ=256

Log Polar

Enfin, cela montre la transformation réelle des images avant l'étape de corrélation de phase (en haut est le filtre passe-haut de magnitude DFT, en bas celui dans l'espace polaire logarithmique):

Journal polaire de DFT

J'utilise OpenCV, qui dispose des méthodes LogPolar et PhaseCorrelate. Bien que PhaseCorrelate, comme mon implémentation manuelle, me donne la bonne réponse pour la traduction, elle est incorrecte à l'échelle. Étant donné que l'utilisation d'OpenCV LogPolar ou de la mienne n'affecte pas l'exactitude, je dois manquer quelque chose.

Toute aide serait appréciée.

Drew Cummins
la source
1
Avez-vous compris ce qui n'allait pas?
Mr.WorshipMe
1
@ Mr.WorshipMe Malheureusement non.
Drew Cummins
@Drew Cummins, je suppose que c'était dû à l'image de test que vous avez utilisée, car il y avait une transition nette de l'arrière-plan. Que diriez-vous d'autres images de test? De plus, à partir de la dernière figure, il y avait des différences apparentes entre les deux grandeurs, il est donc préférable de pré-traiter correctement le fenêtrage avant le DFT.
lxg
Quelques jours avant de trouver ce papier et j'ai essayé d'implémenter l'algorithme sans succès. Je me demandais si vous pouviez partager votre implémentation avec un débutant :)
Alexis España

Réponses:

1

Si vous voulez quelque chose de vraiment robuste, mais qui pourrait être plus coûteux en calcul, vous voudrez peut-être consulter l'algorithme que j'ai implémenté ici . Il met en œuvre le document, "Enregistrement d'image robuste à l'aide de la transformation Log-Polar" ( pdf ). Il présente également l'avantage d'être invariant en rotation, en plus de la translation et de l'échelle invariante. Dans mon application (art), il était capable d'enregistrer même des images d'apparence similaire, pas seulement des versions transformées de la même image.

user2348114
la source
0

Je suppose que cela est dû à des problèmes de mise en œuvre spécifiques. Par exemple, (1) il est préférable d'effectuer le prétraitement de fenêtrage avant la DFT; (2) vous pouvez vérifier la fonction Highpass (), et vous pouvez vous référer à celle dans le papier de Reddy Chatterji Eq. (23) - (24). En outre, la valeur d'échelle est limitée et vous pouvez essayer d'autres valeurs d'échelle.

lxg
la source