1d7430e
; Wavelet Decompose Script-Fu
1d7430e
;
1d7430e
; Copyright (C) 2009 Christoph A. Traxler
1d7430e
; 
1d7430e
; This program is free software; you can redistribute it and/or modify it under
1d7430e
; the terms of the GNU General Public License as published by the Free Software
1d7430e
; Foundation; either version 3 of the License, or (at your option) any later
1d7430e
; version.
1d7430e
; 
1d7430e
; This program is distributed in the hope that it will be useful, but WITHOUT
1d7430e
; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
1d7430e
; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
1d7430e
; 
1d7430e
; The GNU General Public License can be found at
1d7430e
;   http://www.gnu.org/copyleft/gpl.html
1d7430e
1d7430e
1d7430e
(define (script-fu-wavelet-decompose image
1d7430e
                                     start
1d7430e
                                     count
1d7430e
                                     factor
1d7430e
                                     increase
1d7430e
                                     make-copy)
1d7430e
  (let* (
1d7430e
      (work-image 0)          ; my working image
1d7430e
      (layer-orig 0)          ; original layer
1d7430e
      (layer-resi 0)          ; residual layer
1d7430e
      (layer-orig-copy 0)     ; copy of original layer
1d7430e
      (layer-resi-copy 0)     ; copy of residual layer
1d7430e
      (layer-scale 0)         ; layer with current scale
1d7430e
      (layer-scale-copy 0)    ; layer with copy of current scale
1d7430e
      (blur-size start)       ; current blur size
1d7430e
      (i 1)                   ; counter (Start with 1)
1d7430e
    )
1d7430e
    
1d7430e
    ;-- Preparations --
1d7430e
    
1d7430e
    ; check if I should work on a copy
1d7430e
    (if (= make-copy TRUE)
1d7430e
      (begin
1d7430e
        (set! work-image (car (gimp-image-duplicate image)))
1d7430e
        (gimp-display-new work-image)
1d7430e
        (gimp-image-undo-disable work-image)
1d7430e
      )
1d7430e
      (begin
1d7430e
        (set! work-image image)
1d7430e
        (gimp-image-undo-group-start work-image)
1d7430e
      )
1d7430e
    )
1d7430e
    
1d7430e
    ; create two layers for Original and Residual
1d7430e
    (set! layer-orig (car(gimp-image-flatten work-image)))
1d7430e
    (gimp-drawable-set-name layer-orig "Original")
1d7430e
    (gimp-image-set-active-layer work-image layer-orig)
1d7430e
    (set! layer-resi (car(gimp-layer-copy layer-orig FALSE)))
1d7430e
    (gimp-image-add-layer work-image layer-resi -1)
1d7430e
    (gimp-drawable-set-name layer-resi "Residual")
1d7430e
    
1d7430e
    ;-- Decomposing --
1d7430e
    
1d7430e
    (while (<= i count)
1d7430e
      ; create layer with current scale detail
1d7430e
      (set! layer-orig-copy (car (gimp-layer-copy layer-orig FALSE)))
1d7430e
      (gimp-image-set-active-layer work-image layer-resi)
1d7430e
      (gimp-image-add-layer work-image layer-orig-copy -1)
1d7430e
      (set! layer-resi-copy (car (gimp-layer-copy layer-resi FALSE)))
1d7430e
      (gimp-image-set-active-layer work-image layer-resi)
1d7430e
      (gimp-image-add-layer work-image layer-resi-copy -1)
1d7430e
      (plug-in-gauss-iir RUN-NONINTERACTIVE
1d7430e
                         work-image
1d7430e
                         layer-orig-copy
1d7430e
                         blur-size
1d7430e
                         TRUE TRUE)
1d7430e
      (gimp-layer-set-mode layer-orig-copy GRAIN-EXTRACT-MODE)
1d7430e
      (set! layer-scale (car (gimp-image-merge-down
1d7430e
        work-image layer-orig-copy CLIP-TO-IMAGE)))
1d7430e
      (gimp-layer-set-mode layer-scale GRAIN-MERGE-MODE)
1d7430e
      (gimp-drawable-set-name
1d7430e
        layer-scale
1d7430e
        (string-append "Scale " (number->string i)
1d7430e
                       " (" (number->string blur-size) " pix)")
1d7430e
      )
1d7430e
      
1d7430e
      ; update residual
1d7430e
      (set! layer-scale-copy (car (gimp-layer-copy layer-scale FALSE)))
1d7430e
      (gimp-image-set-active-layer work-image layer-resi)
1d7430e
      (gimp-image-add-layer work-image layer-scale-copy -1)
1d7430e
      (gimp-layer-set-mode layer-scale-copy GRAIN-EXTRACT-MODE)
1d7430e
      (set! layer-resi (car (gimp-image-merge-down
1d7430e
        work-image layer-scale-copy CLIP-TO-IMAGE)))
1d7430e
      
1d7430e
      ; for the loop
1d7430e
      (set! i (+ i 1))
1d7430e
      (set! blur-size (+ (* blur-size factor) increase))
1d7430e
    )
1d7430e
    
1d7430e
    ;-- Finishing --
1d7430e
    
1d7430e
    ; bring original layer to top and hide it
1d7430e
    (gimp-image-raise-layer-to-top work-image layer-orig)
1d7430e
    (gimp-drawable-set-visible layer-orig FALSE)
1d7430e
    
1d7430e
    ; cleanup
1d7430e
    (if (= make-copy TRUE)
1d7430e
      (begin
1d7430e
        (gimp-image-undo-enable work-image)
1d7430e
        (gimp-image-clean-all work-image)
1d7430e
      )
1d7430e
      (begin
1d7430e
        (gimp-image-undo-group-end work-image)
1d7430e
      )
1d7430e
    )
1d7430e
    (gimp-displays-flush)
1d7430e
    
1d7430e
    ; return
1d7430e
    '(work-image)
1d7430e
  )
1d7430e
)
1d7430e
1d7430e
; register this script in The GIMP
1d7430e
(script-fu-register
1d7430e
  _"script-fu-wavelet-decompose"                            ; func name
1d7430e
  _"Wavelet Decompose ..."                                  ; menu label
1d7430e
  "Decomposes an image into layers with different detail scales.\
1d7430e
This script flattens the original image first an then creates new layers."
1d7430e
                                                            ; description
1d7430e
  "Christoph A. Traxler"                                    ; author
1d7430e
  "(C) 2009, Christoph A. Traxler"                          ; copyright
1d7430e
  "January 2009"                                            ; date created
1d7430e
  "RGB* GRAY*"                     ; working image type (non indexed Image)
1d7430e
  SF-IMAGE          "Image"             0
1d7430e
  SF-ADJUSTMENT    _"Minimum Scale (pixels)"
1d7430e
                                        '(1 1 1000 1 10 0 1)
1d7430e
  SF-ADJUSTMENT    _"Scale Count (number of different scales)"
1d7430e
                                        '(6 1 100 1 10 0 1)
1d7430e
  SF-ADJUSTMENT    _"Scale Increase Factor"
1d7430e
                                        '(2.0 1.0 10 0.1 1 1 1)
1d7430e
  SF-ADJUSTMENT    _"Scale Constant Increase (pixels)"
1d7430e
                                        '(0 0 10000 1 10 0 1)
1d7430e
  SF-TOGGLE        _"Work on copy (creates a new image)"
1d7430e
                                        TRUE
1d7430e
)
1d7430e
(script-fu-menu-register "script-fu-wavelet-decompose"
1d7430e
                         "<Image>/Image"
1d7430e
)