PDA

Vollständige Version anzeigen : HDRI Script testen


klaus_harrer
11.08.2009, 23:19
Hallo

Ich bin vor kurzem auf die HDR Scripte gestossen.
Diese Scripte sind für die Gimp Version 2.4 geschrieben worden und funktionieren sie daher nicht in der aktuellen Gimp Version.

Ich habe das Script für die aktuelle Gimp Version angepasst. Ich habe das ursprüngliche Script nicht geschrieben und es könnten sich durch die Anpassung Fehler eingeschlichen haben.
Leider habe ich auch keine Ahnung wie so ein HDRI Bild im Ergebnis auszusehen hat.

Daher wollte ich euch bitten das Script zu testen. Und bei Problemen mir einen Nachricht zu schicken.


(script-fu-register "script-fu-hdr"
_"<Image>/Script-Fu/Photo/High Dynamic Range Photo"
"Setzt aus drei unterschiedlich belichteten Photos ein neues Bild zusammen. Reihenfolge der Photos ist egal. Photos muessen Ebenen im selben Bild sein. Die Parameter werden berechnet im Verhaeltniss zur Bildbreite, daher haben gleiche Parameter die gleiche Wirkung, unabhaengig von der Bildgroesse."
"Mathias Weitz"
"Mathias Weitz"
"11/01/07"
"RGB RGBA"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-ADJUSTMENT _"Mask Area" '(0 -0.5 1 0.1 0.1 1 0)
SF-ADJUSTMENT _"Blur Short" '(20 1 50 1 1 0 0)
SF-ADJUSTMENT _"Blur Bright" '(30 1 50 1 1 0 0)
SF-TOGGLE _"Short on Top" TRUE
SF-ADJUSTMENT _"Improve" '(10 0 20 1 1 0 0)
)

(define (max-histogram img)

(let*
(
(layers (gimp-image-get-layers img))
(num-layers (car layers))
(layer-array (cadr layers))
(i num-layers)
(mean 0)
(vals 0)

(high 0)
(low 255)
(stddev 0)
)
(while (< 0 i)
(set! i (- i 1))

(set! vals (gimp-histogram (aref layer-array i) 0 0 255))

(set! mean (truncate (car vals)))
;; (set! stddev (cadr vals))

(if (< high mean) (set! high mean))
(if (< mean low) (set! low mean))
)
(list low high)
)
)

(define (script-fu-hdr img drawable v blurDark blurBright sot imp)

(gimp-image-undo-disable img)
(gimp-selection-none img)

(let*
(
(draw-type (car (gimp-drawable-type-with-alpha drawable)))

(low 255)
(high 0)

(e (max-histogram img))
(minx (car e))
(maxx (cadr e))

(layers (gimp-image-get-layers img))
(num-layers (car layers))
(layer-array (cadr layers))
(i num-layers)
(layer 0)
(vals 0)
(mean 0)
(dark 0)
(medium 0)
(mediumx 0)
(mediumC 0)
(brightC 0)
(darkC 0)
(layermB 0)
(layermD 0)
(mB 0)
(mD 0)
(wB 0)
(wD 0)
(layerF 0)
(bright 0)
)

(while (< 0 i)
(set! i (- i 1))
(set! layer (aref layer-array i))

(set! vals (gimp-histogram layer 0 0 255))
(set! mean (truncate (car vals)))

(if (= minx mean)
(begin
(set! dark layer)
)
(begin
(if (= maxx mean)
(begin
(set! bright layer)
)
(begin
(set! medium layer)
(set! mediumx mean)
)
)
)
)
)

(set! mediumC (car(gimp-layer-copy medium 0)))
(gimp-image-add-layer img mediumC 0)
(set! brightC (car(gimp-layer-copy bright 0)))
(set! darkC (car(gimp-layer-copy dark 0)))

(if (= sot TRUE)
(begin
(gimp-image-add-layer img brightC 0)
(gimp-image-add-layer img darkC 0)
)
(begin
(gimp-image-add-layer img darkC 0)
(gimp-image-add-layer img brightC 0)
))

(gimp-layer-set-name mediumC "medium")
(gimp-layer-set-name darkC "dark")
(gimp-layer-set-name brightC "bright")

(set! layermB (car(gimp-layer-copy medium 0)))
(gimp-image-add-layer img layermB 0)

(gimp-desaturate layermB)

(set! layermD (car(gimp-layer-copy layermB 0)))
(gimp-image-add-layer img layermD 0)

(gimp-layer-set-name layermB "Bright Mask")
(gimp-layer-set-name layermB "Dark Mask")

(set! low (max 0 (+ (* minx v) (* mediumx (- 1 v)))))
(set! high (min 255 (+ (* maxx v) (* mediumx (- 1 v)))))

(gimp-threshold layermB 0 low)
(gimp-threshold layermD high 255)

(gimp-layer-add-alpha layermB)
(gimp-layer-add-alpha layermD)

(set! mB (car (gimp-layer-create-mask layermB 5)))
(set! mD (car (gimp-layer-create-mask layermD 5)))

(gimp-layer-add-mask brightC mB)
(gimp-layer-add-mask darkC mD)

(gimp-image-remove-layer img layermB)
(gimp-image-remove-layer img layermD)

(set! wD (/ (* blurDark (car (gimp-image-width img))) 50))
(set! wB (/ (* blurBright (car (gimp-image-width img))) 50))

(plug-in-gauss-rle2 1 img mB wB wB)
(plug-in-gauss-rle2 1 img mD wD wD)

(if (= sot TRUE)
(begin
(set! layerF (car (gimp-image-merge-down img brightC 0)))
(set! layerF (car (gimp-image-merge-down img darkC 0)))
)
(begin
(set! layerF (car (gimp-image-merge-down img darkC 0)))
(set! layerF (car (gimp-image-merge-down img brightC 0)))
))

; Kopie machen
(let*
(
(image-type (car (gimp-image-base-type img)))
(new-image (car (gimp-image-new (car (gimp-image-width img)) (car (gimp-image-height img)) image-type)))
(display-work (car (gimp-display-new new-image)))
(new-draw (car (gimp-layer-new new-image (car (gimp-image-width img)) (car (gimp-image-height img)) draw-type "HDR-Photo" 100 0)))
)
(gimp-layer-set-lock-alpha layerF TRUE)

(gimp-edit-copy layerF)
(gimp-selection-none new-image)
;; (set! new-draw (car (gimp-layer-new new-image (car (gimp-image-width img)) (car (gimp-image-height img)) draw-type "HDR-Photo" 100 0)))
(gimp-image-add-layer new-image new-draw 0)
(gimp-drawable-fill new-draw 3)
(gimp-edit-clear new-draw)
(gimp-selection-none new-image)
(gimp-floating-sel-anchor (car (gimp-edit-paste new-draw FALSE)))

; Ergebniss auf dem alten Bild löschen
(gimp-image-remove-layer img layerF)

; neue Ebene einfügen mit qualitativer Verbesserung
(let*
(
(layerA (car(gimp-layer-copy new-draw 0)))
(layerP (car(gimp-layer-copy new-draw 0)))
(layerPP (car(gimp-layer-copy layerP 0)))
(descr "HDR-Photo:")
(wDD 0)
(wP 0)
)
(gimp-image-add-layer new-image layerA 0)
(gimp-image-add-layer new-image layerP 0)

(set! wDD (/ wD 50))
(gimp-layer-set-mode layerP 5)
(gimp-desaturate layerP)
(gimp-invert layerP)
(plug-in-gauss-rle2 1 new-image layerP wDD wDD)
(set! layerP (car (gimp-image-merge-down new-image layerP 0)))

(if (< 0 imp)
(begin
(plug-in-autostretch-hsv 1 new-image layerP)
(gimp-image-add-layer new-image layerPP 0)
(gimp-layer-set-mode layerPP 5)
(set! wP (/ (* imp (car (gimp-image-width img))) 100))
(plug-in-gauss-rle2 1 new-image layerPP wP wP)
(set! layerP (car (gimp-image-merge-down new-image layerPP 0)))
))

; Beschreibung

(set! descr (string-append descr " Mask "))
(set! descr (string-append descr (number->string v)))
(set! descr (string-append descr ", Short "))
(set! descr (string-append descr (number->string blurDark)))
(set! descr (string-append descr ", Long "))
(set! descr (string-append descr (number->string blurBright)))

(gimp-drawable-set-name new-draw descr)
)
)
;blurDark blurBright sot

(gimp-image-undo-enable img)
(gimp-image-clean-all img)
(gimp-displays-flush)
)
)

Nigel
12.08.2009, 08:23
Werd es bei Gelegenheit am heimischen Rechner testen. So ein Script wäre prima, wenn die Ergebnisse entsprechend ausschauen.

Suche schon länger etwas, mit dem man den Tonemapping-Effekt nachmachen kann, der oft bei HDR-Bildern zum Einsatz kommt.

Hier ist ein (achtung sehr sehr großer) Thread aus einem anderen Forum, wo es sich lohnt einfach mal quer durchzuklickern (am besten in hunderter Schritten durch die Seiten springen xD), da ist sehr sehr viel zu HDR-Technik in Verbindung mit Bildverarbeitung beschrieben, absolut lesenswert.

Man muss leider registriert sein, um dort Bilder zu sehen, aber es lohnt sich wirklich, man kann den Benutzer ja dann wieder löschen oder inaktiv lassen:

http://www.dslr-forum.de/showthread.php?t=232088 (http://www.dslr-forum.de/showthread.php?t=232088&highlight=Achtung+Baustelle)

greetz Nigel