Эффективное построение 2D-масок и их раскраска с использованием числовой функции - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть 200 x 200 np.ndarry промежуточных звеньев (называемых a), значения которых находятся в диапазоне от 0 до 100 (присутствуют все значения). Затем у меня есть np.array длины 100 (называемый b), который содержит реальные значения.

Чтобы придать смысл проблеме, массивы a и b происходят из проблемы сегментации ML , Матрица a показывает сегментацию, где 0 представляет фон, а 1-100 представляет различные экземпляры. Затем каждому экземпляру соответствует реальное значение (интенсивность), и эти интенсивности сохраняются в векторе b. Вот почему вектор b имеет только 100 записей (а не 101), потому что фон не имеет интенсивности.

Теперь вернемся к исходной проблеме. Я хотел бы эффективно построить изображение 200 x 200, в котором пиксели, соответствующие значению a, равному 0, отображаются цветом RGBA (0, 0, 0, 0), то есть прозрачным, в то время как пиксель в a имеет значение v, с v между 1 и 100 (включая крайние значения), тогда я хотел бы изобразить эту интенсивность, используя непрерывную карту цветов.

Код, который я написал, работает, но он очень медленный ( это занимает 8 секунд, и с большими изображениями это боль). Как я могу написать это более эффективно?

import matplotlib.pyplot as plt
import numpy as np
from tqdm import tqdm
import matplotlib.colors
import matplotlib.cm

# generating fake data
masks = np.random.randint(0, 100, (200, 200))
# to make sure that all the values are present at least once
masks[0, 0:101] = list(range(101))
feature = np.random.rand(100)

# plotting the data
norm = matplotlib.colors.Normalize(vmin=feature.min(), vmax=feature.max(), clip=True)
mapper = matplotlib.cm.ScalarMappable(norm=norm, cmap=plt.get_cmap('viridis'))

image = np.zeros((masks.shape[0], masks.shape[1], 4), dtype=np.float)
for i in tqdm(range(masks.shape[0])):
    for j in range(masks.shape[1]):
        value = masks[i, j]
        if value > 0:
            feature_value = feature[value - 1]
            image[i, j, :] = mapper.to_rgba(feature_value)
        else:
            image[i, j, :] = (0, 0, 0, 0)

plt.figure(figsize=(16, 9))
plt.imshow(image)
plt.show()
...