Forum Wiki Galerie Kontakt Wie man Fragen richtig stellt. Tutorial Forum
Zurück   GIMP-Forum 3.0 > Arbeiten mit Gimp > GIMP-Ressourcen > Skripte

Hinweise
Alt 27.01.2007, 21:56   #1
flashnfantasy
Erfahrener Benutzer
 
Benutzerbild von flashnfantasy
 
Registriert seit: 14.05.2004
Beiträge: 380
Standard [Script] zwei HDR-Scripte

HDR = High Dynamic Range

Vorbereitung für beide Scripte ist identisch.

1. Es müssen in einem Bild 3 Ebenen sind.

2. Die Ebenen sind die 3 Photos einer Belichtungs-Variantenreihe, auch Auto-Exposure-Bracketing genannt oder AEB - unter diesem Kürzel findet man es häufig auf der Kamera.
Die Reihenfolge der Ebenen ist egal, der Script erkennt das hellste (long shutter) und dunkelste (short shutter) Bild von alleine.

Beide Scripte erzielen fast gleiche Ergebnisse mit gleichen Parametern, unabhängig von der Bildgröße, also sollte man das Bild duplizieren, verkleinern und dann experimentieren.

Parameter Script 1.
(1) Die Masken für die Über und Unterbelichtung werden gewonnen aus einen Treshhold des SW-Bildes der mittleren Belichtung. Der Treshhold wird errechnet aus Helligkeits-Mittelfert +/- einem Faktor * Standartabweichung. Dieser Faktor ist der erste Parameter. Vergrößert man diesen Wert, dann wird der HDR-Effekt kleiner.
(2+3) Die Masken sind noch zu hart, mit diesen Werten kann man sie weichzeichnen. Je größer der Wert, umso weicher die Maske, der HDR-Effekt fällt dezenter aus.
(4) Bei Improve mit verschiedenen Werten testen.

Parameter Script 2.
(1) Reduzieren des HDR - Effektes
(2) Weichzeichnen der Maske, dadurch wird das ausgleichen von Kontrastunterschieden reduziert, das Bild gewinnt wieder an Kontrast in den Deteils, was wie ein Scharfzeichnen aussieht, tatsächlich ist das Bild nicht schärfer als vorher.

Beide Scripte stehen unter Photo.
Script 1 ändere ich meist keine Parameter.
Script 2 ändere ich den Schärfe-Effekt meist auf weak.
Doe Beispielbilder unten sind mit diesen Einstellungen aufgenommen.

Code:
(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)

  (set! layers (gimp-image-get-layers img))
  (set! num-layers (car layers))
  (set! layer-array (cadr layers))
  (set! i num-layers)

  (set! high 0)
  (set! low 255)

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

      (set! vals (gimp-histogram layer 0 0 255))
      (set! mean (trunc (car vals)))
      (set! stddev (cadr vals))

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

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

  (gimp-image-undo-disable img)
  (gimp-selection-none img)
  (set! draw-type (car (gimp-drawable-type-with-alpha drawable)))

  (set! low 255)
  (set! high 0)

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

  (set! layers (gimp-image-get-layers img))
  (set! num-layers (car layers))
  (set! layer-array (cadr layers))
  (set! i num-layers)

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

      (set! vals (gimp-histogram layer 0 0 255))
      (set! mean (trunc (car vals)))
      (set! stddev (cadr 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)
  ;(plug-in-c-astretch 0 img 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
  (set! image-type (car (gimp-image-base-type img)))
  (set! new-image (car (gimp-image-new (car (gimp-image-width img)) (car (gimp-image-height img)) image-type)))
  (set! display-work (car (gimp-display-new new-image)))
  (gimp-layer-set-preserve-trans 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-clear new-image)
  (set! floating-sel (car (gimp-edit-paste new-draw FALSE)))
  (gimp-floating-sel-anchor floating-sel)

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

  ; neue Ebene einfügen mit qualitativer Verbesserung
  (set! layerA (car(gimp-layer-copy new-draw 0)))
  (gimp-image-add-layer new-image layerA 0)
  (set! layerP (car(gimp-layer-copy new-draw 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)
    (set! layerPP (car(gimp-layer-copy layerP 0)))
    (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 "HDR-Photo:")

  (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-layer-set-name new-draw descr)

  ;blurDark blurBright sot

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

(script-fu-register "script-fu-hdr2"
                    _"<Image>/Script-Fu/Photo/High Dynamic Range Photo 2"
                    "Setzt aus drei unterschiedlich belichteten Photos ein neues Bild zusammen. Reihenfolge der Photos ist egal. Photos muessen Ebenen im selben Bild sein."
                    "Mathias Weitz"
                    "Mathias Weitz"
                    "23/01/07"
                    "RGB RGBA"
                    SF-IMAGE "Image" 0
                    SF-DRAWABLE "Drawable" 0
                    SF-OPTION     _"Reduce HDR-Effect" '(_"None"
                                            _"Weak"
                                            _"Medium"
                                            _"Stronger"
                                            _"Strongest")
                    SF-OPTION     _"Sharpen" '(_"None"
                                            _"Weak"
                                            _"Medium"
                                            _"Strong")
                    SF-TOGGLE     _"Short on Top" TRUE
                    )

(define (script-fu-hdr2 img drawable levelseffekt softeffekt sot)

  (gimp-image-undo-disable img)
  (gimp-selection-none img)
  (set! draw-type (car (gimp-drawable-type-with-alpha drawable)))

  (set! low 255)
  (set! high 0)

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

  (set! layers (gimp-image-get-layers img))
  (set! num-layers (car layers))
  (set! layer-array (cadr layers))
  (set! i num-layers)

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

      (set! vals (gimp-histogram layer 0 0 255))
      (set! mean (trunc (car vals)))
      (set! stddev (cadr 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)
  (plug-in-c-astretch 0 img layermB)

  (if (= softeffekt 1)
  (begin
    (plug-in-sel-gauss 1 img layermB 2 50)
  ))

  (if (= softeffekt 2)
  (begin
    (plug-in-sel-gauss 1 img layermB 2 100)
  ))

  (if (= softeffekt 3)
  (begin
    (plug-in-sel-gauss 1 img layermB   5 100)
  ))

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

  (gimp-invert layermB)

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


  (if (= levelseffekt 1)
  (begin
    (gimp-levels layermB 0 0 255 0.8 0 255)
    (gimp-levels layermD 0 0 255 1.25 0 255)
  ))
  (if (= levelseffekt 2)
  (begin
    (gimp-levels layermB 0 0 255 0.625 0 255)
    (gimp-levels layermD 0 0 255 1.6 0 255)
  ))
  (if (= levelseffekt 3)
  (begin
    (gimp-levels layermB 0 0 255 0.5 0 255)
    (gimp-levels layermD 0 0 255 2 0 255)
  ))
  (if (= levelseffekt 4)
  (begin
    (gimp-levels layermB 0 0 255 0.4 0 255)
    (gimp-levels layermD 0 0 255 2.5 0 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)

  (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
  (set! image-type (car (gimp-image-base-type img)))
  (set! new-image (car (gimp-image-new (car (gimp-image-width img)) (car (gimp-image-height img)) image-type)))
  (set! display-work (car (gimp-display-new new-image)))
  (gimp-layer-set-preserve-trans 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-clear new-image)
  (set! floating-sel (car (gimp-edit-paste new-draw FALSE)))
  (gimp-floating-sel-anchor floating-sel)

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

  (plug-in-autostretch-hsv 1 new-image new-draw)

  ; neue Ebene einfügen mit qualitativer Verbesserung
  ;(set! layerA (car(gimp-layer-copy new-draw 0)))
  ;(gimp-image-add-layer new-image layerA 0)
  ;(set! layerP (car(gimp-layer-copy new-draw 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)
  ;  (set! layerPP (car(gimp-layer-copy layerP 0)))
  ;  (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 "HDR-Photo:")

  ;(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-layer-set-name new-draw descr)


  (gimp-image-undo-enable img)
  (gimp-image-clean-all img)
  (gimp-displays-flush)
)
Bildkritik:
Das untere Bild entspricht den Techniken, die meist bei HDR verwendet werden, es entspricht auch dem Script den Ravetracer gefunden hat. Das Script arbeitet die Kontraste sehr gut raus, zum Teil zu gut, was dazu führt, daß manche Details verloren gehen und das Bild etwas flau wirkt.
zB erkennt man die dunkle Platte auf dem Blechdach links fast nicht mehr. Genauso wirken die Äste der Bäume grau.
Das mittlere Script erreicht nach meinem Geschmack eine besser Athmosphäre, der Himmel ist dunkler, die Silhuette der Bäume realistischer.

__________________
meine Website
flashnfantasy ist offline   Mit Zitat antworten
 

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Wie benutze ich Scripte??? oO Nitro Tutorials 1 25.09.2005 18:09


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:49 Uhr.


Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.