2016-05-13 6 views
0

In Kissen können wir Bild mit Hilfe von Filtern verschwimmen:Objektiv Blur-Effekt mit Python Kissen

blurred_image = original_image.filter (ImageFilter.BLUR)

Aber das ist kein echter Linseneffekt. Ist es möglich, einen benutzerdefinierten Filter zu verwenden? Irgendein Beispiel?

(Nummer 2 ist, was ich brauche. Nummer 3 ist, welche Kissen Blurfilter.)

enter image description here

+0

Was ist ein echter Linseneffekt? –

+1

Defokussierungsunschärfe ist ungefähr Faltung mit einem Bild Ihrer beabsichtigten Öffnung (vielleicht ein Kreis?). Wenn Sie etwas komplizierteres wollen, erklären Sie bitte genau was Sie wollen. – harold

+0

Ein echter Linseneffekt ist so etwas wie ein echter Kameraunschärfeeffekt. Ich bin mir sicher, dass du weißt, dass es eine ganz andere Front ist als die einfache Unschärfe. – Farsheed

Antwort

1

Sie Tiefe, um die Filterung für diese Aufgabe hinzufügen müssen. Linsenunschärfe verwischt mehr für entferntere Distanzen zu fokussierten. Ich erwarte nicht, dass Sie die Tiefe jedes Pixels wurde so statt:

  1. Masken erstellen für jede Tiefenschicht

    Segmentate das Bild und wählte dann manuell die Tiefe für jedes Objekt.

    • fokussierte Objekt
    • weit Hintergrund
    • in der Nähe Hintergrund/Vordergrund

    Dann sind Sie auch zwischen den unfokussiert Schichten zu schaffen glatte Steigung zwischen ihnen interpolieren können: Zum Beispiel sollten Sie zumindest diese Schichten erkennen . Nur die fokussierte Schicht sollte scharf bleiben. Von all dieser Tiefenkarte erstellen (blur -ig), wobei jedes Pixel wird Intensität haben:

    i=|depth-focused_depth| 
    

    Normalized bis zu einem gewissen nutzbaren Intervall wie float <0.0,1.0> oder int <0,256> Verwischung.

  2. Verwendung maskiert Unschärfe wiht dieser Tiefe Maske als Maske

    How to blur some portion of Image siehe

    Also, wenn alle zusammen ich habe dies:

    example

    Wo die Maske Unschärfe war manuell (Hand) lackiert dann verwischt die nahe und weit außerhalb des Fokus Teile (grau, schwarz) zusammen verlassen fokussierten Teil (weiß) ohne Änderung.Beachten Sie, dass in dieser Maske weiß bedeutet, dass keine Verwischung so müssen Sie die i

    i(x,y) = white - |depth(x,y)-focused_depth| 
    

[Notizen] invertieren

Schritt # 1 kann für einige vordefinierte Masken ähnlich geformt ausgetauscht werden Objekt auf dem Bild, das wie viele Fotos bearbeitet wurde, haben das fokussierte Objekt zentriert, so dass die Tiefenmasken sehr ähnlich für ähnlich geformte Objekte (wie Personen) sind.

+1

Dies scheint immer noch Gaussian Blur zu verwenden. Ich denke, es ging darum, Objektivunschärfe/Bokeh nachzuahmen. https://en.wikipedia.org/wiki/Bokeh#Emulation –

+0

+1 @spektre für Ihre Antwort. Aber ich brauche Bokeh wie Effekt. Photoshop macht das, was ich brauche, in seinem Objektiv-Weichzeichnungsfilter. Aber ich muss es in meinem Code mit Pillow tun. – Farsheed

0

Um die Unschärfe der Linse zu simulieren, müssen Sie besonders auf den Bokeh-Effekt achten. Um den Bokeh-Effekt zu erzeugen, müssen Sie eine binäre Kernel-Unschärfe-Methode verwenden (wie Disc-Unschärfe, bei der Sie alle Pixel um das aktuelle Pixel in einer Schüsselform mitteln). Außerdem müssen Sie das Bild gamma korrigieren, so dass die dunklen Teile wirklich dunkel werden, so dass nur die hellen Flecken das Bokeh erzeugen. Sie können das Bild dann ohne Gammakorrektur wieder unscharf machen und das Maximum von beiden erhalten.

Pseudo-Code:
gammaCorrectedImage = Bild^3 // Oder was auch immer Macht für Sie arbeitet.
bokeh = discBlur (gammaCorrectedImage)
bokeh = WürfelRoot (Bild) // Um ​​das ursprüngliche Gamma zurück zu bekommen.
blurImage = discBlur (Bild)
finalImage = max (Bokeh, blurImage)

bekam ich einen nahe genug Ergebnis. enter image description here