PDA

Vollständige Version anzeigen : [Script] Bluescreen


flashnfantasy
07.04.2007, 17:08
Die Idee ist relativ simpel:
Ich habe zwei Bilder, auf dem einen Bild ist zusätzlich noch ein Gegenstand zu sehen. Im Beispiel ist das die braune Flasche.
Nun will ich diese braune Flasche aus dem Bild rauslösen.

6526

Bisher ging das relativ aufwendig mit 'intelligenter Schere', Zauberstab, Pfade etc... es gibt da tausende von Methoden. Alle Methoden bisher hatten das Problem, daß harte und weiche Übergänge immer gleich behandelt wurden.

Was ich jetzt haben wollte war eine Art Bluescreen. Es ist leichter den Hintergrund von einem Gegenstand zu rekonstruieren, noch leichter ist es, wenn man eine einheitliche Farbe oder ein vorher, nachher-Photo hat.

Das Problem ist, daß die Qualität des Herauslösens eigentlich abhängt von der Differenz zwischen den beiden Bildern. Es ist eigentlich ein Unterschied, ob man einen blauen Gegenstand von einem hellblauen oder hellroten Hintergrund lösen will.

Gleich vorneweg, auch dieses Script löst dieses Problem nicht 100%, aber es erreicht ein ziemlich brauchbares Ergebnis.

Man wählt die Ebene mit dem Gegenstand, erster Parameter ist die Ebene ohne den Gegenstand (Bluescreen-Ebene).

Die nächste Auswahl gibt ein paar Erfahrungsparameter für die Alpha-Werte wieder. Wer will kann diese Werte selber per Hand im Ergebniss modifizieren (das empfehle ich sogar, weil das sehr präzise ist).

Das Ergebniss sind zwei Ebenen mit viel Alpha. Die untere Ebene extrahiert den Gegenstand in Abhängigkeit der Differenz zum Hintergrund, die zweite Ebene berechnet aus der Differenz des ersten Ergebnisses und der Differenz der Ausgangsebenen einen Korrekturfaktor.
Beide Ergebniss-Ebenen zusammen sind eigentlich der extrahierte Gegenstand.
Ich habe die beiden nur deswegen nicht zusammengefügt, weil das
a.) kein Problem ist, das manuell zu machen
b.) meist ich mit den Alpha-Kanälen das Ergebniss nochmalst überarbeite

Und so sähe das Ergebniss aus:

6527

Man sieht, daß sich der Stift in der Lage geändert hat. Zudem wird der Unterschied, den der Schatten im Bild erzeugt hat, ebenfalls angezeigt.

Wer diesen Script zum geplanten Freistellen nutzen will, der wird sich wahrscheinlich einen ruhigeren Hintergrund suchen. Ich habe dieses Beispiel gewählt, um die Leistungsfähigleit dieses Scriptes zu testen.

(script-fu-register "script-fu-bscreen"
_"<Image>/Script-Fu/Photo/BlueScreen"
"tata"
"Mathias Weitz"
"Mathias Weitz"
"06/04/07"
"RGB RGBA"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-DRAWABLE "Hintergrund" 0
SF-OPTION _"Blend" '(_"None"
_"Half"
_"Quarter"
_"Low Eight")
)

(define (script-fu-bscreen img drawable complayer blend)

(gimp-image-undo-disable img)
(gimp-selection-none img)
(set! dmode 6)

(set! background (car(gimp-layer-copy complayer 0)))
(gimp-image-add-layer img background 0)
(set! toplayer (car (gimp-layer-copy drawable 0)))
(gimp-image-add-layer img toplayer 0)
(gimp-layer-set-mode toplayer dmode)
(set! layerP (car (gimp-image-merge-down img toplayer 0)))
(gimp-desaturate layerP)
(plug-in-c-astretch 0 img layerP)

(set! toplayer (car (gimp-layer-copy drawable 0)))
(gimp-image-add-layer img toplayer 0)
(set! layerPmask (car (gimp-layer-create-mask layerP 5)))
(gimp-layer-add-mask toplayer layerPmask)

(gimp-image-remove-layer img layerP)

;(gimp-layer-set-preserve-trans toplayer TRUE)
(gimp-selection-clear img)
(gimp-selection-load layerPmask)
(gimp-selection-invert img)
(gimp-layer-remove-mask toplayer 1)
(gimp-edit-clear toplayer)
(gimp-selection-clear img)
(gimp-layer-set-name toplayer "Normal Extract Differences")

; Qualitaetssteigerung Layer 1
(set! background (car(gimp-layer-copy complayer 0)))
(gimp-image-add-layer img background 0)
(set! toplayerQ (car (gimp-layer-copy drawable 0)))
(gimp-image-add-layer img toplayerQ 0)
(gimp-layer-set-mode toplayerQ dmode)
(set! layerP (car (gimp-image-merge-down img toplayerQ 0)))
(gimp-desaturate layerP)
; Qualitaetssteigerung Layer 1
(set! background (car(gimp-layer-copy complayer 0)))
(gimp-image-add-layer img background 0)
(set! background (car(gimp-layer-copy complayer 0)))
(gimp-image-add-layer img background 0)
(set! toplayerQ (car (gimp-layer-copy toplayer 0)))
(gimp-image-add-layer img toplayerQ 0)
(set! layerPQ (car (gimp-image-merge-down img toplayerQ 0)))
(gimp-layer-set-mode layerPQ dmode)
(set! layerPQ (car (gimp-image-merge-down img layerPQ 0)))
(gimp-desaturate layerPQ)
(gimp-layer-set-mode layerPQ dmode)
(set! layerPQ (car (gimp-image-merge-down img layerPQ 0)))
;
; Hier ein Stretch... ?
;
(plug-in-c-astretch 0 img layerPQ)
;
(set! toplayerQ (car (gimp-layer-copy drawable 0)))
(gimp-image-add-layer img toplayerQ 0)
(set! layerPQmask (car (gimp-layer-create-mask layerPQ 5)))
(gimp-layer-add-mask toplayerQ layerPQmask)
;
; Hier individuelle Einstellung
;
(if (= blend 1)
(gimp-levels layerPQmask 0 160 255 1 0 255)
)
(if (= blend 2)
(gimp-levels layerPQmask 0 192 255 1 0 255)
)
(if (= blend 3)
(gimp-levels layerPQmask 0 192 204 1 0 255)
)
; Die Maske fuer die Qualitaetssteigerung löschen
(gimp-image-remove-layer img layerPQ)
; zweite Schicht entfernen
(gimp-selection-clear img)
(gimp-selection-load layerPQmask)
(gimp-selection-invert img)
(gimp-layer-remove-mask toplayerQ 1)
(gimp-edit-clear toplayerQ)
(gimp-selection-clear img)
(gimp-layer-set-name toplayerQ "Blended Extract Differences")

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

eleanora
07.04.2007, 18:02
Hallo Flash

ich war neugierig was das Script macht.

Also es kann Motive freistellen, wie sage ich dem Script aber, welches Motiv es freistellen soll?

Ich habe ein Bild mit Gimp geöffnet und einen Bereich ausgewählt, in meinem Fall eine Blüte an einem Busch.

Leider bekomme ich während des Ablaufs des Scriptes zwei Fehlermeldungen:

Masken können nicht zu einer Ebene ohne Alphakanal hinzufügt werden.

und

Skript-Fu Fehler beim Ausführen von
(script-fu-bscreen 1 2 2 2)
ERROR: Procedural database execution failed:
(gimp_levels 37 0 192 255 1 0 255)

ich bin mir nicht sicher, ob das Script von mir irgendwelche Informationen benötigt, oder ob das Script bei mir nicht funktioniert.

Vielleicht erklärst du nochmal, was für Infos man dem Script auf welche Weise geben muss.

Gruß Eleanora ;)

flashnfantasy
07.04.2007, 18:17
Ups...

Etwas ganz wichtiges (hatte ich vergessen zu sagen)

die beiden Ebenen müssen im gleichen Bild sein

Dann müsste es klappen.

eleanora
07.04.2007, 18:33
Also brauche ich ein Bild auf dem das Motiv schon drauf ist und eines, wo es noch nicht drauf ist.
Beide öffne ich in einem Bild und das Script löst das Motiv von der Ebene auf der es eingefügt ist?

flashnfantasy
07.04.2007, 19:10
So sollte es funktionieren.

Wobei ich relativ häufig den Hintergrund rekonstruiere zu einem Photo.

Es zeigt sich auch, daß das Script nur eine Ergänzung ist, und nur dort gut funktioniert, wo die Kontraste zum Hintergrund entsprechend stark sind.

Bei dem Bild unten hat der Script gerade im Bereich Haare (was immer sehr schwierig ist) und T-Shirt super Ergebnisse geliefert.

Probleme bekam das Script mit der Haut. Dort habe ich dann ganz normal mit dem Radiergummi und weichen Pinsel gearbeitet, und eine zweite Ebene über dem Ergebniss des Scriptes erzeugt. Die Kombination von beiden Ergebnissen ergibt das Bild unten.

Vorallem bei den Haaren ist das Ergebniss mit Ausschneidewerkzeugen kaum zu erreichen !!!

6531

abraess
08.04.2007, 08:17
Hallo, irgendwie kapiere ich nicht was machen soll da ständig Fehlermeldung und mach mal sogar das sich mein Gimp beendet. Wobei unter Bluescreen eher das umgekert von den verstehe von was dieses Script macht. das was mit den entsprechen Schatten in ein Bild einfügt.
frohe Ostern
Andreas Braess

schumaml
08.04.2007, 10:21
Er wäre mal ganz interessant zu wissen, mit welchen GIMP-Versionen das Skript eigentlich laufen soll. Bin mir ziemlich sicher, dass es das mit 2.3 nicht mehr tut (wegen set! auf nicht gebundene Variablen, zum Beispiel).

flashnfantasy
08.04.2007, 12:00
Laufen sollte das auf 2.2.13...

Ich werde das Script trotzdem nochmals überarbeiten, so daß die beiden Ebenen in verschiedenen Fenstern sein können (das könnte nämlich ein Fehler sein).

Das ein fehlender Alpha-Kanal ein Fehler sein könnte glaube ich nicht, weil alle Operationen auf einer Kopie der Ebene stattfinden - und da bin ich der festen Überzeugung, daß jede Ebene, die nicht Hintergrundebene ist, automatisch einen Alpha-Kanal hat.

Ansonste würde das mich wundern, wenn das Script so buggy ist, weil da ist nicht kompliziertes drinnen.

flashnfantasy
09.04.2007, 18:19
Muß mich erstmal selbst korrigieren.
Eine in Scheme kopierte Ebene hat nicht automatisch einen Alpha-Kanal. Ich will da aber jetzt nicht weiter forschen, warum das nicht automatisch geht, es wird jetzt einfach der Alpha-Kanal hinzugefügt, falls er fehlt.
In den neuen Script können die Ebenen auch in unterschiedlichen Images sein, er fügt die Ebene automatisch ein.
Folgendes klappt nicht: wenn die Ebene und die Blue-Screen-Ebene unterschiedlich groß sind.

Nochmals ein Beispiel unten. Habe da mal was schweres gewählt, und das Extrahieren klappt nur teilweise.
Was man nicht sieht, aber was sehr schön ist - da wo die Kontraste gut sind, macht er ein ziemlich gutes Alpha-Alias.

6539

Ich will es noch mit Photos ausprobieren, in mit GIMP erzeugten Bilder schafft er ziemlich gut, den Blue-Screen-Effekt umzusetzen. Probleme kriegt das Script da, wo viel Alpha-Blending nötig wäre - was bei Photos zB bei Haaren oder Unschärfe gebraucht würde.

Ansonsten, ich halte die Luft an und warte auf eine stabile Version von GIMP 2.4 und dem dort enthaltenen SIOX - ich glaube, dann geht es richtig rund, dann werde ich mich nicht mehr von GIMP lösen können.

eleanora
09.04.2007, 21:06
Hi

na bei mir funktionierte es nicht, weil ich die Anwendung erst falsch verstanden habe, eine Vorgehensweise wie diese, dass man ein Motiv aus einem Hintergrund herauslösen möchte, von dem man schon ein Bild ohne hat, ist ungewöhnlich und für mich bislang nicht notwendig gewesen. Wenn, dann montiere ich Motive irgendwo raus, speicheres sie als xcf und füge sie anschließend irgendwo ein. Ich achte darauf, dass das freigestellte Motiv erhalten bleibt.

Aber ich werde schauen, ob ich nicht doch irgendwo verwendung für das Script finden werde.

Gruß Eleanora ;)

houz
09.04.2007, 22:17
Gerade für das Freistellen ist das Script halt gedacht. Statt mühsam alles mit Ebenenmaske oder vergleichbarem auszuschneiden muss man halt zusätzlich noch ein zweites Foto machen und wird dann von dem Script unterstützt.