; Wavelet Decompose Script-Fu ; ; Copyright (C) 2009 Christoph A. Traxler ; ; 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. ; ; The GNU General Public License can be found at ; http://www.gnu.org/copyleft/gpl.html (define (script-fu-wavelet-decompose image start count factor increase make-copy) (let* ( (work-image 0) ; my working image (layer-orig 0) ; original layer (layer-resi 0) ; residual layer (layer-orig-copy 0) ; copy of original layer (layer-resi-copy 0) ; copy of residual layer (layer-scale 0) ; layer with current scale (layer-scale-copy 0) ; layer with copy of current scale (blur-size start) ; current blur size (i 1) ; counter (Start with 1) ) ;-- Preparations -- ; check if I should work on a copy (if (= make-copy TRUE) (begin (set! work-image (car (gimp-image-duplicate image))) (gimp-display-new work-image) (gimp-image-undo-disable work-image) ) (begin (set! work-image image) (gimp-image-undo-group-start work-image) ) ) ; create two layers for Original and Residual (set! layer-orig (car(gimp-image-flatten work-image))) (gimp-drawable-set-name layer-orig "Original") (gimp-image-set-active-layer work-image layer-orig) (set! layer-resi (car(gimp-layer-copy layer-orig FALSE))) (gimp-image-add-layer work-image layer-resi -1) (gimp-drawable-set-name layer-resi "Residual") ;-- Decomposing -- (while (<= i count) ; create layer with current scale detail (set! layer-orig-copy (car (gimp-layer-copy layer-orig FALSE))) (gimp-image-set-active-layer work-image layer-resi) (gimp-image-add-layer work-image layer-orig-copy -1) (set! layer-resi-copy (car (gimp-layer-copy layer-resi FALSE))) (gimp-image-set-active-layer work-image layer-resi) (gimp-image-add-layer work-image layer-resi-copy -1) (plug-in-gauss-iir RUN-NONINTERACTIVE work-image layer-orig-copy blur-size TRUE TRUE) (gimp-layer-set-mode layer-orig-copy GRAIN-EXTRACT-MODE) (set! layer-scale (car (gimp-image-merge-down work-image layer-orig-copy CLIP-TO-IMAGE))) (gimp-layer-set-mode layer-scale GRAIN-MERGE-MODE) (gimp-drawable-set-name layer-scale (string-append "Scale " (number->string i) " (" (number->string blur-size) " pix)") ) ; update residual (set! layer-scale-copy (car (gimp-layer-copy layer-scale FALSE))) (gimp-image-set-active-layer work-image layer-resi) (gimp-image-add-layer work-image layer-scale-copy -1) (gimp-layer-set-mode layer-scale-copy GRAIN-EXTRACT-MODE) (set! layer-resi (car (gimp-image-merge-down work-image layer-scale-copy CLIP-TO-IMAGE))) ; for the loop (set! i (+ i 1)) (set! blur-size (+ (* blur-size factor) increase)) ) ;-- Finishing -- ; bring original layer to top and hide it (gimp-image-raise-layer-to-top work-image layer-orig) (gimp-drawable-set-visible layer-orig FALSE) ; cleanup (if (= make-copy TRUE) (begin (gimp-image-undo-enable work-image) (gimp-image-clean-all work-image) ) (begin (gimp-image-undo-group-end work-image) ) ) (gimp-displays-flush) ; return '(work-image) ) ) ; register this script in The GIMP (script-fu-register _"script-fu-wavelet-decompose" ; func name _"Wavelet Decompose ..." ; menu label "Decomposes an image into layers with different detail scales.\ This script flattens the original image first an then creates new layers." ; description "Christoph A. Traxler" ; author "(C) 2009, Christoph A. Traxler" ; copyright "January 2009" ; date created "RGB* GRAY*" ; working image type (non indexed Image) SF-IMAGE "Image" 0 SF-ADJUSTMENT _"Minimum Scale (pixels)" '(1 1 1000 1 10 0 1) SF-ADJUSTMENT _"Scale Count (number of different scales)" '(6 1 100 1 10 0 1) SF-ADJUSTMENT _"Scale Increase Factor" '(2.0 1.0 10 0.1 1 1 1) SF-ADJUSTMENT _"Scale Constant Increase (pixels)" '(0 0 10000 1 10 0 1) SF-TOGGLE _"Work on copy (creates a new image)" TRUE ) (script-fu-menu-register "script-fu-wavelet-decompose" "/Image" )