#python #matplotlib #random #heatmap #noise
Вопрос:
Я пытаюсь создать 2D тепловую карту (черно-белую) с помощью этого алгоритма :
- Я выбираю случайную позицию на сетке
- Я рисую круг вокруг позиции
- В основном сетка находится близко к центру, и в основном она близка к 1,0
- Если текущая позиция уже имеет значение, я добавляю ее
Это работает довольно хорошо, но у меня есть одна большая проблема :
На пересечении цвет неправильный.
Поэтому я решаю использовать matplotlib, чтобы понять проблему :
Я думаю, что проблема исходит из центра графика :
мне нужно сгладить центр, как я могу это сделать ?
Мой код :
import random as rnd
import numpy as np
import matplotlib.pyplot as plt
import math
from PIL import Image
def normalize(value, minn, maxn):
return (value - minn) / (maxn - minn)
def clamp(n, minn, maxn):
return max(min(maxn, n), minn)
def add_hot_spot(grid, cx, cy, radius):
for x, y in np.ndindex(grid.shape):
dist = math.dist((cx, cy), (x, y))
if dist < radius:
factor = 1 - normalize(dist, 0, radius)
grid[x, y] = clamp(grid[x, y] factor, 0, 1)
def generate_heatmap(grid, count, radius_range = (1, 1), tolerance_range = (0, 1)):
while count > 0:
# choix de la position
x, y, r = rnd.randrange(0, w), rnd.randrange(0, h), rnd.randrange(*radius_range)
# choix d'une tolérance
k = rnd.uniform(*tolerance_range)
while grid[x][y] > k:
x, y = rnd.randrange(0, w), rnd.randrange(0, h)
# ajout d'un hot spot (position, radius)
add_hot_spot(grid, x, y, r)
count -= 1
def generate_noise(grid):
im = Image.new('RGB', (w, h), color='black')
for x, y in np.ndindex(grid.shape):
factor = grid[x, y]
sample = int(255 * factor)
im.putpixel((x, y), (sample, sample, sample))
return im
# génération de la grid à 0
w, h = 100, 100
grid = np.zeros((w, h))
# génération de la heatmap
# generate_heatmap(grid, 20, (1, 10), (0, 1))
add_hot_spot(grid, 25, 50, 50)
add_hot_spot(grid, 75, 50, 50)
# génération de l'image
im = generate_noise(grid)
im.show()
plt.plot(grid)
plt.show()