[PYTHON] Génération automatique de modèles de collage

Il existe un collage qui combine plusieurs images pour créer une seule image. La plupart des services de collage le font en incorporant des images dans des modèles de collage. Cette fois, je vais essayer de générer ce modèle de collage de manière probabiliste.

Ceci peut être réalisé en divisant un rectangle en rectangles $ n $. Cette procédure est exprimée de manière probabiliste afin que les modèles puissent être générés indéfiniment en changeant la graine de nombres aléatoires. Seul $ n $ est donné.

Supposons qu'une zone soit divisée en une en une seule étape. La région sélectionnée suit la distribution des catégories. Une distribution uniforme est acceptable, mais la distribution polynomiale est utilisée en supposant le cas où une grande surface doit être préférentiellement divisée (la même que la distribution uniforme dans ce code). Ceci est choisi car il n'y a qu'une seule zone au début. Il y en a deux ensuite, alors choisissez-en un et divisez-le. Il y en a trois ensuite, ainsi ... et ainsi de suite.

Maintenant, après avoir décidé de la zone à diviser, décidez comment la diviser. La division correspond à la définition d'une ligne droite (superplan s'il a 4 dimensions ou plus). En d'autres termes, $ w $ et $ b $ de la droite $ w ^ T x --b $ doivent être définis.

Cette fois, nous ne le diviserons pas en diagonale. Ensuite, il n'y a que deux façons de le diviser, la direction verticale et la direction horizontale. Autrement dit, seulement $ w = [1 \ 0] ^ T $ ou $ w = [0 \ 1] ^ T $. Cette fois, la méthode de division suit la distribution de Bernoulli.

De cette façon, il ne reste plus qu'à décider b. Cela suit une distribution uniforme. Soit $ b = [b_1 \ b_2] $ puis $ b \ sim U (0, w) $ et $ b \ sim U (0, h) $. Cependant, $ w $ est la largeur de la zone à diviser et $ h $ est la hauteur de la zone à diviser. Ici, il peut être possible d'utiliser une distribution normale de sorte que la partie médiane soit préférentiellement divisée.

C'est la fin de la procédure. J'ai essayé une expérience. Le code est joint à la fin. Terminez par un exemple de $ 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

Génération automatique de modèles de collage
Génération automatique de mosaïques
07. Génération de déclaration par modèle
Génération automatique de quiz avec COTOHA
Génération automatique du code de test PyCharm
Génération automatique de Sadamasashi Kawayanagi
modèle
Génération automatique de documents à partir de docstring avec sphinx
Génération automatique Powerpo avec python-pptx (mémo personnel)