nii格式医学影像image和mask的查看

.nii.gz 是一种常见的医学图像文件格式,它实际上是两个格式的组合:NIfTI(Neuroimaging Informatics Technology Initiative)和Gzip压缩。

Python中的nibabel库可以处理这种文件格式:

image和mask单独查看

import nibabel as nib
import matplotlib.pyplot as plt
import numpy as np

#加载.nii.gz文件
img=nib.load('data_a/train/imagesTr/03.nii.gz')
image=img.get_fdata()#获取图像数据
header=img.header#获取图像头信息
num_slices=image.shape[2]#获取切片数量
print(num_slices)

# for i in range(0,num_slices,20):
#     slices = image[:,:,i]
#     plt.imshow(slices,cmap='gray')
#     plt.title(f'Slice {i}') # 设置切片标题
#     plt.show()  # 显示所有子图

fig, axes = plt.subplots(nrows=1, ncols=5, figsize=(60, 60))  # 创建子图
for i in range(5):
    slices = image[:, :, i]  # 获取第i个切片
    axes[i].imshow(slices, cmap='gray')  # 在第i个子图中显示切片
    axes[i].set_title(f'Slice {i}')  # 设置切片标题

plt.tight_layout()  # 调整子图布局以防止重叠
plt.show()  # 显示所有子图

典型应用
• 医学影像:MRI、CT、PET等图像数据。
• 神经影像学:功能性MRI(fMRI)、扩散张量成像(DTI)等。
• 科学研究:脑科学研究、临床诊断等领域。

image和mask叠加查看

import nibabel as nib
import matplotlib.pyplot as plt
import numpy as np

#加载.nii.gz文件
img=nib.load('data_a/train/imagesTr/03.nii.gz')
mask=nib.load('data_a/train/labelsTr/03.nii.gz')
#获取图像数据
image=img.get_fdata()
mask = mask.get_fdata()
# 选择一个切片进行显示(例如,第45个切片)
slice_index = 45
image_slice = image[:, :, slice_index]
mask_slice = mask[:, :, slice_index]

# 为了更好地可视化,我们可以将掩膜乘以一个较大的值,以便在叠加时更清晰地看到它
# 这里我们将掩膜的值设置为1(白色)和0.5的透明度
mask_slice_visual = (mask_slice * 255).astype(np.uint8)  # 将掩膜值放大到0-255范围

# 显示叠加的图像和掩膜
fig, ax = plt.subplots(1, 1, figsize=(8, 8))

# 首先显示图像切片
ax.imshow(image_slice, cmap='gray')

# 然后叠加掩膜切片,设置透明度
ax.imshow(mask_slice_visual, cmap='gray', alpha=0.5)

# 设置标题
ax.set_title(f'Slice {slice_index}: Image with Overlay Mask')

# 显示图像
plt.show()

然而,上面的代码有一个问题:由于我们将掩膜的值放大到了0-255范围,并且使用了相同的灰度颜色映射(cmap=‘gray’),这可能会导致在叠加时颜色看起来不明显。为了解决这个问题,我们可以使用不同的颜色来显示掩膜,比如红色,并通过设置RGB通道来叠加它。

下面是一个修改后的示例,使用红色来显示掩膜:

# ...(前面的代码保持不变)

# 为了叠加,我们需要将图像和掩膜转换为RGB格式
# 图像保持为灰度,然后复制到RGB的三个通道中
image_slice_rgb = np.stack([image_slice] * 3, axis=-1).astype(np.uint8)

# 掩膜设置为红色,并创建一个与图像大小相同的RGB掩膜数组
# 这里我们使用255表示红色通道,0表示其他通道
mask_slice_rgb = np.zeros_like(image_slice_rgb, dtype=np.uint8)
mask_slice_rgb[:, :, 0] = 0  # B通道(蓝色)
mask_slice_rgb[:, :, 1] = 0  # G通道(绿色)
mask_slice_rgb[:, :, 2] = (mask_slice * 255).astype(np.uint8)  # R通道(红色)

# 使用透明度叠加图像和掩膜
overlay = (image_slice_rgb * (1 - 0.5) + mask_slice_rgb * 0.5).astype(np.uint8)

# 显示叠加后的图像
fig, ax = plt.subplots(1, 1, figsize=(8, 8))
ax.imshow(overlay)
ax.set_title(f'Slice {slice_index}: Image with Overlay Mask (Red)')
plt.show()

但是,上面的代码仍然有些复杂,并且不是最直接的方法来叠加图像和掩膜。一个更简单且直观的方法是使用matplotlib的weighted_sum功能(尽管它不是内置的,但可以通过简单的数学运算实现)或者直接使用两个imshow调用,并通过alpha参数来控制透明度,同时确保掩膜使用不同的颜色映射(比如红色)。

下面是一个更简洁的示例,使用alpha和不同的颜色映射来叠加图像和掩膜:

# ...(前面的代码保持不变,直到获取到image_slice和mask_slice)

# 显示叠加的图像和掩膜(使用不同的颜色映射和透明度)
fig, ax = plt.subplots(1, 1, figsize=(8, 8))

# 显示图像切片
ax.imshow(image_slice, cmap='gray')

# 叠加掩膜切片,使用红色并设置透明度
# 注意:这里我们不再将掩膜值放大到0-255,而是直接使用0和1来表示掩膜的存在和不存在
# 我们将使用蓝色颜色映射,并通过设置alpha来控制透明度


ax.imshow(mask_slice, cmap='Blues', alpha=0.5)  # cmap='red'实际上会将1映射为红色,0映射为黑色(透明)

# 设置标题
ax.set_title(f'Slice {slice_index}: Image with Overlay Mask (Red, Alpha=0.5)')

# 显示图像
plt.show()

在这个最终的示例中,我们直接使用了cmap='red’来将掩膜显示为红色,并通过alpha=0.5来设置透明度。这样,图像和掩膜就可以以直观且简单的方式叠加在一起显示了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值