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)
)
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)
)