[PYTHON] Automatische Generierung von Collagenvorlagen

Es gibt eine Collage, die mehrere Bilder kombiniert, um ein einziges Bild zu erstellen. Die meisten Collagedienste tun dies, indem sie Bilder in Collagenvorlagen einbetten. Dieses Mal werde ich versuchen, diese Collagenvorlage probabilistisch zu generieren.

Dies kann erreicht werden, indem ein Rechteck in $ n $ Rechtecke geteilt wird. Diese Prozedur wird probabilistisch ausgedrückt, so dass Vorlagen unbegrenzt generiert werden können, indem der Startwert von Zufallszahlen geändert wird. Es wird nur $ n $ angegeben.

Angenommen, ein Bereich wird in einem Schritt in einen Bereich unterteilt. Die ausgewählte Region folgt der Kategorieverteilung. Eine gleichmäßige Verteilung ist akzeptabel, aber die Polynomverteilung wird unter der Annahme verwendet, dass eine große Fläche bevorzugt geteilt werden soll (die gleiche wie die gleichmäßige Verteilung in diesem Code). Dies wird gewählt, weil es zunächst nur einen Bereich gibt. Es gibt zwei als nächstes, also wähle eins und teile es. Es gibt drei als nächstes, also ... und so weiter.

Nachdem Sie den zu teilenden Bereich festgelegt haben, entscheiden Sie nun, wie er aufgeteilt werden soll. Das Teilen entspricht dem Definieren einer geraden Linie (Superebene, wenn es 4 Dimensionen oder mehr sind). Mit anderen Worten sollten $ w $ und $ b $ der geraden Linie $ w ^ T x - b $ definiert werden.

Dieses Mal werden wir es nicht diagonal teilen. Dann gibt es nur zwei Möglichkeiten, es zu teilen, die vertikale Richtung und die horizontale Richtung. Das heißt, nur $ w = [1 \ 0] ^ T $ oder $ w = [0 \ 1] ^ T $. Diesmal folgt die Teilungsmethode der Bernoulli-Verteilung.

Auf diese Weise bleibt nur noch zu entscheiden, b. Dies folgt einer gleichmäßigen Verteilung. Sei $ b = [b_1 \ b_2] $ und $ b \ sim U (0, w) $, $ b \ sim U (0, h) $. $ W $ ist jedoch die Breite des zu teilenden Bereichs und $ h $ ist die Höhe des zu teilenden Bereichs. Hier kann es möglich sein, eine Normalverteilung zu verwenden, so dass der Mittelteil bevorzugt geteilt wird.

Dies ist das Ende des Verfahrens. Ich habe ein Experiment versucht. Der Code ist am Ende angehängt. Beenden Sie mit einem Beispiel für $ n = 7 $.

collage.png

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

def generate_template(n, width, height, random_state=1, max_random_state=10000, offset=0):
    L = [np.array([offset, offset, width-offset, height-offset])]
    random_state_lists = stats.randint.rvs(0, max_random_state, size=(n-1, 4), random_state=random_state)

    for random_state_list in random_state_lists:
        n_areas = len(L)
        if n_areas == 1:
            i = 0
        else:
            p = np.repeat(1 / (n_areas + i), n_areas)
            x = stats.multinomial.rvs(1, p, size=1, random_state=random_state_list[0])[0]
            i = x.argmax()

        y = stats.bernoulli.rvs(0.5, size=1, random_state=random_state_list[1])[0]
        if y == 0:
            b = stats.uniform.rvs(L[i][0], L[i][2] - L[i][0], size=1, random_state=random_state_list[2])[0]
            #b = stats.uniform.rvs(L[i][0], L[i][2] - L[i][0], size=1, random_state=random_state_list[2])[0]
        else:
            b = stats.uniform.rvs(L[i][1], L[i][3] - L[i][1], size=1, random_state=random_state_list[3])[0]
            #b = stats.uniform.rvs(L[i][1], L[i][3] - L[i][1], size=1, random_state=random_state_list[3])[0]
        if y == 0:
            area1 = np.array([L[i][0], L[i][1], b-offset/2, L[i][3]])
            area2 = np.array([b+offset/2, L[i][1], L[i][2], L[i][3]])
        else:
            area1 = np.array([L[i][0], L[i][1], L[i][2], b-offset/2])
            area2 = np.array([L[i][0], b+offset/2, L[i][2], L[i][3]])
        L.pop(i)
        L.append(area1)
        L.append(area2)
    return L

L = generate_template(7, 1, 1, random_state=3, offset=0)
colors=["b", "g", "r", "c", "m", "y", "k"]
fig = plt.figure()
ax = fig.add_subplot(111)
for l_i, c_i in zip(L, colors):
    rect = plt.Rectangle(xy=[l_i[0], l_i[1]], width=l_i[2] - l_i[0], height=l_i[3] - l_i[1], facecolor=c_i, fill=True)
    ax.add_patch(rect)
plt.tight_layout()
plt.show()

Recommended Posts

Automatische Generierung von Collagenvorlagen
Automatische Mosaikerzeugung
07. Anweisungsgenerierung nach Vorlage
Automatische Quizgenerierung mit COTOHA
Automatische Generierung des PyCharm-Testcodes
Automatische Erzeugung von Sadamasashi Kawayanagi
Vorlage
Automatische Dokumentenerstellung aus Docstring mit Sphinx
Powerpo automatische Generierung mit Python-Pptx (persönliches Memo)