[PYTHON] Eine Methode zum Konvertieren des Bildstils unter Beibehaltung der Farbe

Einführung

Wie Sie vielleicht mit denen vertraut sind, die Deep Learning studieren, gibt es ein Papier mit dem Titel [Ein neuronaler Algorithmus des künstlerischen Stils], das den Stil von Bildern konvertiert. Die Erklärung auf Japanisch ist unten. Was ist Stilkonvertierung? Wir empfehlen Ihnen, zuerst hier einen Blick darauf zu werfen. Bevorzugter Forschungsalgorithmus zum Konvertieren von Stilen

Wenn Sie mit dieser Methode eine Stilkonvertierung durchführen, ähnelt die Farbe des konvertierten Bildes der des Stilbilds. In letzter Zeit wird jedoch die Stilkonvertierung durchgeführt, wobei die Farbe [Beibehalten der Farbe bei der Übertragung neuronaler künstlerischer Stile] beibehalten wird (http: / /arxiv.org/pdf/1606.05897v1.pdf) wurde eingereicht. Dies ist das gleiche Papier des Autors wie Ein neuronaler Algorithmus des künstlerischen Stils.

Was ist Bildstilkonvertierung?

Bereiten Sie zwei Bilder vor, ein Inhaltsbild (z. B. ein Katzenbild) und ein Stilbild (z. B. ein von Goch gezeichnetes Gemälde). Von diesen beiden Bildern ist der Inhalt ein Inhaltsbild, und der Stil ähnelt einem Stilbild (in diesem Fall ein Katzenbild wie Gochs Zeichnung) wird als Stilkonvertierung bezeichnet.

Überblick

Das Papier schlägt zwei Arten von Methoden vor.

Methode 1 Farbhistogrammabgleich

Konvertiert das Stilbild so, dass der Mittelwert und die Kovarianz der RGB-Werte mit denen des Inhaltsbilds übereinstimmen. Definieren Sie zunächst das Symbol.

Symbol Bedeutung Abmessungen
\bf{x}_{C} Inhaltsbild 3 x (Inhaltsbildのピクセル数)Jede Zeile ist R., G,B-Wert-Vektor
\bf{x}_{S} Stilbild 3 x (Stilbildのピクセル数)
\bf{\mu}_{C} RGB-Durchschnittswert des Inhaltsbildes 3-vector
\bf{\mu}_{S} RGB-Durchschnittswert des Stilbildes 3-vector
\bf{\Sigma}_{C} RGB-Co-Distribution von Inhaltsbildern 3 x 3
\bf{\Sigma}_{S} RGB-Co-Distribution von Stilbildern 3 x 3

Stilbildkonvertierung

\bf{x}_{S^{\prime}} \leftarrow \bf{A}\bf{x}_{S}+\bf{b}

Nachdenken über. Um das Farbhistogramm der Stilkonvertierung nach der Konvertierung näher an das Farbhistogramm des Inhaltsbilds heranzuführen

\bf{\mu}_{S^{\prime}} = \bf{\mu}_{C}
\bf{\Sigma}_{S^{\prime}} = \bf{\Sigma}_{C}

Gegeben $ \ bf {A} $ und $ \ bf {b} $, die erfüllen

\bf{b} = \bf{\mu}_{C}-\bf{A}\bf{\mu}_{S}
\bf{A}\bf{\Sigma_{S}}\bf{A^{T}} = \bf{\Sigma_{C}}

Treffen. Das Papier listet zwei $ \ bf {A} $ auf, die diese Formel erfüllen.

Colleskey-Demontage

\bf{A}_{\rm chol} = \bf{L}_{C}\bf{L}_{S}^{-1}

$ \ Bf {L} $ erfüllt jedoch $ \ bf {\ Sigma} = \ bf {L} \ bf {L} ^ {T} $ durch die Choleskey-Zerlegung von $ \ bf {\ Sigma} $.

Einzigartige Wertzerlegung

Angenommen, Sie zerlegen $ \ bf {\ Sigma} $ in eindeutige Werte, um $ \ bf {\ Sigma} = \ bf {U} \ bf {\ Lambda} \ bf {U} ^ {T} $ zu erhalten. Zu diesem Zeitpunkt ist $ \ bf {\ Sigma} ^ {1/2} = \ bf {U} \ bf {\ Lambda} ^ {1/2} \ bf {U} ^ {T} $, $ \ bf {\ Sigma } ^ {-1 / 2} = \ bf {U} \ bf {\ Lambda} ^ {-1 / 2} \ bf {U} ^ {T} $. Und

\bf{A}_{\rm IA} = \bf{\Sigma_{C}^{1/2}}\bf{\Sigma_{S}^{-1/2}}

Wird zur Konvertierung verwendet.

Verwenden Sie die erhaltenen $ \ bf {A} $ und $ \ bf {b} $, um das Stilbild zu konvertieren, und verwenden Sie dann das Inhaltsbild und das konvertierte Stilbild, um eine normale Stilkonvertierung durchzuführen. Das Papier besagt, dass die Eigenwertzerlegung bessere Ergebnisse lieferte als die Choleskey-Zerlegung.

Ich habe versucht, das Stilbild mit einem Algorithmus zu konvertieren, der eine Eigenwertzerlegung verwendet. Sie können sehen, dass das Farbschema dem Inhaltsbild ähnlich ist.

Inhaltsbild Stilbild Bild mit Farbhistogramm schließen

Methode 2 Nur Luminanzübertragung

Konvertiert den Farbraum des Inhaltsbilds und des Stilbilds in YIQ und erhält nur das Inhaltsbild und das Stilbild mit Helligkeit. Zu diesem Zeitpunkt wird die folgende Umwandlung durchgeführt, um den Durchschnitt und die Streuung der Helligkeit gleichmäßig zu machen. $ L_ {C} $ ist die Helligkeit des Inhaltsbildes, $ L_ {S} $ ist die Helligkeit des Stilbildes, $ \ mu_ {C}, \ mu_ {S} $ ist der Durchschnittswert der Helligkeit des Inhaltsbilds bzw. des Stilbildes. $ \ Sigma_ {C}, \ sigma_ {S} $ sind Standardabweichungen.

L_{S^{\prime}} = \frac{\sigma_{C}}{\sigma_{S}}(L_{S}-\mu_{S})+\mu_{C}

Nachdem Sie mit diesen Bildern eine Stilkonvertierung durchgeführt haben, können Sie das konvertierte Bild erhalten, indem Sie es mit dem IQ-Kanal des Inhaltsbilds kombinieren. Informationen zum Konvertieren zwischen RGB und YIQ finden Sie in Wikipedia.

Implementiert von Python

Color histogram matching

Die Python-Implementierung der Farbhistogrammanpassung mithilfe der Eigenwertzerlegung sieht folgendermaßen aus: Sie können eine Eigenwertzerlegung mit numpy.linalg.eig durchführen.

import numpy as np
import six

#x ist das Stilbild
#y ist ein Stilbild
# x,y ist ein numpy Array und Form ist(batch_size, 3, height, width)
def match_color_histogram(x, y):
    z = np.zeros_like(x)
    shape = x[0].shape
    for i in six.moves.range(len(x)):
        a = x[i].reshape((3, -1))
        a_mean = np.mean(a, axis=1, keepdims=True)
        a_var = np.cov(a)
        d, v = np.linalg.eig(a_var)
        a_sigma_inv = v.dot(np.diag(d ** (-0.5))).dot(v.T)

        b = y[i].reshape((3, -1))
        b_mean = np.mean(b, axis=1, keepdims=True)
        b_var = np.cov(b)
        d, v = np.linalg.eig(b_var)
        b_sigma = v.dot(np.diag(d ** 0.5)).dot(v.T)

        transform = b_sigma.dot(a_sigma_inv)
        z[i,:] = (transform.dot(a - a_mean) + b_mean).reshape(shape)
    return z

Umwandlung von BGR in YIQ

Die gegenseitige Umwandlung zwischen BGR und YIQ ist wie folgt. BGR wird anstelle von RGB verwendet, da das für die Bildkonvertierung verwendete VGG-Modell BGR als Eingabe verwendet.

#x ist ein numpy Array, das ein Bild darstellt und dessen Form ist(batch_size, 3, height, width)
def bgr_to_yiq(x):
    transform = np.asarray([[0.114, 0.587, 0.299], [-0.322, -0.274, 0.596], [0.312, -0.523, 0.211]], dtype=np.float32)
    n, c, h, w = x.shape
    x = x.transpose((1, 0, 2, 3)).reshape((c, -1))
    x = transform.dot(x)
    return x.reshape((c, n, h, w)).transpose((1, 0, 2, 3))

def yiq_to_bgr(x):
    transform = np.asarray([[1, -1.106, 1.703], [1, -0.272, -0.647], [1, 0.956, 0.621]], dtype=np.float32)
    n, c, h, w = x.shape
    x = x.transpose((1, 0, 2, 3)).reshape((c, -1))
    x = transform.dot(x)
    return x.reshape((c, n, h, w)).transpose((1, 0, 2, 3))

Lauf

Ich habe diese Methode tatsächlich ausprobiert. Der Quellcode ist unten. https://github.com/dsanno/chainer-neural-style

Ausführungsmethode

Sie können dies wie folgt tun:

Führen Sie einen Farbhistogrammabgleich durch

$ python src/run.py -g 0 -c content.jpg -s style.jpg -w 384 -o out_dir_01 --iter 2000 --lr 10 --match_color_histogram --initial_image content

Nur Luminanz ausführen

$ python src/run.py -g 0 -c content.jpg -s style.jpg -w 384 -o out_dir_02 --iter 2000 --lr 10 --luminance_only --initial_image content

Ausführungsergebnis

Das Ausführungsergebnis wird angezeigt. Die Farbhistogrammübereinstimmung scheint dem Inhaltsbild ähnlich zu sein, aber die Wand ist hautfarben und die richtige Farbe wird nicht an der richtigen Stelle gemalt. Aufgrund des Papiers war das Farbschema schöner, sodass möglicherweise etwas nicht stimmt. Nur für Luminanz wird ein Bild ausgegeben, das dem Stilbild ähnlich ist.

Inhaltsbild Stilbild Color histogram matching Luminance-only transfer
Das gleiche wie oben
Das gleiche wie oben
Das gleiche wie oben

Bei der Optimierung der Stilkonvertierung scheint es gut, das ursprüngliche Bild mit dem Inhaltsbild identisch zu machen. Wenn das ursprüngliche Bild zufällig ausgewählt wird, weichen Licht und Dunkelheit wie unten gezeigt vom Inhaltsbild ab. (Das Stilbild ist Gochs Sternennacht, die Methode ist nur Luminanz)

Zusammenfassung

Konvertierung des Bildstils unter Beibehaltung der Farbe implementiert.

Diese Methode ist eine Kombination aus vorhandener Stilkonvertierung und Farbkonvertierung von Inhaltsbildern und Stilbildern und kann als einfache Methode bezeichnet werden. Auf diese Weise können Sie verschiedene Effekte erzielen, indem Sie die Methode ein wenig ändern. Daher hielt ich es für wichtig, nicht nur die neue Methode zu imitieren, sondern auch darüber nachzudenken, ob Sie sie selbst entwickeln könnten.

Verweise

Recommended Posts

Eine Methode zum Konvertieren des Bildstils unter Beibehaltung der Farbe
ROS-Kurs 119 Korrigieren Sie die Farbe des Kamerabildes
Eine einfache Python-Implementierung der k-Neighborhood-Methode (k-NN)
Zusammenfassung des mit einer Geschwindigkeit von einer Sekunde durchgeführten Bildcrawls
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 2)
Ändern Sie den Stil von matplotlib
Das Bild ist Namekuji
Ein Überblick über DELG, eine neue Methode zum Extrahieren von Bildmerkmalen, die mit Kaggle Aufmerksamkeit erregt
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Verstehen Sie die Funktion der Faltung am Beispiel der Bildverarbeitung
[Statistik] Erfassen Sie das Bild der zentralen Polbegrenzungstheorie mit einem Diagramm
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
Extrahieren Sie Feature-Punkte eines Bildes
Ruft die Attribute eines Objekts ab
Konvertieren Sie eine Zeichenfolge in ein Bild
Die Geschichte des Exportierens eines Programms
Memorandum zur Einführung des EXODUS-Datenmodells der Finite-Elemente-Methode (FEM)
Treffen Sie eine Methode einer Klasseninstanz mit der Python Bottle Web API
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Öffnen Sie eine Excel-Datei in Python und färben Sie die Karte von Japan
Sprechen Sie über die Fluchtwahrscheinlichkeit eines zufälligen Gehens auf einem ganzzahligen Gitter
So spielen Sie ein Video ab, während Sie die Anzahl der Bilder ansehen (Mac)
Achten Sie beim Erstellen einer Bildmaske mit Numpy auf den Typ
So speichern Sie die Feature-Point-Informationen des Bildes in einer Datei und verwenden sie zum Abgleichen