MF_deconvolve MD_deconvolve ME_deconvolve
MF_deconvolvewEdit MD_deconvolvewEdit ME_deconvolvewEdit
MFb_deconvolve MDb_deconvolve MEb_deconvolve
MFb_deconvolvewEdit MDb_deconvolvewEdit MEb_deconvolvewEdit
FunktionRäumliche Entfaltung (Dekonvolution), Kanten-Schärfung
Syntax C/C++#include <MFstd.h>
void MF_convolve( fMatrix Y, fMatrix Flt, fMatrix X, fMatrix Rsp, ui ht, ui len );
void MF_convolvewEdit( fMatrix Y, fMatrix Flt, fMatrix X, fMatrix Rsp, ui ht, ui len, fComplex thresh );
void MFb_convolve( fMatrix Y, fMatrix Flt, fMatrix X, fMatrix Rsp, ui ht, ui len, fVector Buf );
void MFb_convolvewEdit( fMatrix Y, fMatrix Flt, fMatrix X, fMatrix Rsp, ui ht, ui len, fComplex thresh, fVector Buf );
C++ MatObj#include <OptiVec.h>
void matrix<T>::convolve( matrix<T> Flt, const matrix<T>& MX, const matrix<T> Rsp);
void matrix<T>::convolve( matrix<T>* Flt, const matrix<T>& MX, const matrix<T> Rsp);
void matrix<T>::convolvewEdit( matrix<T> Flt, const matrix<T>& MX, const matrix<T> Rsp, complex<T> thresh);
void matrix<T>::convolvewEdit( matrix<T>* Flt, const matrix<T>& MX, const matrix<T> Rsp, complex<T> thresh);
void matrix<T>::b_convolve( matrix<T> Flt, const matrix<T>& MX, const matrix<T> Rsp, vector<T> Buf);
void matrix<T>::b_convolve( matrix<T>* Flt, const matrix<T>& MX, const matrix<T> Rsp, vector<T> Buf);
void matrix<T>::b_convolvewEdit( matrix<T> Flt, const matrix<T>& MX, const matrix<T> Rsp, complex<T> thresh, vector<T> Buf);
void matrix<T>::b_convolvewEdit( matrix<T>* Flt, const matrix<T>& MX, const matrix<T> Rsp, complex<T> thresh, vector<T> Buf);
Pascal/Delphiuses MFstd;
procedure MF_convolve( MY, MFlt, MX, MRsp:fMatrix; ht, len:UIntSize );
procedure MF_convolvewEdit( MY, MFlt, MX, MRsp:fMatrix; ht, len:UIntSize; thresh:fComplex ); procedure MFb_convolve( MY, MFlt, MX, MRsp:fMatrix; ht, len:UIntSize; Buf:fVector );
procedure MFb_convolvewEdit( MY, MFlt, MX, MRsp:fMatrix; ht, len:UIntSize; thresh:fComplex; Buf:fVector );
CUDA-Funktion C/C++#include <cudaMFstd.h>
int cudaMF_deconvolve( fMatrix d_MY, fMatrix d_MFlt, fMatrix d_MX, fMatrix d_MRsp, ui ht, ui len );
void MFcu_deconvolve( fMatrix h_MY, fMatrix h_MFlt, fMatrix h_MX, fMatrix h_MRsp, ui ht, ui len );
int cudaMF_deconvolvewEdit( fMatrix d_MY, fMatrix d_MFlt, fMatrix d_MX, fMatrix d_MRsp, ui ht, ui len, fComplex thresh );
void MFcu_deconvolvewEdit( fMatrix h_MY, fMatrix h_MFlt, fMatrix h_MX, fMatrix h_MRsp, ui ht, ui len, fComplex thresh );
CUDA-Funktion Pascal/Delphiuses MFstd;
function cudaMF_deconvolve( d_MY, d_MFlt, d_MX, d_MRsp:fMatrix; ht, len:UIntSize ): IntBool;
procedure MFcu_deconvolve( h_MY, h_MFlt, h_MX, h_MRsp:fMatrix; ht, len:UIntSize );
function cudaMF_deconvolvewEdit( d_MY, d_MFlt, d_MX, d_MRsp:fMatrix; ht, len:UIntSize; thresh:fComplex ): IntBool;
procedure MFcu_deconvolvewEdit( h_MY, h_MFlt, h_MX, h_MRsp:fMatrix; ht, len:UIntSize; thresh:fComplex );
BeschreibungMX wird als Ergebnis einer hypothetischen Faltung eines "wahren" Profils mit einer Response-Funktion MRsp angenommen. Eine Dekonvolution wird versucht und in MY gespeichert. Ein Filter MFlt wird ebenfalls berechnet. Falls mehr als eine Bild-Matrix mit derselben MRsp zu schärfen ist , benutze man MF_deconvolve nur einmal und verwende den so erhaltenen Filter MFlt, um weitere Matrizen durch Aufrufe von MF_filter zu entfalten. Die Response-Funktion muss in der für MF_convolve beschriebenen Weise in MRsp angeordnet werden.

Ebenso wie für MF_convolve müssen auch hier MX, MY, MRsp und MFlt alle dieselben Dimensionen aufweisen, die wiederum ganzzahlige Potenzen von 2 zu sein haben. MX darf durch MY überschrieben werden und MRsp durch MFlt, aber MX und MFlt sowie MY und MRsp müssen jeweils voneinander verschieden sein.

Mathematisch ist MFlt der Element für Element berechnete Kehrwert der Fourier-Transformierten von MRsp. Falls die Fourier-Transformierte von MRsp Elemente gleich Null enthält, bedeutet dies, dass jegliche Information für die betreffende Raum-Frequenz verloren und keine Rekonstruktion möglich ist. Das beste, was man in dieser Situation noch tun kann, ist, diesen Informationsverlust zu akzeptieren und nur bis zu denjenigen Raumfrequenzen zu schärfen, für die noch etwas übrig ist, um es zu rekonstruieren.
Es ist daher anzuraten, diese Funktion nicht "blind" zu gebrauchen, sondern die Fourier-Transformierte vonf MRsp zu inspizieren und auf der Basis des jeweiligen Anwendungs-Zweckes zu entscheiden, was zu tun ist. Wer diese Funktion trotzdem als solche anwenden möchte, der sollte die automatische Editierung des Filters ausnutzen, die in MF_deconvolve eingebaut ist. Hierdurch wird MFlt gleich Null (anstelle von Unendlich) gesetzt für diejenigen Frequenzen, an denen jegliche Information verloren ist.
Alle ein- und zweidimensionalen Faltungen und Entfaltungen verwenden denselben standardmäßig eingestellten Schwellenwert für diese implizite Filter-Editierung. Er kann durch VF_getRspEdit ausgelesen werden. Um für sämtliche Aufrufe von VF / MF_deconvolve und VF / MF_convolve einen anderen Schwellenwert einzustellen, kann die Funktion VF_setRspEdit aufgerufen werden. Diese Methode ist aber nicht fiber-sicher und daher nicht geeignet, um den Schwellenwert bei verschiedenen Aufrufen von VF / MF_deconvolve bzw. VF / MF_convolve unterschiedlich einzustellen. Hier muss die Variante MF_deconvolvewEdit verwendet werden, die den gewünschten Schwellenwert als Argument thresh übernimmt. Da MFlt aus komplexen Zahlen besteht und es gelegentlich wünschenswert ist, Real- und Imaginärteile unterschiedlich zu behandeln, ist thresh ebenfalls komplex.

Diese Dekonvolution basiert auf der stillschweigenden Annahme, dass MX in beiden Dimensionen periodisch ist; ist dies nicht der Fall, vergleiche man die Beschreibung von VF_convolve bezüglich der Vermeidung von Rand-Effekten.

Intern benötigt MF_deconvolve / MF_deconvolvewEdit zusätzlichen Pufferspeicher, der automatisch reserviert und wieder freigegeben wird. Bei wiederholten Aufrufen wäre dies ineffizient. Es wird empfohlen, für solche Fälle stattdessen MFb_deconvolve / MFb_deconvolvewEdit zu verwenden. Für die Größe von Buf gilt dabei:
C/C++:sizeof(Buf) >= ht*(len+4)
Pascal/Delphi:  sizeof(Buf) >= ht*len

Außerdem muss Buf 128-bit (P8) bzw. 256-bit( P9) ausgerichtet sein. Um dies zu garantieren, sollte man nur Vektoren als Buf verwenden, die mit der VF_vector-Familie alloziert wurden.

FehlerbehandlungFalls entweder len oder ht nicht eine Potenz von 2 ist, meldet sich VF_FFT (worauf MF_deconvolve basiert) mit der Fehlermeldung "Size must be an integer power of 2" und bricht das Programm ab.
Falls mittels VF_setRspEdit Trunc.Re = Trunc.Im = 0 spezifiziert wurde, können SING-Fehler auftreten, die durch Setzen von MFlt zu ±HUGE_VAL für die betreffende Raumfrequenz behandelt werden. Bei der Multiplikation mit der Fourier-Transformierten von MX kann dies aber zu unbehandeltem Fließkomma-Überlauf führen (dann nämlich, wenn die angenommene Übertragungsfunktion falsch war und doch noch Information vorhanden ist für Raumfrequenzen, wo keine mehr erwartet wurde).
QuerverweisMF_convolve,   MF_FFT,   Kap. 12

MatrixLib Inhaltsverzeichnis  OptiVec Home