FUNCTION IMAGE_FILTER, array, delta, $ FILTER=typ, $ LOWPASS=low, HIGHPASS=high, BANDPASS=band, $ CUTOFF=f_cut, CENTER=f_cent, WIDTH=f_width, $ ORDER =Order ;=============================================================================== ; (c) 1991 - khd c/o FU BERLIN. A l l r i g h t s r e s e r v e d. || ; ** No part of this software package may be reproduced, transmitted, || ; 1992 transcribed, stored in a retrieval system, or translated into || ; any form by any means without the w r i t t e n permission of || ; Karl-Heinz Dittberner-FU BERLIN, Arnimallee 22, D-1000 Berlin 33 || ;=============================================================================== ; PRO:IMAGE_FILTER.PRO K.-H. Dittberner - 9.MRZ.1991 ; V 01.3 P 476/32 - 6.AUG.1992 ; ; IDL(V2.1)-Routine: Filtern eines 2D-Datenfeldes (Bild) mittels FFT-Technik ; im Frequenzbereich. ; ; HINWEISE: Die Signaldaten muessen geeignet tiefpassbegrenzt sein! ; Das gefilterte Bild wird z.Zt. in einem komplexen Feld ; (an das HP) uebergeben. ; ; KEYWORDS: ; ; /BANDPASS = Bandpass-Filter. ; CENTER = Mittenfrequenz beim Bandpass-Filter. ; CUTOFF = Grenzfrequenz des Filters. ; FILTER = Typ des Filters; z.Zt. sind implementiert: ; o "IDEAL": Ideales Filter (Default). ; o "BUTTER": Butterworth-Filter; ORDER=... angeben. ; o "EXP": Exponential-Filter; ORDER=... angeben. ; /HIGHPASS = Hochpass-Filter. ; /LOWPASS = Tiefpass-Filter (Default). ; ORDER = Ordnungsgrad beim Butterworth- und Exponential-Filter. ; WIDTH = Bandbreite beim Bandpass-Filter. ;=============================================================================== ; Quelle: Do-it-yourself! Merkposten: o On_Error,2 aktivieren. ; C91 * o ; o Return Complex od. Byte ? ; Aufruf: image=Image_Filter(im,d,...) o delta => Einheiten ? ; o Mit weiteren Bildern testen. ; o ;=============================================================================== ; Aenderungen: [19/3/91-khd] => V 01.1: (Copy => SEIDLER) ; - Die Experimentierfassung ist fertig. ; [5/8/92-khd] => V 01.2: (Copy => SEIDLER) ; - Auf IDL V 2.1 umgestellt. ; - Defaults ergaenzt. ; - Vorerst On_Error,2 aktiviert. ; [6/8/92-khd] => V 01.3: ; - Die F-Matrix nach dem Erzeugen ueber dem Bild zentriert. ; - Zusaetzlich ein Exponential-Filter implementiert. ;=============================================================================== ; 1. Prolog, Variablen und Konstanten: ;=============================================================================== ; On_Error, 2 ; Return => Ruf. Programm. dim = Size(array) If (dim(0) ne 2) $ then Message, "Das Datenfeld muss 2-dimensional sein." nx = dim(1) ny = dim(2) filt = FltArr(nx,ny) ; Feld fuer das Filter. ; ;=============================================================================== ; 2. Behandlung der Keywords (Default-Werte): ;=============================================================================== ; If Not Keyword_Set(typ) then filterTyp = "IDEAL" $ else filterTyp = StrUpcase(typ) If Not Keyword_Set(low) and $ Not Keyword_Set(high) and $ Not Keyword_Set(band) then filterArt = "LOW" If Keyword_Set(low) then filterArt = "LOW" If Keyword_Set(high) then filterArt = "HIGH" If Keyword_Set(band) then filterArt = "BAND" If ((filterArt eq "LOW") or (filterArt eq "HIGH")) and $ Not Keyword_Set(f_cut) $ then Message, "Angabe der Grenzfrequenz mit CUTOFF=... fehlt." If (filterArt eq "BAND") and Not Keyword_Set(f_cent) $ then Message, "Angabe der Mittenfrequenz mit CENTER=... fehlt." If (filterArt eq "BAND") and Not Keyword_Set(f_width) $ then Message, "Angabe der Bandbreite mit WIDTH=... fehlt." If ((filterTyp eq "BUTTER") or (filterTyp eq "EXP")) and $ Not Keyword_Set(Order) then Order=2 Message," Filter-Typ: " + filterTyp + " Filter-Art: " + filterArt,/Continue ; ;=============================================================================== ; 3. Erzeugen der Filter im Frequenzbereich: ;=============================================================================== ; If (nx ge ny) then n=nx else n=ny ; Frequenz-Matrix erzeugen. f_mat = F_Matrix(n) f_mat = f_mat( (n-nx)/2:(n+nx)/2-1, (n-ny)/2:(n+ny)/2-1 ) ; Zentrieren ueber ; dem Bild. ;_______________________________________________________________________________ Case filterArt Of "LOW": Begin Case filterTyp Of "IDEAL": filt = f_mat lt f_cut "BUTTER": filt = 1./(1. + (f_mat/f_cut)^(2*Order)) "EXP": filt = Exp( -(f_mat/f_cut)^Order) Else: Message, "Filter " + filterTyp + " ist nicht definiert." EndCase End "HIGH": Begin Case filterTyp Of "IDEAL": filt = f_mat gt f_cut "BUTTER": filt = 1./(1. + (f_cut/f_mat)^(2*Order)) "EXP": filt = Exp( -(f_cut/f_mat)^Order) Else: Message, "Filter " + filterTyp + " ist nicht definiert." EndCase End "BAND": Begin Case filterTyp Of "IDEAL": Begin f_cut_low = f_cent - f_width/2. f_cut_high = f_cent + f_width/2. filt = (f_mat gt f_cut_low) And (f_mat lt f_cut_high) End "BUTTER": filt = 1./(1. + ((f_mat - f_cent)/f_width)^(2*Order)) Else: Message, "Filter " + filterTyp + " ist nicht definiert." EndCase End Else: Message, "Filtertyp " + filterArt + " ist unbekannt." EndCase ;filterArt ; ;=============================================================================== ; 4. Filtern der Daten und Schluss: ;=============================================================================== ; Ende: Return, FFT( FFT(array, -1) * filt, 1) ; Filtern + Uebergabe an's HP. END ;===============================================================================