Создайте пользовательскую тепловую карту без кластера

#python #matplotlib #random #heatmap #noise

Вопрос:

Я пытаюсь создать 2D тепловую карту (черно-белую) с помощью этого алгоритма :

  1. Я выбираю случайную позицию на сетке
  2. Я рисую круг вокруг позиции
  3. В основном сетка находится близко к центру, и в основном она близка к 1,0
  4. Если текущая позиция уже имеет значение, я добавляю ее

Это работает довольно хорошо, но у меня есть одна большая проблема :
введите описание изображения здесь
На пересечении цвет неправильный.

Поэтому я решаю использовать 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()