2017-06-26 2 views
0

Ich versuche, ein 3D-Array (RGB-Bild) mit numpy zu maskieren.Wie man 3D-Array mit numpy korrekt maskiert

Mein aktueller Ansatz ist jedoch die Umformung des maskierten Arrays (Ausgabe unten). Ich habe versucht, dem im SciKit-Image-Crash-Kurs beschriebenen Ansatz zu folgen. Crash Course

ich in der Stackoverflow und eine ähnliche Frage ausgesehen haben ist gebeten worden, aber ohne akzeptierte Antwort (similar question here)

Was ist die beste Art und Weise, wie diese Maskierung zu erreichen?

Hier ist mein Versuch:

# create some random numbers to fill array tmp = np.random.random((10, 10))

# create a 3D array to be masked a = np.dstack((tmp, tmp, tmp))

# create a boolean mask of zeros mask = np.zeros_like(a, bool)

# set a few values in the mask to true mask[1:5,0,0] = 1 mask[1:5,0,1] = 1

# Try to mask the original array masked_array = a[:,:,:][mask == 1]

# Check that masked array is still 3D for plotting with imshow print(a.shape) (10, 10, 3)

print(mask.shape) (10, 10, 3)

print(masked_array.shape) (8,)

# plot original array and masked array, for comparison plt.imshow(a) plt.imshow(masked_array)

plt.show()

+0

Sind Sie versuchen, Werte aus dem Bild auszuwählen, oder Teile des Bildes zu setzen mit der Maske auf Null? Möchten Sie, dass die Maske 2D ist und auf das Farbbild angewendet wird, oder 3D --- ein Wert in der Maske für jeden Wert im Bild? –

+0

Ich versuche, Teile des Bildes auszuwählen - es ist in diesem Fall ein Merkmalsextraktionsproblem. Da ich mit Drei-Kanal-Bildern zu tun habe, nahm ich an, dass ich eine 3D-Maske brauche. Eine 2D-Maske ist jedoch geeigneter, weil dasselbe Pixel auf allen drei Kanälen ausgeblendet werden sollte – Shawn

Antwort

2

NumPy Broadcasting ermöglicht es Ihnen, eine Maske mit einer anderen Form als das Bild zu verwenden. Z. B.

import numpy as np 
import matplotlib.pyplot as plt 

# Construct a random 50x50 RGB image  
image = np.random.random((50, 50, 3)) 

# Construct mask according to some condition; 
# in this case, select all pixels with a red value > 0.3 
mask = image[..., 0] > 0.3 

# Set all masked pixels to zero 
masked = image.copy() 
masked[mask] = 0 

# Display original and masked images side-by-side 
f, (ax0, ax1) = plt.subplots(1, 2) 
ax0.imshow(image) 
ax1.imshow(masked) 
plt.show() 

image masking

0

Nach dem Auffinden folgenden Beitrag über den Verlust von Dimensionen HERE, habe ich eine Lösung mit gefunden numpy.where:

masked_array = np.where(mask==1, a , 0)

Dies scheint gut zu funktionieren.