2 votes

Remplacer les uns et les zéros d'un tableau numpy 2D par un autre tableau ?

J'ai un problème simple que j'essaie de résoudre en utilisant numpy de manière efficace. L'essentiel est que j'ai un simple tableau 2D contenant des uns et des zéros représentant un masque d'image.

Ce que je veux faire, c'est convertir ces uns et ces zéros en leur équivalent RVB, où un est un pixel blanc [255, 255, 255] et zéro est un pixel noir [0, 0, 0].

Comment puis-je faire cela en utilisant NumPy ?

mask = [[0, 0, 1],
[1, 0, 0]]

# something

result = [
[[0, 0, 0], [0, 0, 0], [255, 255, 255]],
[[255, 255, 255], [0, 0, 0], [0, 0, 0]]
]

L'objectif est de prendre le résultat et de l'introduire dans PIL pour l'enregistrer au format PNG.

J'ai essayé d'utiliser numpy.where mais je n'arrive pas à l'inciter à diffuser un autre tableau.

1voto

Paul Smith Points 406

Une solution possible :

np.stack([255 * mask, 255 * mask, 255 * mask], axis=2)

Sortie :

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

       [[255, 255, 255],
        [  0,   0,   0],
        [  0,   0,   0]]])

1voto

Mark Setchell Points 11698

Comme votre image ne contient que deux couleurs, je vous suggère de l'enregistrer au format palette une image indexée.

Plutôt que de gonfler inutilement votre image d'un facteur 3 pour lui permettre de stocker 16,7 millions de couleurs, vous pouvez vous contenter de stocker un octet par pixel, ce qui vous permettra d'avoir 256 couleurs, ce qui semble suffisant lorsque vous n'en avez que 2. "couleurs" à savoir le noir et le blanc.

Cela ressemble à ceci :

import numpy as np
from PIL import Image

# Make Numpy array "na" from your list
na = np.array(mask, dtype=np.uint8)

# Make PIL Image from Numpy array - this image will be 'L' mode
im = Image.fromarray(na)

# Now push a palette into the image that says:
#   index 0 => black, i.e. [0,0,0]
#   index 1 => white, i.e. [255,255,255]
#   all other 254 indices are black
# Afterwards the image will be 'P' mode
im.putpalette([0,0,0, 255,255,255] + [0,0,0]*254)

# Save
im.save('result.png')

enter image description here

0voto

mathfux Points 3779

Puisque vous devez répéter chaque élément trois fois, np.repeat en liaison avec reshape pourrait être utilisé :

mask = np.array([[0, 0, 1], [1, 0, 0]])
255 * np.repeat(mask, 3, axis=1).reshape(*mask.shape, -1)
>>> array([[[  0,   0,   0],
            [  0,   0,   0],
            [255, 255, 255]],
           [[255, 255, 255],
            [  0,   0,   0],
            [  0,   0,   0]]])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X