J'essaie de superposer deux images. Le premier est un tableau NumPy 512x512 (à partir d'une image CT). Le second est également un tableau NumPy 512x512 mais je suis juste intéressé par les pixels dont la valeur est supérieure à 0 (une image fonctionnelle).
Pour ce faire, j'essaie de créer un tableau masqué.
import numpy as np
import numpy.ma as ma
import matplotlib.pyplot as plt
# Both images are loaded from a dicom. Both are numpy arrays of (512,512)
Image1 = readimage(path)
Image2 = readimage(path)
# Create image 2 mask
mask = ma.masked_where(Image2>0, Image2)
Image2_mask = ma.masked_array(Image2,mask)
# Plot images
plt.figure(dpi=300)
y, x = np.mgrid[1:513,1:513]
plt.axes().set_aspect('equal', 'datalim')
plt.set_cmap(plt.gray())
plt.pcolormesh(x, y, Image1,cmap='gray')
plt.pcolormesh(x, y, Image2_mask,cmap='jet')
plt.axis([x.min(), x.max(), y.min(), y.max()])
plt.colorbar()
plt.show()
Ce code n'affiche aucune superposition. Qu'est ce que je fais mal? Y a-t-il un moyen simple? Je viens d'un environnement Matlab et je suis assez nouveau sur Python.
Pourquoi n'utilisez-vous pas imshow
à la place?
Vous pouvez tracer une image 2D en faisant:
plt.imshow(Image1, cmap='gray') # I would add interpolation='none'
Ensuite, vous pouvez facilement superposer la segmentation en faisant:
plt.imshow(Image2_mask, cmap='jet', alpha=0.5) # interpolation='none'
Changer l'alpha changera l'opacité de la superposition.
De plus, pourquoi créez-vous 2 masques? Un seul devrait suffire, vous pouvez faire:
Image2_mask = ma.masked_array(Image2 > 0, Image2)
Exemple pratique:
import numpy as np
mask = np.zeros((10,10))
mask[3:-3, 3:-3] = 1 # white square in black background
im = mask + np.random.randn(10,10) * 0.01 # random image
masked = np.ma.masked_where(mask == 0, mask)
import matplotlib.pyplot as plt
plt.figure()
plt.subplot(1,2,1)
plt.imshow(im, 'gray', interpolation='none')
plt.subplot(1,2,2)
plt.imshow(im, 'gray', interpolation='none')
plt.imshow(masked, 'jet', interpolation='none', alpha=0.7)
plt.show()