Gre*_*nes 12 python arrays numpy image matplotlib
我试图覆盖两个图像.第一个是512x512 numpy阵列(来自CT图像).第二个也是512x512 numpy数组,但我只对值大于0的像素(功能图像)感兴趣.
为此,我试图创建一个蒙版数组.
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()
Run Code Online (Sandbox Code Playgroud)
此代码不显示任何叠加.我做错了什么?有没有正确的方法?我来自Matlab环境,我对phyton很新手.
谢谢
Ima*_*ngo 30
你为什么不用imshow
?
您可以通过执行以下操作绘制2D图像:
plt.imshow(Image1, cmap='gray') # I would add interpolation='none'
Run Code Online (Sandbox Code Playgroud)
之后,您可以通过执行以下操作轻松覆盖细分:
plt.imshow(Image2_mask, cmap='jet', alpha=0.5) # interpolation='none'
Run Code Online (Sandbox Code Playgroud)
更改alpha将更改叠加层的不透明度.
另外,为什么要创建2个面具?只有一个应该足够,你可以这样做:
Image2_mask = ma.masked_array(Image2 > 0, Image2)
Run Code Online (Sandbox Code Playgroud)
实际例子:
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()
Run Code Online (Sandbox Code Playgroud)
小智 10
完成 Imanol Luengo 的答案:可以通过放置 alpla 图像(即)在 imshow alpha 选项中直接处理遮蔽图像。
plt.imshow(Image1, cmap='gray') # I would add interpolation='none'
plt.imshow(Image2, cmap='jet', alpha=0.5*(Image2>0) ) # interpolation='none'
Run Code Online (Sandbox Code Playgroud)
我可以为您提供重叠图片和数据集掩码的函数:
def get_overlapped_img(filename, img_folder, mask_folder):
# Import orginal img
img = cv2.imread(img_folder+"/"+filename+".jpg")
# Import and convert the mask from binary to RGB
mask = Image.open(mask_folder+"/"+filename+".png").convert('RGB')
width, height = mask.size
# Convert the white color (for blobs) to magenta
mask_colored = change_color(mask, width, height, (255, 255, 255), (186,85,211))
# Convert the black (for background) to white --> important to make a good overlapping
mask_colored = change_color(mask_colored, width, height, (0, 0, 0), (255,255,255))
return cv2.addWeighted(np.array(img),0.4,np.array(mask_colored),0.3,0)
Run Code Online (Sandbox Code Playgroud)
改变图片中每个像素颜色的函数:
def change_color(picture, width, height, ex_color, new_color):
# Process every pixel
for x in range(width):
for y in range(height):
current_color = picture.getpixel( (x,y) )
if current_color == ex_color:
picture.putpixel( (x,y), new_color)
return picture
Run Code Online (Sandbox Code Playgroud)
虽然不能直接使用 matplotlib,但一种替代方法是使用构建在 matplotlib 之上的nilearn 。如果使用 nifti 文件(神经影像学中的典型扩展),您可以使用函数plot_roi
或add_overlay
.
例如,按照此线程中的建议,您可以编写:
>>> from nilearn import plotting
>>> display = plotting.plot_anat('path/to/volume.nii.gz') # plot volume
>>> display.add_overlay('path/to/mask.nii.gz',cmap='hot', colorbar=True) # add mask
Run Code Online (Sandbox Code Playgroud)
如果您只对某些平面/视图感兴趣,您可以使用参数display_mode
并cut_coords