更改ndarray和Multiply内容的维度

问题描述 投票:3回答:3

我有一个MxN nararray,在这些数组中包含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)

有没有办法通过直接将元组替换为True值将ndarray更改为MxNx3?

python-3.x numpy python-imaging-library
3个回答
1
投票

如果您有True / False 2D数组和颜色标签,例如[255,255,255],则以下内容将起作用:

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

用一个虚拟的例子说明它:在下面的代码中,我创建了一个0和1的随机矩阵,然后将1s变为白色([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)

希望这有所帮助


1
投票

找到另一种解决方案,首先转换为图像,然后转换为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)

0
投票

我认为你可以这么简单快速地做到这一点:

# 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]]])
© www.soinside.com 2019 - 2024. All rights reserved.