;210_sharpness-sharper_wisest-sharpen.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 ; ; Smart Seperate Sharpening, V2.7 ; ; Martin Egger (martin.egger@gmx.net), Michael Kolodny (m_kolodny@phreego.com) ; added 'Texture Sharpening' and included Seperate Sharpen ; (C) 2010, Bern, Switzerland ; ; You can find more about Smart Sharpening at ; http://www.gimpguru.org/Tutorials/SmartSharpening2/ ; ; This script was tested with Gimp 2.7 ; ; New versions will be distributed from http://registry.gimp.org/ only ;============================================================== ; Define the function ; (define (210-Eg-SmartSeparateSharpen InImage InLayer TInAmount TInLightOpacity TInDarkOpacity EInAmount EInLightOpacity EInDarkOpacity TInRadius TInThreshold EInRadius EInThreshold InEdge InBlur InFlatten) ; ; Save history ; (gimp-image-undo-group-start InImage) (if (= (car (gimp-drawable-is-rgb InLayer)) FALSE ) (gimp-image-convert-rgb InImage)) ; (let* ( (MaskImage (car (gimp-image-duplicate InImage))) (MaskLayer (cadr (gimp-image-get-layers MaskImage))) ; (OrigLayer (cadr (gimp-image-get-layers InImage))) ; (EdgeSharpenLayer (car (gimp-layer-copy InLayer TRUE))) (TextureSharpenLayer (car (gimp-layer-copy InLayer TRUE))) ) ; (gimp-image-add-layer InImage EdgeSharpenLayer -1) (gimp-image-add-layer InImage TextureSharpenLayer -1) ; ; ; Find edges, Warpmode = Smear (1), Edgemode = Sobel (0) ; (plug-in-edge TRUE MaskImage (aref MaskLayer 0) InEdge 1 0) (gimp-levels-stretch (aref MaskLayer 0)) (gimp-image-convert-grayscale MaskImage) (plug-in-gauss TRUE MaskImage (aref MaskLayer 0) InBlur InBlur TRUE) ; (let* ( (EdgeSharpenLayerMask (car (gimp-layer-create-mask EdgeSharpenLayer ADD-WHITE-MASK))) (TextureSharpenLayerMask (car (gimp-layer-create-mask TextureSharpenLayer ADD-WHITE-MASK))) ) (gimp-layer-add-mask EdgeSharpenLayer EdgeSharpenLayerMask) ; (gimp-selection-all MaskImage) (gimp-edit-copy (aref MaskLayer 0)) (gimp-floating-sel-anchor (car (gimp-edit-paste EdgeSharpenLayerMask FALSE))) ; (script-fu-Eg-SharpenLightAndDark InImage EdgeSharpenLayer EInRadius EInAmount EInLightOpacity EInDarkOpacity EInThreshold InFlatten "Edge") ;; do texture sharpening with an inverted edge mask (gimp-image-convert-rgb MaskImage) (plug-in-vinvert TRUE MaskImage (aref MaskLayer 0)) (gimp-edit-copy (aref MaskLayer 0)) (gimp-layer-add-mask TextureSharpenLayer TextureSharpenLayerMask) (gimp-floating-sel-anchor (car (gimp-edit-paste TextureSharpenLayerMask FALSE))) (gimp-image-delete MaskImage) ; (script-fu-Eg-SharpenLightAndDark InImage TextureSharpenLayer TInRadius TInAmount TInLightOpacity TInDarkOpacity TInThreshold InFlatten "Texture") ) (cond ((= InFlatten FALSE) (begin (gimp-layer-set-edit-mask EdgeSharpenLayer FALSE) (gimp-layer-set-edit-mask TextureSharpenLayer FALSE) (gimp-image-set-active-layer InImage InLayer) ) ) ) ) ; ; Finish work ; (gimp-image-undo-group-end InImage) (gimp-displays-flush) ; ) (define (script-fu-Eg-SharpenLightAndDark InImage InSharpenDarkLayer InRadius InAmount InLightOpacity InDarkOpacity InThreshold InFlatten InLabel) (gimp-layer-set-mode InSharpenDarkLayer DARKEN-ONLY-MODE) (gimp-layer-set-opacity InSharpenDarkLayer InDarkOpacity) (plug-in-unsharp-mask TRUE InImage InSharpenDarkLayer InRadius InAmount InThreshold) ; (let* ( (SharpenLightLayer (car (gimp-layer-copy InSharpenDarkLayer TRUE))) ) (gimp-image-add-layer InImage SharpenLightLayer -1) (gimp-layer-set-mode SharpenLightLayer LIGHTEN-ONLY-MODE) (gimp-layer-set-opacity SharpenLightLayer InLightOpacity) ; ; Flatten the image, if we need to ; (cond ((= InFlatten TRUE) (begin (let* ( (InSharpenDarkLayer (car (gimp-image-merge-down InImage InSharpenDarkLayer CLIP-TO-IMAGE))) ) (gimp-image-merge-down InImage SharpenLightLayer CLIP-TO-IMAGE) ) ) ) ((= InFlatten FALSE) (begin (gimp-drawable-set-name SharpenLightLayer (string-append InLabel " Sharpened Lighten")) (gimp-drawable-set-name InSharpenDarkLayer (string-append InLabel " Sharpened Darken")) (gimp-image-set-active-layer InImage InSharpenDarkLayer) ) ) ) ) ) (script-fu-register "210-Eg-SmartSeparateSharpen" "Wisest Sharpen" "Smart Sharpening, Redux version" "Martin Egger (martin.egger@gmx.net) and Michael Kolodny (m_kolodny@phreego.com)" "2010, Martin Egger, Bern, Switzerland" "21.11.2010" "*" SF-IMAGE "The Image" 0 SF-DRAWABLE "The Layer" 0 SF-ADJUSTMENT "Texture Sharpen USM: Amount" '(1.2 0.0 10.0 0.5 0 2 0) SF-ADJUSTMENT "Texture Sharpen Lighten USM: Opacity" '(50 0.0 100 0.5 0 2 0) SF-ADJUSTMENT "Texture Sharpen Darken USM: Opacity" '(100 0.0 100 0.5 0 2 0) SF-ADJUSTMENT "Edge Sharpen USM: Amount" '(1.2 0.0 5.0 0.5 0 2 0) SF-ADJUSTMENT "Edge Sharpen Lighten USM: Opacity" '(50 0.0 100 0.5 0 2 0) SF-ADJUSTMENT "Edge Sharpen Darken USM: Opacity" '(100 0.0 100 0.5 0 2 0) SF-ADJUSTMENT "Texture Sharpen USM: Radius" '(0.3 0.0 120.0 1 0 2 0) SF-ADJUSTMENT "Texture Sharpen USM: Threshold" '(0.0 0.0 255.0 1.0 0 2 0) SF-ADJUSTMENT "Edge Sharpen USM: Radius" '(0.3 0.0 50.0 1 0 2 0) SF-ADJUSTMENT "Edge Sharpen USM: Threshold" '(0.0 0.0 50.0 1.0 0 2 0) SF-ADJUSTMENT "Edges: Detect Amount" '(6.0 1.0 10.0 1.0 0 2 0) SF-ADJUSTMENT "Edges: Blur Pixels" '(6.0 1.0 10.0 1.0 0 2 0) SF-TOGGLE "Flatten Image" FALSE ) (script-fu-menu-register "210-Eg-SmartSeparateSharpen" "/Script-Fu/Sharpness/Sharper") ;