.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来设置透明度。这样,图像和掩膜就可以以直观且简单的方式叠加在一起显示了