[PYTHON] Vorschlag des Kuwahara-Filters als fotografischer Ausdruck

Einführung

** Was ist Kuwahara Filter ** Eine Erläuterung des Kuwabara-Filters finden Sie unter oben.

Diesmal

Dieses Mal machte ich am Ende des Vorstehenden einen kurzen Vorschlag.

"Es könnte interessant sein, eine Tiefenkarte zu haben und die Größe der quadratischen Fläche entsprechend anzupassen ..."

Ich würde es gerne versuchen.

Diese Idee ist, dass wenn das Hauptmotiv nicht klar ist (irgendwo unscharf), es eher wie ein Hintergrund als wie ein Gemälde aussieht, verglichen mit dem vorherigen Bild, das eine konstante Seite der quadratischen Fläche hat und gefiltert wird. Es wurde basierend auf erhalten.

Implementierung

Als Antwort auf den vorherigen Artikel gab es eine Meinung, dass die Bedeutung des Codes nicht verständlich (schwierig) war, also schrieb ich ihn in den "Sonomanma" -Code, der außerhalb der Berechnungsgeschwindigkeit liegt. Es würde jedoch viel Zeit in Anspruch nehmen, Python zu viele Schleifen zu lassen, da dies viel Ausführungszeit in Anspruch nimmt. Daher habe ich den JIT-Compiler verwendet, um zu helfen. Für diejenigen, die nicht über Numba (eine Bibliothek mit JIT) verfügen, Verwendung der JIT-Compiler-Bibliothek Numba zur drastischen Beschleunigung des Python-Codes Bitte beziehen Sie sich auf 02/155433).

Kuwahara_with_Depth.py


import matplotlib.pyplot as plt
import numpy as np
import cv2
from numba import jit


@jit
def mean(arr):
    h, w, c = arr.shape
    avg = np.array([0]*c)
    for i in range(h):
        for j in range(w):
            for k in range(c):
                avg[k] += arr[i, j, k]
    return avg/(h*w)


@jit
def var(arr, mean):
    h, w, c = arr.shape
    vari = 0
    for i in range(h):
        for j in range(w):
            for k in range(c):
                vari += (arr[i, j, k]-mean[k])**2
    return vari


@jit
def kuwahara_with_depth(pic, r, r_min, depth):
    h, w, c = pic.shape
    out = np.empty_like(pic)
    pic = np.pad(pic, ((r, r), (r, r), (0, 0)), "edge")
    depth = depth/depth.max()
    surr = ((1, 0), (0, 1), (1, 1))
    for i in range(h):
        for j in range(w):
            dr = max(r_min, int(depth[i, j]*r))
            arr = pic[i+r-dr:i+r, j+r-dr:j+r]
            avg = mean(arr)
            var_min = var(arr, avg)
            color = avg
            for s, t in surr:
                arr = pic[i+r-(1-s)*dr:i+r+s*dr, j+r-(1-t)*dr:j+r+t*dr]
                avg = mean(arr)
                vari = var(arr, avg)
                if vari < var_min:
                    color = avg
                    var_min = vari
            out[i, j] = color
    return out


def main(picpath, r, r_min, rate, depthpath): #Eingabebildpfad, Maximalwert auf einer Seite des quadratischen Bereichs, Minimalwert auf einer Seite des quadratischen Bereichs, Bildgrößenreduzierungsverhältnis, Tiefenkartenpfad
    pic = np.array(plt.imread(picpath))
    pic = cv2.resize(pic, (int(pic.shape[1]*rate), int(pic.shape[0]*rate)))
    depth = cv2.resize(np.array(plt.imread(depthpath)[:, :, 0]), (pic.shape[1], pic.shape[0]))
    # depth=cv2.resize(np.rot90(np.array(plt.imread(depthpath))[:,:,0]),(pic.shape[1],pic.shape[0])) #Wenn die Ausrichtung der Tiefenkarte nicht mit dem Originalbild übereinstimmt
    fpic = kuwahara_with_depth(pic, r, r_min, depth).astype(pic.dtype)
    plt.imshow(fpic)
    # plt.imshow(np.rot90(fpic,3)) #Für den Fall, dass das Ausgabebild zur Seite zeigt
    plt.show()


picpath = "input_pic.jpg " #Bildpfad eingeben
depthpath = "depthmap.jpg " #Tiefenkartenbildpfad

if __name__ == "__main__":
    main(picpath, 20, 3, 0.5, depthpath)

Ergebnis

Wieder werde ich ** French Nekko ** als Beispiel vom französischen Foto verwenden. In der obigen Erklärung wurde es als Tiefenkarte ausgedrückt, aber natürlich gibt es keine solchen Daten, daher werde ich ein Bild erstellen, das irgendwie so aussieht. Diesmal habe ich es mit einer Fotoshow richtig gemacht. Übrigens, je weißer die Fläche, desto größer eine Seite der quadratischen Fläche. (Es scheint, dass einige Smartphone-Fotodateien, die Hintergrundunschärfe verwenden können, Tiefenkarteninformationen enthalten. [Erstellen von Stereobildern / Bildern mit mehreren Blickwinkeln mithilfe der Google Camera Deph-Karte](http: //stereo.jpn) .org / kitkat / index.html))))

Hier ist derjenige, der diesmal mit diesen gefiltert wurde. Bitte klicken, um zu vergrößern und zu sehen. Es ist ein mysteriöses Finish, wie eine natürliche Verschmelzung von Foto und Bild, wie das Verwischen mit Farbe, anstatt das Objektiv zu verwischen.

Zusammenfassung

Selbst auf den im Beispiel verwendeten Fotos denke ich, dass sich der Eindruck in Abhängigkeit von den Maximal- und Minimalwerten der quadratischen Fläche stark ändern wird. Wenn es richtig eingestellt wird, kann es wie ein Gemälde aussehen, in dem das Motiv und der Hintergrund klar gezeichnet sind, und in diesen Tagen, in denen Fotogenität erforderlich ist, kann es meiner Meinung nach als ungewöhnlicher fotografischer Ausdruck verwendet werden, wie im Titel gezeigt. Warum probierst du es nicht aus?

Recommended Posts

Vorschlag des Kuwahara-Filters als fotografischer Ausdruck
Implementierung eines einfachen Partikelfilters
Schildsprache var0.1
Eine Überprüfung der AWS SDK-Leistung nach Sprache
Vorschlag des Kuwahara-Filters als fotografischer Ausdruck
Aufgaben zu Beginn eines neuen Python-Projekts
Funktionen der Go-Sprache
Ruft den Variablennamen der Variablen als Zeichenfolge ab.
(Python) Behandeln Sie ganzzahlige Werte als eine Reihe von Flags
Berechnen Sie das Produkt von Matrizen mit einem Zeichenausdruck?