Approches
Il existe de nombreuses méthodes de déconvolution (à savoir, l'opérateur de dégradation est linéaire et invariant temps / espace).
Tous essaient de faire face au fait que le problème est empoisonné dans de nombreux cas.
Les meilleures méthodes sont celles qui ajoutent une certaine régularisation au modèle des données à restaurer.
Il peut s'agir de modèles statistiques (Prieurs) ou de toute connaissance.
Pour les images, un bon modèle est le lissage par morceaux ou la rareté des dégradés.
Mais pour la réponse, une approche paramétrique simple sera adoptée - Minimiser l'erreur des moindres carrés entre les données restaurées dans le modèle et les mesures.
Modèle
Le modèle des moindres carrés est simple.
La fonction objectif en fonction des données est donnée par:
F( x ) = 12∥ h ∗ x - y∥22
Le problème d'optimisation est donné par:
argminXF( x ) = argminX12∥ h ∗ x - y∥22
Xhy
x ∈ Rnh ∈ Rky∈Rmm = n - k + 1
Il s'agit d'une opération linéaire dans un espace fini et peut donc être écrite à l'aide d'une forme matricielle:
argminXF( x ) = argminX12∥ Hx - y∥22
H∈ Rm × n
Solution
La solution des moindres carrés est donnée par:
X^= ( HTH)- 1HTy
HTHcond(H) = cond( HTH)----------√
Analyse du numéro de condition
Qu'est-ce qui se cache derrière ce numéro de condition?
On pourrait y répondre en utilisant l'algèbre linéaire.
Mais une approche plus intuitive, à mon avis, serait d'y penser dans le domaine fréquentiel.
Fondamentalement, l'opérateur de dégradation atténue l'énergie, généralement à haute fréquence.
Maintenant, comme en fréquence il s'agit fondamentalement d'une multiplication par élément, on dirait que la manière simple de l'inverser est la division par élément par le filtre inverse.
Eh bien, c'est ce qui est fait ci-dessus.
Le problème se pose avec les cas où le filtre atténue l'énergie pratiquement à zéro. Ensuite, nous avons de vrais problèmes ...
C'est essentiellement ce que le numéro de condition nous dit, à quel point certaines fréquences ont été atténuées par rapport à d'autres.
Au-dessus, on pouvait voir le numéro de condition (en utilisant des unités [dB]) en fonction du paramètre STD du filtre gaussien.
Comme prévu, plus le STD est élevé, plus le nombre de conditions est mauvais, car un STD plus élevé signifie un LPF plus fort (les valeurs qui diminuent à la fin sont des problèmes numériques).
Solution numérique
Ensemble de Gaussian Blur Kernel a été créé.
n = 300k = 31m = 270
Dans MATLAB, le système linéaire a été résolu en utilisant pinv()
Pseudo Inverse basé sur SVD et l' \
opérateur.
Comme on peut le voir, en utilisant le SVD, la solution est beaucoup moins sensible que prévu.
Pourquoi y a-t-il une erreur?
Recherche d'une solution (pour la MST la plus élevée):
Comme on pouvait le voir, le signal est très bien restitué, sauf pour le début et la fin.
Cela est dû à l'utilisation de la convolution valide qui nous en dit peu sur ces échantillons.
Bruit
Si nous ajoutions du bruit, les choses auraient un aspect différent!
La raison pour laquelle les résultats étaient bons auparavant est due au fait que MATLAB pouvait gérer le DR des données et résoudre les équations même si leur nombre de conditions était élevé.
Mais un grand nombre de conditions signifie que le filtre inverse amplifie fortement (pour inverser la forte atténuation) certaines fréquences.
Lorsque ceux-ci contiennent du bruit, cela signifie que le bruit sera amplifié et que la restauration sera mauvaise.
Comme on pouvait le voir ci-dessus, maintenant la reconstruction ne fonctionnera pas.
Sommaire
Si l'on connaît exactement l'opérateur de dégradation et que le SNR est très bon, des méthodes de déconvolution simples fonctionneront.
Le problème principal de la déconvolution est de savoir à quel point l'opérateur de dégradation atténue les fréquences.
Plus il s'atténue, plus le SNR est nécessaire pour restaurer (c'est essentiellement l'idée derrière Wiener Filter ).
Les fréquences qui ont été mises à zéro ne peuvent pas être restaurées!
En pratique, pour avoir des résultats stables, il faut ajouter quelques priors.
Le code est disponible sur mon référentiel de traitement de signaux StackExchange Q2969 GitHub .