Изменить размеры ndarray и Multiply Contents - PullRequest
3 голосов
/ 02 апреля 2019

У меня есть MxN ndarray, который содержит значения True и False внутри этих массивов и хочу нарисовать их как изображение.Цель состоит в том, чтобы преобразовать массив в изображение подушки с каждым значением True в качестве постоянного цвета.Я смог заставить его работать, просматривая каждый пиксель и меняя их индивидуально, сравнивая и рисуя пиксель на чистом изображении, но этот метод слишком медленный.

# img is a PIL image result
# image is the MxN ndarray

pix = img.load()
for x in range(image.shape[0]):
  for y in range(image.shape[1]):
     if image[x, y]:
       pix[y, x] = (255, 0, 0)

Есть ли способ изменить ndarray на MxNx3, заменив кортежи непосредственно на значения True?

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Нашел другое решение, сначала преобразовал в изображение, затем преобразовал в RGB, а затем преобразовал обратно в отдельные каналы до 3.Когда я пытался объединить несколько логических массивов, этот путь был намного быстрее.

img = Image.fromarray(image * 1, 'L').convert('RGB')
data = np.array(img)
red, green, blue = data.T
area = (red == 1)
data[...][area.T] = (255, 255, 255)
img = Image.fromarray(data)
1 голос
/ 02 апреля 2019

Если у вас есть двухмерный массив True / False и метка для цвета, например [255,255,255], будет работать следующее:

colored = np.expand_dims(bool_array_2d,axis=-1)*np.array([255,255,255])

Чтобы проиллюстрировать это на фиктивном примере: в следующемкод Я создал случайную матрицу из 0 и 1, а затем превратил 1 в белый ([255, 255, 255]).

import numpy as np
import matplotlib.pyplot as plt

array = np.random.randint(0,2, (100,100))
colors = np.array([255,255,255])
colored = np.expand_dims(array, axis=-1)*colors

plt.imshow(colored)

Надеюсь, это помогло

0 голосов
/ 04 апреля 2019

Я думаю, вы можете сделать это довольно просто и быстро, как это:

# Make a 2 row by 3 column image of True/False values
im = np.random.choice((True,False),(2,3))                                                             

Шахта выглядит так:

array([[False, False,  True],
       [ True,  True,  True]])

Теперь добавьте новую ось, сделайте ее 3-канальной иумножьте истинные значения на ваш новый "цвет" :

result = im[..., np.newaxis]*[255,255,255]                                                                     

, который даст вам следующее:

array([[[  0,   0,   0],
        [  0,   0,   0],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]])
...