Hi.

The german computer-magazine c't (No. 22/1999) described a cool method
to sharpen images including a Photoshop-action.

I converted it to a Script - it is attached.

Basically unsharp edges will get squeezed together, so that the edge
will get sharper (by edge-detecting, bluring, bump-mapping two times 
for X- and Y-direction and displacing)

It works quite cool.

Bye,
        Simon
-- 
      [EMAIL PROTECTED]       http://www.home.unix-ag.org/simon/
;;; warp-sharp.scm
;;; Date: <1999/10/30 0:50 [EMAIL PROTECTED]>
;;; Author: Simon Budig <[EMAIL PROTECTED]>
;;; Version 1.0

;;; This implements a method to sharpen images described by Joern Loviscach
;;; in the german computer-magazine c't, 22/1999.

;;; Basically it "squeezes" unsharp edges. This method is a simplified
;;; Version of an algorithm by Nur Arad and Craig Gotsman:
;;; "Enhancement by Image-Dependent Warping", IEEE Transactions on
;;; Image Processing, Vol. 8, No. 8, S. 1063

(define (script-fu-warp-sharp img drw edge-strength blur-strength bump-depth 
displace-amount)
  (let* ((drawable-width (car (gimp-drawable-width drw)))
         (drawable-height (car (gimp-drawable-height drw)))
         (drawable-type (car (gimp-drawable-type drw)))
         (old-selection 0)
         ; layer for detecting edges
         (edge-layer (car (gimp-layer-copy drw 0)))
         ; layer for x-displace information
         (x-displace-layer (car (gimp-layer-new img drawable-width
                          drawable-height drawable-type "Displace X" 100 0)))
         ; layer for x-displace information
         (y-displace-layer (car (gimp-layer-new img drawable-width
                          drawable-height drawable-type "Displace Y" 100 0)))
         (selection-info (gimp-selection-bounds img))
         (has-selection (car selection-info))
         (bump-xoff 0)
         (bump-yoff 0)
        )
    (gimp-undo-push-group-start img)
    (if has-selection (begin
        ; If there is a selection don't render too much.
        (set! old-selection
                (car (gimp-channel-copy (car (gimp-image-get-selection img)))))
        (gimp-selection-grow img (+ blur-strength bump-depth displace-amount))
        (set! selection-info (gimp-selection-bounds img))
        (set! bump-xoff (cadr selection-info))
        (set! bump-yoff (caddr selection-info))
    ))
    ; set up the layers
    (gimp-drawable-fill x-displace-layer 2)
    (gimp-drawable-fill y-displace-layer 2)
    (gimp-image-add-layer img edge-layer -1)
    (gimp-image-add-layer img y-displace-layer -1)
    (gimp-image-add-layer img x-displace-layer -1)

    ; detect the edges and blur the layer a little bit
    (plug-in-edge 1 img edge-layer edge-strength 1)
    (if (>= blur-strength 1)
        (plug-in-gauss-iir 1 img edge-layer blur-strength 1 1))

    ; create the displacement-maps by bump-mapping the edges.
    ; elevation=30: areas without edges will get a 50 % gray.
    (plug-in-bump-map 1 img x-displace-layer edge-layer 0 30
                      bump-depth bump-xoff bump-yoff 0 0 0 0 0)
    (plug-in-bump-map 1 img y-displace-layer edge-layer 270 30
                      bump-depth bump-xoff bump-yoff 0 0 0 0 0)
    ; restore the old selection
    (if has-selection (begin
        (gimp-selection-load old-selection)
        (gimp-channel-delete old-selection)
    ))
    ; finally displace the image.
    (plug-in-displace 1 img drw displace-amount displace-amount 1 1
                      x-displace-layer y-displace-layer 1)

    ; clean up...
    (gimp-image-remove-layer img edge-layer)
    (gimp-image-remove-layer img x-displace-layer)
    (gimp-image-remove-layer img y-displace-layer)
    (gimp-undo-push-group-end img)
    (gimp-displays-flush)))

(script-fu-register
    "script-fu-warp-sharp"
    "<Image>/Script-Fu/Alchemy/Warp Sharp"
    "Sharpen the current drawable by squeezing unsharp edges. Algorithm described by 
Joern Loviscach in c't 22/1999, p 236."
    "Simon Budig <[EMAIL PROTECTED]>"
    "Simon Budig"
    "30. 10. 1999"
    "RGB RGBA GRAY GRAYA"
    SF-IMAGE "Image" 0
    SF-DRAWABLE "Drawable" 0
    SF-ADJUSTMENT "Edge detection" '(7 1 10 0.1 1 1 0)
    SF-ADJUSTMENT "Blur radius" '(3 0 10 0.1 1 1 0)
    SF-ADJUSTMENT "Bump depth" '(2 1 10 1 1 0 0)
    SF-ADJUSTMENT "Displace intensity" '(2.5 0.1 10 0.1 0.5 1 0)
)

Reply via email to