flashnfantasy
11.11.2005, 14:53
Das Problem hatte ich hier schon mal angerissen,...
Es geht darum, eine Auswahl, die man zB über einen Riß im Bild gelegt hat, so zu füllen, daß die Füllung sich an den Rand angleicht.
Die erste Idee von mir dazu war, daß man die Auswahl etwas vergrößert, ständig ein Weichzeichnen anwendet, und den Rand wieder draufsetzt.
Mit der Zeit füllt sich so die Auswahl mit den Farben vom Rand her auf.
Jedoch das dauert auch dementsprechend lange.
Die jetzige Methode basiert auf der Idee, daß ich auch vom Rand her die Auswahl weichzeichnen lasse, aber ich nutze das, um die Auswahl rekursiv nach unterschiedlichen Bereichen zu unterteilen.
Diese Bereiche fülle ich mit dem Durchschnittswert des Randes.
Unten habe ich mal die einzelnen Schritte dargestellt (etwas aufgearbeitet).
2367
Durch rekursives Wiederholen des Algorithmus auf die nun einzelnen Abschnitte hatte ich gehofft, daß ich so langsam aber sicher nun eine immer genauere Hell/Dunkel-Aufteilung ergibt.
Nicht zu sagen, daß der Script meine Idee zwar umsetzt, daß Ergebniss ist aber nicht wie erwartet präzise.
Hier ist das Beispiel mal mit 0,1,2 und 3 Schritten.
2368
Zum den Parametern:
Edge - gibt den zu betrachtenden Rand an. Dieser Wert sollte nicht zu klein sein, weil er sonst kaum einen Einfluß hat auf das Finden der Hell/Dunkel-Bereiche.
StartBlur - größere Werte steigern die Reichweite des Randes in das Bild hinein, machen aber auch die Hell/Dunkel-Aufteilung ungenauer.
DecreaseRate - soll das Problem von StartBlur reduzieren, indem es bei jedem Schritt den Wert von Blur reduziert.
Es gibt zwei Abbruchbedingungen
- zum einen die Anzahl der Schritte der rekursiven unterteilung
- zum anderen, wenn die durchschnittliche Abweichung der Helligkeit am Rand einen bestimmten Wert unterschreitet. Dieser Fall tritt zB bei schon sehr einfarbigen Flächen auf.
SmoothingSelection - der Gaußweichzeichner erzeugt manchmal relativ seltsame Muster, die mich so ein wenig an Moire erinnern.
Deswegen kann man die Hell/Dunkel-Auswahl selbst noch mal weichzeichnen. Jedoch ist das wieder ein Ungenauigkeitsfaktor.
SmoothingSelection wird in Abhängigkeit der Weichzeichenwertes gewählt.
Der Script funktioniert nur für Hell/Dunkel, bzw. nicht bei stark verschiedenen Farben.
Das ist zwar kein großes Problem, daß auch hinzukriegen, momentan bin ich aber noch mit dem Basis-Script unzufrieden und versuche da noch eine Verbesserung hinzukriegen.
(script-fu-register "script-fu-huisoft"
_"<Image>/Script-Fu/Utils/smartFill"
"Fills a selection with the average color of selections edge. Parameter edge classifies the size of the edge."
"Mathias Weitz"
"Mathias Weitz"
"07/11/05"
""
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-ADJUSTMENT _"Edge" '(10 2 100 1 1 1 0)
SF-ADJUSTMENT _"Start with Blur" '(200 1 1000 1 1 0 0)
SF-ADJUSTMENT _"Decrease Blur Rate" '(0.50 0.1 1 0.05 0.05 2 0)
SF-ADJUSTMENT _"max. Steps" '(6 0 10 1 1 0 0)
SF-ADJUSTMENT _"Devitation to stop" '(1 0 50 1 1 1 0)
SF-ADJUSTMENT _"Smoothing Selection" '(0.1 0 2 0.05 0.05 2 0)
)
(define (script-fu-huisoft image drawable edge failure decrease steps dev selblur)
(let ((work 0))
(gimp-image-undo-disable image)
(set! blur failure)
(set! i steps)
;(while (< i steps)
; (set! blur (* blur 2))
; (set! i (+ i 1))
;)
(set! work (car (gimp-layer-copy drawable 1)))
(gimp-image-add-layer image work -1)
(set! sel (car (gimp-selection-save image)))
(gimp-selection-none image)
(gimp-threshold sel 128 255)
;(set! selAll (car (gimp-selection-save image)))
; den Basis-Farbton feststellen
; dazu die Kante des Loches (in der Breite edge) messen
(gimp-selection-load sel)
(gimp-selection-grow image edge)
(set! selGrow (car (gimp-selection-save image)))
(gimp-selection-combine sel 1)
(set! valsCount (gimp-histogram drawable 0 0 255))
(set! pixelsCount (trunc (cadr (cdddr valsCount))))
(set! valsRed (gimp-histogram drawable 1 0 255))
(set! meanRed (trunc (car valsRed)))
(set! valsGreen (gimp-histogram drawable 2 0 255))
(set! meanGreen (trunc (car valsGreen)))
(set! valsBlue (gimp-histogram drawable 3 0 255))
(set! meanBlue (trunc (car valsBlue)))
(gimp-context-set-foreground (list meanRed meanGreen meanBlue))
;(gimp-context-set-foreground (list 0 255 0))
(set! descra "Pixels ")
(set! descra (string-append descra (number->string pixelsCount)))
(gimp-layer-set-name work descra)
; die Flaeche fuellen
(gimp-selection-load sel)
(gimp-edit-fill work 0)
(if (< 0 i)
(begin
(set! work (car (script-fu-huisoft-rek image work (- i 1) dev edge failure blur decrease selblur sel selGrow)))
(set! work (car (gimp-image-merge-down image work 0)))
))
;;(if (< dev stddevD) (set! work (car (gimp-image-merge-down image wd 0))))
(gimp-selection-load sel)
(gimp-image-remove-channel image sel)
(gimp-image-remove-channel image selGrow)
(gimp-image-undo-enable image)
(gimp-displays-flush)
))
; selHole ist der Bereich, der gefüllt werden soll
; selWork ist der Randbereich
(define (script-fu-huisoft-rek image drawable step dev edge failure blur decrease selblur selHole selWork)
(let ((worklayer 0) (selDark 0) (selBright 0) (qblur 0) (work 0) (work1 0) (work2 0) (workm 0) (wd 0) (wb 0) (descr1 0) (descr2 0) (i 0) (stddevB 0) (stddevD 0))
(set! worklayer (car (gimp-layer-copy drawable 1)))
(gimp-image-add-layer image worklayer -1)
; Ausblenden der anderen Auswahl
(gimp-selection-load selWork)
(gimp-selection-invert image)
(if (= 0 (car (gimp-selection-is-empty image)))
(begin
(gimp-edit-clear worklayer)
(gimp-layer-set-preserve-trans worklayer 1)
(gimp-selection-load selWork)
))
; Weichzeichenbereich
(gimp-selection-load selHole)
(gimp-selection-grow image edge)
(gimp-selection-combine selWork 3)
(gimp-selection-combine selHole 1)
(gimp-desaturate worklayer)
(plug-in-c-astretch 1 image worklayer)
(gimp-desaturate worklayer)
(plug-in-autostretch-hsv 1 image worklayer)
; Das Feld mit der Durchschnittsfarbe füllen
(set! valsCount (gimp-histogram worklayer 0 0 255))
(set! pixelsCount (trunc (cadr (cdddr valsCount))))
(set! stddevD (cadr valsCount))
(set! valsRed (gimp-histogram worklayer 1 0 255))
(set! meanRed (trunc (car valsRed)))
(set! valsGreen (gimp-histogram worklayer 2 0 255))
(set! meanGreen (trunc (car valsGreen)))
(set! valsBlue (gimp-histogram worklayer 3 0 255))
(set! meanBlue (trunc (car valsBlue)))
(if (= 0 pixelsCount) (set! meanRed 0))
(gimp-context-set-foreground (list meanRed meanGreen meanBlue))
;(gimp-context-set-foreground (list 127 127 127))
(gimp-selection-load selHole)
; Warum die Auswahl ein Pixel zu klein ist - keine Ahnung
(gimp-selection-grow image 1)
(gimp-edit-fill worklayer 0)
;nur für Test
;(set! worklayer (car (gimp-layer-copy worklayer 1)))
;(gimp-image-add-layer image worklayer -1)
; durch Weichzeichnen den Hell/Dunkel-Bereich erzeugen
(gimp-selection-load selHole)
(gimp-selection-grow image edge)
(plug-in-gauss 1 image worklayer blur blur 1)
;(plug-in-autostretch-hsv 1 image worklayer)
(plug-in-c-astretch 1 image worklayer)
;nur für Test
;(set! worklayer (car (gimp-layer-copy worklayer 1)))
;(gimp-image-add-layer image worklayer -1)
; Die Hell/Dunkel-Grenze ermitteln
(set! vals (gimp-histogram worklayer 0 0 255))
(set! mean (trunc (car vals)))
(gimp-threshold worklayer mean 255)
(if (< 0 selblur)
(begin
(plug-in-gauss 1 image worklayer (* selblur blur) (* selblur blur) 1)
(gimp-threshold worklayer 128 255)
))
; Nur für den Test
;(set! worklayer (car (gimp-layer-copy worklayer 1)))
;(gimp-image-add-layer image worklayer -1)
; Dunkle Seite
(gimp-by-color-select worklayer '(0 0 0) 0 2 FALSE 0 0 0)
(set! selDark (car (gimp-selection-save image)))
; Helle Seite
(gimp-by-color-select worklayer '(255 255 255) 0 2 FALSE 0 0 0)
(set! selBright (car (gimp-selection-save image)))
; Original wieder drauf
(set! workm (car (gimp-layer-copy drawable 1)))
(gimp-image-add-layer image workm -1)
(gimp-selection-load selHole)
(gimp-edit-clear workm)
; Farbe der dunklen Seite ermitteln
(gimp-selection-load selHole)
(gimp-selection-grow image edge)
(gimp-selection-combine selDark 3)
(gimp-selection-combine selHole 1)
(set! valsCount (gimp-histogram drawable 0 0 255))
(set! pixelsCount (trunc (cadr (cdddr valsCount))))
(set! stddevD (cadr valsCount))
(set! valsRed (gimp-histogram drawable 1 0 255))
(set! meanRed (trunc (car valsRed)))
(set! valsGreen (gimp-histogram drawable 2 0 255))
(set! meanGreen (trunc (car valsGreen)))
(set! valsBlue (gimp-histogram drawable 3 0 255))
(set! meanBlue (trunc (car valsBlue)))
;(if (= 0 pixelsCount) (set! meanRed 0))
(gimp-context-set-foreground (list meanRed meanGreen meanBlue))
;(gimp-context-set-foreground (list 255 0 0))
(gimp-selection-load selDark)
(gimp-selection-combine selHole 3)
(gimp-edit-fill worklayer 0)
(set! descr "Pixel ")
(set! descr (string-append descr (number->string pixelsCount)))
(set! descr (string-append descr ", Color "))
(set! descr (string-append descr (number->string meanRed)))
(set! descr (string-append descr ","))
(set! descr (string-append descr (number->string meanGreen)))
(set! descr (string-append descr ","))
(set! descr (string-append descr (number->string meanBlue)))
(set! descr (string-append descr ", StdDev: "))
(set! descr (string-append descr (number->string stddevD)))
(gimp-layer-set-name worklayer descr)
; Helle Seite ausmalen
; Farbe der hellen Seite ermitteln
(gimp-selection-load selHole)
(gimp-selection-grow image edge)
(gimp-selection-combine selBright 3)
(gimp-selection-combine selHole 1)
(set! valsCount (gimp-histogram drawable 0 0 255))
(set! pixelsCount (trunc (cadr (cdddr valsCount))))
(set! stddevB (cadr valsCount))
(set! valsRed (gimp-histogram drawable 1 0 255))
(set! meanRed (trunc (car valsRed)))
(set! valsGreen (gimp-histogram drawable 2 0 255))
(set! meanGreen (trunc (car valsGreen)))
(set! valsBlue (gimp-histogram drawable 3 0 255))
(set! meanBlue (trunc (car valsBlue)))
;(if (= 0 pixelsCount) (set! meanGreen 0))
(gimp-context-set-foreground (list meanRed meanGreen meanBlue))
;(gimp-context-set-foreground (list 0 255 0))
(gimp-selection-load selBright)
(gimp-selection-combine selHole 3)
(gimp-edit-fill worklayer 0)
(set! descr "Pixel ")
(set! descr (string-append descr (number->string pixelsCount)))
(set! descr (string-append descr ", Color "))
(set! descr (string-append descr (number->string meanRed)))
(set! descr (string-append descr ","))
(set! descr (string-append descr (number->string meanGreen)))
(set! descr (string-append descr ","))
(set! descr (string-append descr (number->string meanBlue)))
(set! descr (string-append descr ", StdDev: "))
(set! descr (string-append descr (number->string stddevB)))
(gimp-layer-set-name worklayer descr)
(set! work (car (gimp-image-merge-down image workm 0)))
(set! qblur (* blur decrease))
(if (< 0 step)
(begin
(set! i (- step 1))
; die neue Unterteilung dunkel
(if (< dev stddevD)
(set! wd (car (script-fu-huisoft-rek image work i dev edge failure qblur decrease selblur selHole selDark)))
)
; die neue Unterteilung hell
(if (< dev stddevB)
(set! wb (car (script-fu-huisoft-rek image work i dev edge failure qblur decrease selblur selHole selBright)))
)
(if (< dev stddevD) (set! work (car (gimp-image-merge-down image wd 0))))
(if (< dev stddevB) (set! work (car (gimp-image-merge-down image wb 0))))
(gimp-displays-flush)
))
(gimp-image-remove-channel image selDark)
(gimp-image-remove-channel image selBright)
(cons work ())
))
Es geht darum, eine Auswahl, die man zB über einen Riß im Bild gelegt hat, so zu füllen, daß die Füllung sich an den Rand angleicht.
Die erste Idee von mir dazu war, daß man die Auswahl etwas vergrößert, ständig ein Weichzeichnen anwendet, und den Rand wieder draufsetzt.
Mit der Zeit füllt sich so die Auswahl mit den Farben vom Rand her auf.
Jedoch das dauert auch dementsprechend lange.
Die jetzige Methode basiert auf der Idee, daß ich auch vom Rand her die Auswahl weichzeichnen lasse, aber ich nutze das, um die Auswahl rekursiv nach unterschiedlichen Bereichen zu unterteilen.
Diese Bereiche fülle ich mit dem Durchschnittswert des Randes.
Unten habe ich mal die einzelnen Schritte dargestellt (etwas aufgearbeitet).
2367
Durch rekursives Wiederholen des Algorithmus auf die nun einzelnen Abschnitte hatte ich gehofft, daß ich so langsam aber sicher nun eine immer genauere Hell/Dunkel-Aufteilung ergibt.
Nicht zu sagen, daß der Script meine Idee zwar umsetzt, daß Ergebniss ist aber nicht wie erwartet präzise.
Hier ist das Beispiel mal mit 0,1,2 und 3 Schritten.
2368
Zum den Parametern:
Edge - gibt den zu betrachtenden Rand an. Dieser Wert sollte nicht zu klein sein, weil er sonst kaum einen Einfluß hat auf das Finden der Hell/Dunkel-Bereiche.
StartBlur - größere Werte steigern die Reichweite des Randes in das Bild hinein, machen aber auch die Hell/Dunkel-Aufteilung ungenauer.
DecreaseRate - soll das Problem von StartBlur reduzieren, indem es bei jedem Schritt den Wert von Blur reduziert.
Es gibt zwei Abbruchbedingungen
- zum einen die Anzahl der Schritte der rekursiven unterteilung
- zum anderen, wenn die durchschnittliche Abweichung der Helligkeit am Rand einen bestimmten Wert unterschreitet. Dieser Fall tritt zB bei schon sehr einfarbigen Flächen auf.
SmoothingSelection - der Gaußweichzeichner erzeugt manchmal relativ seltsame Muster, die mich so ein wenig an Moire erinnern.
Deswegen kann man die Hell/Dunkel-Auswahl selbst noch mal weichzeichnen. Jedoch ist das wieder ein Ungenauigkeitsfaktor.
SmoothingSelection wird in Abhängigkeit der Weichzeichenwertes gewählt.
Der Script funktioniert nur für Hell/Dunkel, bzw. nicht bei stark verschiedenen Farben.
Das ist zwar kein großes Problem, daß auch hinzukriegen, momentan bin ich aber noch mit dem Basis-Script unzufrieden und versuche da noch eine Verbesserung hinzukriegen.
(script-fu-register "script-fu-huisoft"
_"<Image>/Script-Fu/Utils/smartFill"
"Fills a selection with the average color of selections edge. Parameter edge classifies the size of the edge."
"Mathias Weitz"
"Mathias Weitz"
"07/11/05"
""
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-ADJUSTMENT _"Edge" '(10 2 100 1 1 1 0)
SF-ADJUSTMENT _"Start with Blur" '(200 1 1000 1 1 0 0)
SF-ADJUSTMENT _"Decrease Blur Rate" '(0.50 0.1 1 0.05 0.05 2 0)
SF-ADJUSTMENT _"max. Steps" '(6 0 10 1 1 0 0)
SF-ADJUSTMENT _"Devitation to stop" '(1 0 50 1 1 1 0)
SF-ADJUSTMENT _"Smoothing Selection" '(0.1 0 2 0.05 0.05 2 0)
)
(define (script-fu-huisoft image drawable edge failure decrease steps dev selblur)
(let ((work 0))
(gimp-image-undo-disable image)
(set! blur failure)
(set! i steps)
;(while (< i steps)
; (set! blur (* blur 2))
; (set! i (+ i 1))
;)
(set! work (car (gimp-layer-copy drawable 1)))
(gimp-image-add-layer image work -1)
(set! sel (car (gimp-selection-save image)))
(gimp-selection-none image)
(gimp-threshold sel 128 255)
;(set! selAll (car (gimp-selection-save image)))
; den Basis-Farbton feststellen
; dazu die Kante des Loches (in der Breite edge) messen
(gimp-selection-load sel)
(gimp-selection-grow image edge)
(set! selGrow (car (gimp-selection-save image)))
(gimp-selection-combine sel 1)
(set! valsCount (gimp-histogram drawable 0 0 255))
(set! pixelsCount (trunc (cadr (cdddr valsCount))))
(set! valsRed (gimp-histogram drawable 1 0 255))
(set! meanRed (trunc (car valsRed)))
(set! valsGreen (gimp-histogram drawable 2 0 255))
(set! meanGreen (trunc (car valsGreen)))
(set! valsBlue (gimp-histogram drawable 3 0 255))
(set! meanBlue (trunc (car valsBlue)))
(gimp-context-set-foreground (list meanRed meanGreen meanBlue))
;(gimp-context-set-foreground (list 0 255 0))
(set! descra "Pixels ")
(set! descra (string-append descra (number->string pixelsCount)))
(gimp-layer-set-name work descra)
; die Flaeche fuellen
(gimp-selection-load sel)
(gimp-edit-fill work 0)
(if (< 0 i)
(begin
(set! work (car (script-fu-huisoft-rek image work (- i 1) dev edge failure blur decrease selblur sel selGrow)))
(set! work (car (gimp-image-merge-down image work 0)))
))
;;(if (< dev stddevD) (set! work (car (gimp-image-merge-down image wd 0))))
(gimp-selection-load sel)
(gimp-image-remove-channel image sel)
(gimp-image-remove-channel image selGrow)
(gimp-image-undo-enable image)
(gimp-displays-flush)
))
; selHole ist der Bereich, der gefüllt werden soll
; selWork ist der Randbereich
(define (script-fu-huisoft-rek image drawable step dev edge failure blur decrease selblur selHole selWork)
(let ((worklayer 0) (selDark 0) (selBright 0) (qblur 0) (work 0) (work1 0) (work2 0) (workm 0) (wd 0) (wb 0) (descr1 0) (descr2 0) (i 0) (stddevB 0) (stddevD 0))
(set! worklayer (car (gimp-layer-copy drawable 1)))
(gimp-image-add-layer image worklayer -1)
; Ausblenden der anderen Auswahl
(gimp-selection-load selWork)
(gimp-selection-invert image)
(if (= 0 (car (gimp-selection-is-empty image)))
(begin
(gimp-edit-clear worklayer)
(gimp-layer-set-preserve-trans worklayer 1)
(gimp-selection-load selWork)
))
; Weichzeichenbereich
(gimp-selection-load selHole)
(gimp-selection-grow image edge)
(gimp-selection-combine selWork 3)
(gimp-selection-combine selHole 1)
(gimp-desaturate worklayer)
(plug-in-c-astretch 1 image worklayer)
(gimp-desaturate worklayer)
(plug-in-autostretch-hsv 1 image worklayer)
; Das Feld mit der Durchschnittsfarbe füllen
(set! valsCount (gimp-histogram worklayer 0 0 255))
(set! pixelsCount (trunc (cadr (cdddr valsCount))))
(set! stddevD (cadr valsCount))
(set! valsRed (gimp-histogram worklayer 1 0 255))
(set! meanRed (trunc (car valsRed)))
(set! valsGreen (gimp-histogram worklayer 2 0 255))
(set! meanGreen (trunc (car valsGreen)))
(set! valsBlue (gimp-histogram worklayer 3 0 255))
(set! meanBlue (trunc (car valsBlue)))
(if (= 0 pixelsCount) (set! meanRed 0))
(gimp-context-set-foreground (list meanRed meanGreen meanBlue))
;(gimp-context-set-foreground (list 127 127 127))
(gimp-selection-load selHole)
; Warum die Auswahl ein Pixel zu klein ist - keine Ahnung
(gimp-selection-grow image 1)
(gimp-edit-fill worklayer 0)
;nur für Test
;(set! worklayer (car (gimp-layer-copy worklayer 1)))
;(gimp-image-add-layer image worklayer -1)
; durch Weichzeichnen den Hell/Dunkel-Bereich erzeugen
(gimp-selection-load selHole)
(gimp-selection-grow image edge)
(plug-in-gauss 1 image worklayer blur blur 1)
;(plug-in-autostretch-hsv 1 image worklayer)
(plug-in-c-astretch 1 image worklayer)
;nur für Test
;(set! worklayer (car (gimp-layer-copy worklayer 1)))
;(gimp-image-add-layer image worklayer -1)
; Die Hell/Dunkel-Grenze ermitteln
(set! vals (gimp-histogram worklayer 0 0 255))
(set! mean (trunc (car vals)))
(gimp-threshold worklayer mean 255)
(if (< 0 selblur)
(begin
(plug-in-gauss 1 image worklayer (* selblur blur) (* selblur blur) 1)
(gimp-threshold worklayer 128 255)
))
; Nur für den Test
;(set! worklayer (car (gimp-layer-copy worklayer 1)))
;(gimp-image-add-layer image worklayer -1)
; Dunkle Seite
(gimp-by-color-select worklayer '(0 0 0) 0 2 FALSE 0 0 0)
(set! selDark (car (gimp-selection-save image)))
; Helle Seite
(gimp-by-color-select worklayer '(255 255 255) 0 2 FALSE 0 0 0)
(set! selBright (car (gimp-selection-save image)))
; Original wieder drauf
(set! workm (car (gimp-layer-copy drawable 1)))
(gimp-image-add-layer image workm -1)
(gimp-selection-load selHole)
(gimp-edit-clear workm)
; Farbe der dunklen Seite ermitteln
(gimp-selection-load selHole)
(gimp-selection-grow image edge)
(gimp-selection-combine selDark 3)
(gimp-selection-combine selHole 1)
(set! valsCount (gimp-histogram drawable 0 0 255))
(set! pixelsCount (trunc (cadr (cdddr valsCount))))
(set! stddevD (cadr valsCount))
(set! valsRed (gimp-histogram drawable 1 0 255))
(set! meanRed (trunc (car valsRed)))
(set! valsGreen (gimp-histogram drawable 2 0 255))
(set! meanGreen (trunc (car valsGreen)))
(set! valsBlue (gimp-histogram drawable 3 0 255))
(set! meanBlue (trunc (car valsBlue)))
;(if (= 0 pixelsCount) (set! meanRed 0))
(gimp-context-set-foreground (list meanRed meanGreen meanBlue))
;(gimp-context-set-foreground (list 255 0 0))
(gimp-selection-load selDark)
(gimp-selection-combine selHole 3)
(gimp-edit-fill worklayer 0)
(set! descr "Pixel ")
(set! descr (string-append descr (number->string pixelsCount)))
(set! descr (string-append descr ", Color "))
(set! descr (string-append descr (number->string meanRed)))
(set! descr (string-append descr ","))
(set! descr (string-append descr (number->string meanGreen)))
(set! descr (string-append descr ","))
(set! descr (string-append descr (number->string meanBlue)))
(set! descr (string-append descr ", StdDev: "))
(set! descr (string-append descr (number->string stddevD)))
(gimp-layer-set-name worklayer descr)
; Helle Seite ausmalen
; Farbe der hellen Seite ermitteln
(gimp-selection-load selHole)
(gimp-selection-grow image edge)
(gimp-selection-combine selBright 3)
(gimp-selection-combine selHole 1)
(set! valsCount (gimp-histogram drawable 0 0 255))
(set! pixelsCount (trunc (cadr (cdddr valsCount))))
(set! stddevB (cadr valsCount))
(set! valsRed (gimp-histogram drawable 1 0 255))
(set! meanRed (trunc (car valsRed)))
(set! valsGreen (gimp-histogram drawable 2 0 255))
(set! meanGreen (trunc (car valsGreen)))
(set! valsBlue (gimp-histogram drawable 3 0 255))
(set! meanBlue (trunc (car valsBlue)))
;(if (= 0 pixelsCount) (set! meanGreen 0))
(gimp-context-set-foreground (list meanRed meanGreen meanBlue))
;(gimp-context-set-foreground (list 0 255 0))
(gimp-selection-load selBright)
(gimp-selection-combine selHole 3)
(gimp-edit-fill worklayer 0)
(set! descr "Pixel ")
(set! descr (string-append descr (number->string pixelsCount)))
(set! descr (string-append descr ", Color "))
(set! descr (string-append descr (number->string meanRed)))
(set! descr (string-append descr ","))
(set! descr (string-append descr (number->string meanGreen)))
(set! descr (string-append descr ","))
(set! descr (string-append descr (number->string meanBlue)))
(set! descr (string-append descr ", StdDev: "))
(set! descr (string-append descr (number->string stddevB)))
(gimp-layer-set-name worklayer descr)
(set! work (car (gimp-image-merge-down image workm 0)))
(set! qblur (* blur decrease))
(if (< 0 step)
(begin
(set! i (- step 1))
; die neue Unterteilung dunkel
(if (< dev stddevD)
(set! wd (car (script-fu-huisoft-rek image work i dev edge failure qblur decrease selblur selHole selDark)))
)
; die neue Unterteilung hell
(if (< dev stddevB)
(set! wb (car (script-fu-huisoft-rek image work i dev edge failure qblur decrease selblur selHole selBright)))
)
(if (< dev stddevD) (set! work (car (gimp-image-merge-down image wd 0))))
(if (< dev stddevB) (set! work (car (gimp-image-merge-down image wb 0))))
(gimp-displays-flush)
))
(gimp-image-remove-channel image selDark)
(gimp-image-remove-channel image selBright)
(cons work ())
))