用NumPy和matplotlib覆盖图像分割

laik7k3q  于 2022-11-10  发布在  其他
关注(0)|答案(4)|浏览(125)

我正在尝试叠加两幅图像。第一个是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()

此代码不显示任何覆盖。我做错了什么?有没有笔直的路?我来自一个MatLab环境,我对Python还是个新手。

chhkpiq4

chhkpiq41#

为什么不改用imshow呢?
您可以通过执行以下操作来打印2D图像:

plt.imshow(Image1, cmap='gray') # I would add interpolation='none'

然后,您可以通过执行以下操作轻松覆盖分段:

plt.imshow(Image2_mask, cmap='jet', alpha=0.5) # interpolation='none'

更改Alpha将更改覆盖的不透明度。
另外,你为什么要制作两个面具?只有一个就足够了,你可以这样做:

Image2_mask = ma.masked_array(Image2 > 0, Image2)

实际示例:

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()

bzzcjhmw

bzzcjhmw2#

我可以给你我的函数两个重叠一张图片和一个数据集掩码:

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)

更改图片中每个像素的颜色的函数:

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
nkcskrwz

nkcskrwz3#

虽然不是直接使用matplotlib,但一种替代方法是使用构建在matplotlib之上的nilearn。如果使用Nifti文件(神经成像中的典型扩展名),可以使用函数plot_roiadd_overlay
例如,按照this thread中的建议,您可以这样写:

>>> 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

如果您只对某些平面/视图感兴趣,可以使用参数display_modecut_coords
最终结果将类似于:

6psbrbz9

6psbrbz94#

完成Imanol Luengo的回答:掩蔽图像可以直接在imshow Alpha选项中处理,只需放置一个AL解放军图像即可。

plt.imshow(Image1, cmap='gray') # I would add interpolation='none'
plt.imshow(Image2, cmap='jet', alpha=0.5*(Image2>0)   ) # interpolation='none'

相关问题