鄙人主要研究方向?yàn)獒t(yī)學(xué)圖像配準(zhǔn),在使用CT數(shù)據(jù)集之前需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。
常規(guī)預(yù)處理步驟:(*代表本代碼有)
1.裁剪出ROI區(qū)域。
目的:減小圖像尺寸,減小內(nèi)存消耗,減小無(wú)關(guān)信息,可提高實(shí)驗(yàn)精度
2.重采樣。
一般會(huì)重采樣到各向同性,例如,將圖像重采樣到每體素代表111mm實(shí)際體積
3.CT轉(zhuǎn)HU,斜率,截距.[CT圖像專有,本文代碼沒(méi)寫(xiě)這個(gè)]
*4.截取ROI灰度區(qū)域。
當(dāng)處理的圖像為肺部圖像時(shí),也稱為截取肺窗,即肺所在灰度范圍,常見(jiàn)肺窗[窗寬:900,窗位:-550],寬肺窗[窗寬:1600,窗位:-600]
*5.歸一化
目的:防止梯度防炸
6.resize圖像尺寸。
由算法(有些算法要求輸入圖片尺寸統(tǒng)一,有些算法則需要保證原圖)或電腦性能(顯存小,只能縮小圖片咯~)決定文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-531105.html
直接上代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-531105.html
import nibabel as nib
import numpy as np
import torch
def get_gray_range(image):
'獲取圖像信息:最大最小值'
image = np.reshape(image, (1, image.shape[0] * image.shape[1] * image.shape[2]))
image_gray_list = image.tolist()[0]
image_gray_list.sort() # 默認(rèn)升序排列灰度值
point_num = len(image_gray_list)
min_num = round(point_num * 0.05)
max_num = round(point_num * 0.95)
min_gray_value = image_gray_list[min_num]
max_gray_value = image_gray_list[max_num - 1]
return min_gray_value, max_gray_value
def resampling_isotropic(data,voxel,spacing=[1, 1, 1]):
"""
利用上下采樣原理,恢復(fù)到各向同性
:param data: 輸入圖像
:param spacing: 各向同行或異性,默認(rèn)為1*1*1
:return:
"""
# 獲取圖像信息:長(zhǎng)寬高;
height, weight, deepth = data.shape
# 輸出圖的size
size_X = int(height*voxel[0]/spacing[0])
size_Y = int(weight*voxel[1]/spacing[1])
size_Z = int(deepth*voxel[2]/spacing[2])
# ndarray轉(zhuǎn)torch;增加兩維,目的是可以在"上下采樣"中使用三線性插值法
data = torch.tensor(data).unsqueeze(0).unsqueeze(0)
# torch轉(zhuǎn).float32
data = data.to(torch.float32)
"""
函數(shù)說(shuō)明:
torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)
input (Tensor) – the input tensor
size (int or Tuple[int] or Tuple[int, int] or Tuple[int, int, int]) – output spatial size.
scale_factor (float or Tuple[float]) – 空間大小的乘數(shù)。如果scale_factor是一個(gè)tuple,它的長(zhǎng)度必須匹配input.dim()。
mode (str) – algorithm used for upsampling: nearest(Default), linear (3D-only), bilinear, bicubic (4D-only), trilinear (5D-only), area
align_corners (bool, optional):幾何上,我們把輸入和輸出的像素看作正方形而不是點(diǎn)。默認(rèn)值:False
如果設(shè)置為True,輸入和輸出張量將由它們的角像素中心點(diǎn)對(duì)齊,并保留角像素的值。
如果設(shè)置為False,則輸入和輸出張量由它們的角像素的角點(diǎn)對(duì)齊,并且插值對(duì)邊界外值使用邊值填充,使得在scale_factor保持不變的情況下,該操作與輸入大小無(wú)關(guān)。
這只在mode is 'linear', 'bilinear', 'bicubic' or 'trilinear'時(shí)才有效果。
recompute_scale_factor (bool, optional) :重新計(jì)算用于插值計(jì)算的scale_factor。
如果為True,則必須傳入scale_factor,并使用scale_factor計(jì)算輸出大小。計(jì)算出的輸出大小將用于為插值推斷新的尺度。
注意,當(dāng)scale_factor是浮點(diǎn)數(shù)時(shí),由于舍入和精度問(wèn)題,它可能與重新計(jì)算的scale_factor不同。
如果為False,那么size或scale_factor將直接用于插值。
"""
data = torch.nn.functional.interpolate(data,
size=[size_X,size_Y,size_Z],
mode='trilinear',
align_corners=False)
return data[0, 0, :, :, :]
if __name__ == "__main__":
"""
預(yù)處理主程序
需修改的參數(shù):
img_name:圖片名稱
old_path:數(shù)據(jù)集舊路徑
new_path:數(shù)據(jù)集新路徑
"""
img_path = old_path + img_name
# 打開(kāi)nii格式
img = nib.load(img_path)
img_data = np.asarray(img.dataobj)
# 把仿射矩陣和頭文件都存下來(lái)
img_affine = img.affine
img_hdr = img.header
# 獲取圖像信息:最大最小值
img_min, img_max = get_gray_range(img_data)
# 獲取圖像信息:長(zhǎng)寬高;
height, weight, deepth = img_data.shape
# 獲取圖像信息:voxel spacing,
voxel = [img_hdr['pixdim'][1]]
voxel.append(img_hdr['pixdim'][2])
voxel.append(img_hdr['pixdim'][3])
# 1.裁剪出感興趣ROI區(qū)域,自定義裁剪范圍數(shù)據(jù)
ROIrange_XYZ=[40,440,20,240,10,130]
xmin=ROIrange_XYZ[0]
xmax=ROIrange_XYZ[1]
ymin=ROIrange_XYZ[2]
ymax=ROIrange_XYZ[3]
zmin=ROIrange_XYZ[4]
zmax=ROIrange_XYZ[5]
img_crop = img_data[xmin:xmax,ymin:ymax,zmin:zmax]
# 2.重采樣??梢曰謴?fù)到各向同性[1,1,1]
resample_spacing=[1,1,1]
img_isotropic = resampling_isotropic(data=img_crop,voxel=voxel,spacing=resample_spacing)
# 修改NIfTI affines
scaling_affine = np.diag([resample_spacing[0], resample_spacing[1], resample_spacing[2], 1])
# 3.裁剪出肺窗
TonalRange=[-1000,-100]
clamp_min = TonalRange[0] if img_min <= TonalRange[0] else img_min
clamp_max = TonalRange[1] if img_max >= TonalRange[1] else img_max
intrange = clamp_max - clamp_min
img_clamp = torch.clamp(img_isotropic,min=clamp_min,max=clamp_max)
# 4 歸一化處理,灰度范圍-》[0,1]
img_normalize = (img_clamp-clamp_min) / intrange
# 5 保存為nii格式
# NiBabel網(wǎng)址 https://nipy.org/nibabel/manual.html
img_new = nib.Nifti1Image(img_normalize, scaling_affine, img_hdr)
img_new_path = new_path + img_name
nib.save(img_new, img_new_path)
到了這里,關(guān)于醫(yī)學(xué)nii圖像 預(yù)處理——圖像裁剪 重采樣 灰度區(qū)域 歸一化 修改圖像尺寸的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!