Utilisation du filtre inverse pour corriger une image à convolution spatiale (déconvolution)

8

Dans le cadre d'un devoir, nous implémentons le filtre inverse. Dégrade une image puis récupère avec un filtre inverse.

Je convolue l'image dans le domaine spatial avec un filtre box 5x5. Je FFT le filtre, FFT l'image dégradée, puis divise l'image dégradée par le filtre. Inverse FFT le résultat dans une image et je reçois des ordures.

Si je FFT l'image, FFT le filtre, multipliez les deux, divisez ce résultat par le filtre FFT, évidemment je me rapproche beaucoup de l'image d'origine. ((X * Y) / Y ~ == X)

J'ai une idée que les maths ne sont pas aussi simples que "multiplication spatialement convoquée == FFT".

Quelle est la bonne façon d'utiliser le filtre inverse? J'ai le noyau exact utilisé dégrader l'image. Je n'ajoute aucun bruit.

Le manuel de Bovik, The Essential Guide to Image Processing, rejette presque complètement le filtre inverse. Gonzalez & Woods est un peu plus optimiste mais passe presque immédiatement au filtre Wiener.

J'ai une question similaire sur stackoverflow.com /programming/7930803/inverse-filter-of-spatially-convolved-versus-frequency-convolved-image

(Ces questions devraient également être étiquetées [devoirs] mais la balise n'existe pas encore et je n'ai pas le représentant pour la créer.)

ÉDITER. Pour quelques-unes des excellentes suggestions ci-dessous. @ dipan-mehta Avant de faire un FFT, je remplis le noyau de convolution à la même taille que l'image. Je mets le noyau en haut à gauche. Je ifft (ifftshift ()) puis enregistre sur une image et j'obtiens un bon résultat. J'ai fait l'ifft (ifftshift ()) sur le noyau et l'image. Bons résultats (ish). (Les images sont dans ma /programming/7930803/inverse-filter-of-spatially-convolved-versus-frequency-convolved-image question.)

@ jason-r est probablement correct. Je ne comprends pas les mathématiques de la convolution + transformation sous-jacente. "Déconvolution" était un nouveau mot pour moi. J'ai encore beaucoup à apprendre. Merci pour l'aide!

Ma solution pour le devoir est de tout faire dans le domaine fréquentiel. J'ai parlé avec le professeur. Je rendais la tâche plus difficile que nécessaire. Elle voulait que nous ajoutions du bruit, puis essayions le filtre inverse, le filtre de Wiener et le filtre des moindres carrés contraints. Le but de l'exercice était de voir comment les filtres géraient le bruit.

David Poole
la source
1
Remplissez-vous le filtre avec des zéros pour lui donner la même taille que l'image avant de prendre sa FFT? Faites-vous correctement la division complexe?
Dima
Ouaip, rembourré le filtre avec des zéros, noyau en haut à gauche. Tout mon code Python / numpy se trouve sur le lien stackoverflow.com susmentionné. La division complexe est probablement mon problème.
David Poole

Réponses:

8

Il y a quelques sous-questions que j'aborderai séparément:

  • La convolution dans le domaine spatial (ou de manière correspondante dans le domaine temporel pour les signaux échantillonnés dans le temps) équivaut à une multiplication dans le domaine fréquentiel. Dans les systèmes échantillonnés, il existe certaines subtilités dans les cas limites (c.-à-d. Lors de l'utilisation de la DFT, la multiplication dans le domaine fréquentiel vous donne en fait une convolution circulaire, pas une convolution linéaire), mais en général, c'est vraiment aussi simple que cela.

  • Le filtrage inverse pur n'est presque jamais la bonne solution dans la pratique. Dans la plupart des cas, vous n'avez pas accès au filtre exact qui a été appliqué à vos données, vous ne pouvez donc pas simplement l'inverser de toute façon. Même si vous connaissez le filtre, il reste problématique. Considérez le fait que le filtre peut avoir des zéros à certaines fréquences spatiales; si c'est le cas, après avoir appliqué le filtre à votre image, toutes les informations à ces fréquences sont perdues. Si vous inversez naïvement ce filtre, il aura un gain infini (ou au moins très élevé) à ces valeurs nulles. Si vous appliquez ensuite l'inverse naïf à une image qui a un contenu additif à ces fréquences (par exemple du bruit, ce qui est probablement le cas), alors cette composante non souhaitée sera considérablement amplifiée. Ce n'est généralement pas souhaitable.

    Ce problème de filtrage inverse est très similaire à l'égalisation dans les systèmes de communication, où ce phénomène est appelé amélioration du bruit . Dans ce contexte, l'approche à filtre inverse est appelée égaliseur à forçage nul , qui est rarement réellement utilisé.

  • La zone que vous explorez est plus généralement connue sous le nom de déconvolution . En règle générale, la déconvolution est une opération délicate. Même si vous connaissez le filtre exact qui a été appliqué et que vous souhaitez l'annuler, ce n'est pas toujours aussi simple. Comme vous l'avez noté, l'approche du filtre inverse est généralement écartée en faveur d'un filtre de Wiener ou d'une autre structure qui vise à ne pas inverser exactement le système, mais à estimer plutôt ce que l'entrée dans le système était tout en minimisant certains critères d'erreur (minimisation de la moyenne -l'erreur quadratique est un objectif commun). Comme vous pouvez vous y attendre, l'application d'un filtre de Wiener à ce problème est appelée déconvolution de Wiener .

Jason R
la source
"Déconvolution" était un nouveau mot pour moi. J'ai encore beaucoup à apprendre. Merci!
David Poole
@JasonR n'aurions-nous pas à connaître une séquence de «formateur» dans l'image pour la déconvolution de Wiener afin que le critère MMSE soit minimisé par rapport à quelque chose qui est connu pour être vrai?
Spacey
1
En général, vous devez connaître la densité spectrale de puissance du signal et la fonction de transfert qui a été appliquée au signal pour concevoir le filtre de Wiener. Cependant, dans le cas probable où vous ne connaissez pas toutes ces informations, vous pouvez faire des suppositions éclairées qui produisent une structure fonctionnelle plus robuste que le filtre inverse. Voir cette section sur la page Wikipedia pour une discussion.
Jason R
3

J'espère que vous ne vous êtes pas trompé dans la manière de calculer -

Je convolue l'image dans le domaine spatial avec un filtre box 5x5. Je FFT le filtre, FFT l'image dégradée, puis divise l'image dégradée par le filtre. Inverse FFT le résultat dans une image et je reçois des ordures.

Supposons que votre image mesure 256 x 256 et que le filtre soit 5 x 5 - pour appliquer le filtrage en multipliant les FFT, vous devez d'abord convertir le filtre en taille équivalente. Pour cela, vous devez conserver le filtre 5x5 dans le "coin supérieur" (pas le centre de l'image) et le remplir avec des zéros pour remplir 256x256 - vous devriez obtenir une FFT de 256x256 pour le filtre.

Pour aider à diagnostiquer, à l'étape de programmation # 1 - il suffit de prendre 256x256 FFT de filtre seul et de vérifier si la routine IFFT - est capable de vous rendre le filtre. Testez de la même façon si FFT -> IFFT de l'image elle-même fonctionne correctement en arrière.

Étape # 2 - si vous appliquez uniquement un filtre (et pas de filtre inverse) dans le domaine FFT en multipliant - vérifiez l'image résultante une fois que l'IFFT est correct. Il doit s'agir d'une image essentiellement floue.

Si toute votre programmation est correcte - veuillez vous assurer que lorsque vous effectuez 1 / x pour le coefficient FFT, il n'y a pas de division par erreur zéro, et inversement quand il y a trop de pics, les multiplications entraînent de fortes distorsions.

En général - pour tout filtre stable , le filtre inverse par définition instable - cela pourrait être la raison principale. Cependant, je voudrais toujours recouper l'implémentation avant d'explorer les limites théoriques.

Si c'est bien fait, j'ai vu que la multiplication en FFT est une convolution dans l'espace d'échantillonnage aussi bien pour les images que pour les signaux audio.

Dipan.

Dipan Mehta
la source