File size: 2,134 Bytes
f60665f
 
 
 
e2b973a
f60665f
 
fee4bd9
f60665f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eb59450
e2b973a
f60665f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import random

import matplotlib.pyplot as plt
import numpy as np
import streamlit as st


def bul_image_maker(height: int, width: int, times: int, status_area) -> None:

    """
    ランダム + 累積和で画像を作って表示する

    args:
        height (int): 画像の縦サイズ
        width (int): 画像の横サイズ
        times (int): 累積和の計算を行う回数。数を増やすほどランダム性の高い画像となる
    return: None
    """

    H, W, N = (height, width, 256 // times)

    coef_list = [random.choice([-1, 1]) for i in range(times)]

    im = np.zeros((height, width))

    for time in range(times):

        status_area.write(f"{time+1}/{times}")

        H_start = random.randint((random.randint(1, H - 3)), H - 2)
        H_end = H_start
        W_start = random.randint(random.randint(1, W - 3), W - 2)
        W_end = W_start

        ABCD = []

        for i in range(N):
            ABCD.append(
                [
                    random.randint(1, H_start),
                    random.randint(1, W_start),
                    random.randint(H_end, H),
                    random.randint(W_end, W),
                ]
            )

        Z = [[0] * (W + 2) for i in range(H + 2)]  # Z = [[0] * (W+1)] * H だとダメっぽい
        answer = [[0] * (W + 2) for i in range(H + 2)]

        for i in range(N):
            A, B, C, D = ABCD[i][0], ABCD[i][1], ABCD[i][2], ABCD[i][3]

            Z[A][B] += 1 * coef_list[time]
            Z[C + 1][D + 1] += 1 * coef_list[time]
            Z[A][D + 1] -= 1 * coef_list[time]
            Z[C + 1][B] -= 1 * coef_list[time]

        # 横
        for i in range(1, H + 1):
            for j in range(1, W + 1):
                answer[i][j] = answer[i][j - 1] + Z[i][j]

        # 横
        for i in range(1, W + 1):
            for j in range(1, H + 1):
                answer[j][i] = answer[j - 1][i] + answer[j][i]

        im += np.array(answer)[1:-1, 1:-1]

    im = im + (np.max(im) - np.min(im))
    im = im * (255 / np.max(im))
    im = im / np.max(im)

    plt.axis("off")
    plt.imshow(im)

    return im