pro MM_AS_filter, fkt, ste, VALUE=val, TYPE=typ ;+ ; NAME: ; MM_AS_filter ; ; ; PURPOSE: ; Morphological alternating sequential filter ; ; ; CATEGORY: ; Image analysis ; ; ; CALLING SEQUENCE: ; MM_AS_filter, fkt, ste ; ; ; INPUTS: ; fkt: data ; ste: structuring element (same dimension as fkt) ; ; OPTIONAL INPUTS: ; none ; ; ; KEYWORD PARAMETERS: ; TYPE: 'E': Erosion ; 'D': Dilation (dilatation) ; 'O': Opening (ouverture) ; 'C': Closing (fermeture) ; 'OC': first opening than closing ; 'CO': first closing than opening ; NO default ! ; ; VALUE: val Value matrix (same dim. as ste) ; ; ; OUTPUTS: ; none ; ; ; OPTIONAL OUTPUTS: ; none ; ; ; COMMON BLOCKS: ; none ; ; ; SIDE EFFECTS: ; input data are overwritten, (IN PLACE procedure) ; ; ; RESTRICTIONS: ; same as ERODE/DILATE ; ; ; PROCEDURE: ; ; ; ; EXAMPLE: ; ; ; ; MODIFICATION HISTORY: ; ; Mon Jul 20 10:01:45 1998, Karsten Rodenacker ; ; ; ;- if not keyword_set(typ) then typ='O' else typ=strupcase(typ) s_f=size(fkt,/dim) s_s=size(ste,/dim) co=make_array(3,2,/long) co[0:n_elements(s_s)-1,0]=s_s/2 co[0:n_elements(s_s)-1,1]=co[0:n_elements(s_s)-1,0]+((s_s and 1) xor 1) if n_elements(val) ne 0 then begin case typ of 'E':fkt=erode(fkt, ste, co[0,0], co[1,0], co[2,0], VALUE=val) ;Erosion 'D':fkt=dilate(fkt, ste, co[0,1], co[1,1], co[2,1], VALUE=val) ;Dilatation 'O':fkt=dilate(erode(fkt, ste, co[0,0], co[1,0], co[2,0], VALUE=val), $ ste, co[0,1], co[1,1], co[2,1], VALUE=val) ;Ouverture 'C':fkt=erode(dilate(fkt, ste, co[0,0], co[1,0], co[2,0], VALUE=val), $ ste, co[0,1], co[1,1], co[2,1], VALUE=val) ;Fermeture 'OC':fkt=erode(dilate(dilate(erode(fkt, ste, co[0,0], co[1,0], co[2,0], VALUE=val), $ ste, co[0,1], co[1,1], co[2,1], VALUE=val), $ ste, co[0,0], co[1,0], co[2,0], VALUE=val), $ ste, co[0,1], co[1,1], co[2,1], VALUE=val) ;OuvertureFermeture 'CO':fkt=dilate(erode(erode(dilate(fkt, ste, co[0,0], co[1,0], co[2,0], VALUE=val), $ ste, co[0,1], co[1,1], co[2,1], VALUE=val), $ ste, co[0,0], co[1,0], co[2,0], VALUE=val), $ ste, co[0,1], co[1,1], co[2,1], VALUE=val) ;FermetureOuverture 'OCO':fkt=dilate(erode(erode(dilate(dilate(erode(fkt, ste, VALUE=val), $ ste, VALUE=val), $ ste, VALUE=val), ste, VALUE=val), $ ste, VALUE=val), $ ste, VALUE=val) ;OuvertureFermetureOuverture 'COC':fkt=erode(dilate(dilate(erode(erode(dilate(fkt, ste, VALUE=val), $ ste, VALUE=val), $ ste, VALUE=val), ste, VALUE=val), $ ste, VALUE=val), $ ste, VALUE=val) ;FermetureOuvertureFermeture else: endcase endif else begin case typ of 'E':fkt=erode(fkt, ste, co[0,0], co[1,0], co[2,0], /GR) ;Erosion 'D':fkt=dilate(fkt, ste, co[0,1], co[1,1], co[2,1], /GR) ;Dilatation 'O':fkt=dilate(erode(fkt, ste, co[0,0], co[1,0], co[2,0], /GR), $ ste, co[0,1], co[1,1], co[2,1], /GR) ;Ouverture 'C':fkt=erode(dilate(fkt, ste, co[0,0], co[1,0], co[2,0], /GR), $ ste, co[0,1], co[1,1], co[2,1], /GR) ;Fermeture 'OC':fkt=erode(dilate(dilate(erode(fkt, ste, co[0,0], co[1,0], co[2,0], /GR), $ ste, co[0,1], co[1,1], co[2,1], /GR), $ ste, co[0,0], co[1,0], co[2,0], /GR), $ ste, co[0,1], co[1,1], co[2,1], /GR) ;OuvertureFermeture 'CO':fkt=dilate(erode(erode(dilate(fkt, ste, co[0,0], co[1,0], co[2,0], /GR), $ ste, co[0,1], co[1,1], co[2,1], /GR), $ ste, co[0,0], co[1,0], co[2,0], /GR), $ ste, co[0,1], co[1,1], co[2,1], /GR) ;FermetureOuverture 'OCO':fkt=dilate(erode(erode(dilate(dilate(erode(fkt, ste, /GR), $ ste, /GR), $ ste, /GR), ste, /GR), $ ste, /GR), ste, /GR) ;OuvertureFermetureOuverture 'COC':fkt=erode(dilate(dilate(erode(erode(dilate(fkt, ste, /GR), $ ste, /GR), $ ste, /GR), ste, /GR), $ ste, /GR), ste, /GR) ;FermetureOuvertureFermeture else: endcase ENDELSE end