; 210_sharpness_warp-sharp.scm
; last modified/tested by Paul Sherman [gimphelp.org]
; Wednesday, 07/15/2020 on GIMP 2.10.20
;==================================================
;
; Installation:
; This script should be placed in the user or system-wide script folder.
;
; Windows 7/10
; C:\Program Files\GIMP 2\share\gimp\2.0\scripts
; or
; C:\Users\YOUR-NAME\AppData\Roaming\GIMP\2.10\scripts
;
;
; Linux
; /home/yourname/.config/GIMP/2.10/scripts
; or
; Linux system-wide
; /usr/share/gimp/2.0/scripts
;
;==================================================
;
; LICENSE
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see .
;
;==============================================================
; Original information
;
; warp-sharp.scm
; Date: <1999/11/11 16:50 simon@gimp.org>
; Author: Simon Budig
; Version 1.4
; Version 1.4 updated for Gimp 1.3 and 2.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, 1999, Vol. 8, No. 8, S. 1063
;==============================================================
(define (210-warp-sharp
img
drw
edge-strength
blur-strength
bump-depth
displace-amount
)
(gimp-image-undo-group-start img)
(define indexed (car (gimp-drawable-is-indexed drw)))
(if (= indexed TRUE)(gimp-image-convert-rgb img))
(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)
)
(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-insert-layer img edge-layer 0 -1)
(gimp-image-insert-layer img y-displace-layer 0 -1)
(gimp-image-insert-layer img x-displace-layer 0 -1)
; detect the edges and blur the layer a little bit
(plug-in-edge 1 img edge-layer edge-strength 1 0)
(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-item-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-image-undo-group-end img)
(gimp-displays-flush)
)
(script-fu-register "210-warp-sharp"
"Warp Sharp"
"Sharpen the current drawable by squeezing unsharp edges. Algorithm described by Joern Loviscach in c't 22/1999, p 236."
"Simon Budig "
"Simon Budig"
"30. 10. 1999"
"*"
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)
)
(script-fu-menu-register "210-warp-sharp" "/Script-Fu/Sharpness")