【医学图像分割】CT医学图像的预处理(重采样)

CT图像中存在两个基本概念,窗口(window width)和窗位(window center),用于选取感兴趣的CT值范围,因为人体各组织结构不同,对X线吸收程度各异,形成不同的CT值,因此可以利用CT值来鉴别组织的性质。CT值的单位为Hounsfield

Hounsfield单位(HU)是计算机断层扫描(CT)中普遍使用的无量纲单位,用于标准、便捷的表达CT数值。Hounsfield单位是通过对测量得到的衰减系数进行线性变换得到的。这种转换是基于空气和的密度,其中纯水被定义为0 Hounsfield单元,空气被定义为-1000 Hounsfield单元。组织密度越大,x射线吸收越强,其值为正,呈亮信号;密度较低的组织,x射线吸收较少,显示负值,呈暗信号。Hounsfield单位是以1979年诺贝尔生理学或医学奖得主Godfrey Hounsfield爵士的名字命名的,以表彰他在CT的发明中所做的贡献。

窗宽是CT图像上显示的CT值范围,在此CT值范围内的组织和病变均以不同的模拟灰度显示。而CT值高于此范围的组织和病变,无论高出程度有多少,均以白影显示,不再有灰度差异; 反之,低于此范围的组织结构,不论低的程度有多少,均以黑影显示,也无灰度差别。增大窗宽,则图像所示CT值范围加大,显示具有不同密度的组织结构增多,但各结构之间的灰度差别减少。减小窗宽,则显示的组织结构减少,然而各结构之间的灰度差别增加。如观察脑质的窗宽常为-15~+85H,即密度在-15 ~+85H范围内的各种结构如脑质和脑脊液间隙均以不同灰度显示。而高于+85H的组织结构如骨质几颅内钙化,其间虽有密度差,但均以白影显示,无灰度差别;而低于-15H组织结构如皮下脂肪及乳突内气体均以黑影显示,其间也无灰度差别。

窗位是窗的中心位置,同样的窗宽,由于窗位不同,其所包括CT值范围的CT值也有差异。例如窗宽同为100H,当窗位为0H时,其CT值范围为-50 ~ +50H ; 如窗位为+35H时,则CT值范围为-15~+85H。通常,欲观察某以组织结构及发生的病变,应以该组织的CT值为窗位。例如脑质CT值约为+35H,则观察脑组织及其病变时,选择窗位以+35H为妥。

常见的人体组织CT值

(1) 液体CT值:-10~10Hu,水的CT值为0Hu;

(2) 空气CT值:-1000Hu;

(3) 脂肪CT值:-10~90Hu;

(4) 肝脾肾、脑实质等软组织CT值:20~50Hu;

(5) 骨性组织CT值一般超过300Hu;骨皮质一般CT值超过+1000Hu;

(6) 腹部常用CT值:-160~240Hu

下边是对腹部窗口的图像预处理:

# 腹部窗口的选取
def pretreatmentImage(image):
    image[image < -160] = 0
    image[image > 240] = 0

    return image

医疗图像重采样:

对于一张大小为128*128的彩色图像,其在计算机中可以表示为128*128*3的矩阵,其中每一个像素点的取值范围为0-255,不同的数值代表不同的亮度。但是对于医疗图像其是由若干个slice组成的,假设每一个slice的大小为512*512的单通道的图像,其中每一个像素点表示的是一个体素的取值,其范围可以-1000~2000之间。接下来通过以胰腺分割数据集中PANCREAS_0015.nii.gz为例,对医疗图像中体素这个概念进行讲解。Spacing(0.78125, 0.78125, 1.0)表示的是原始图像体素的大小,也可以将Spacing想象成大小为(0.78125, 0.78125, 1.0)的长方体。而原始图像的Size为 (512, 512, 247),表示的是原始在X轴,Y轴,Z轴中体素的个数。原始图像的size*对应的Spacing既可以得到真实3D图像大小(512*0.78125,512*0.78125,247*1 ),在图像重采样只是修改体素的大小,而真实3D图像大小是保持不变的,因此假设我们将Spacing修改成(1.0, 1.0, 2.0)的时候,则修改之后其对应的size应该为((512*0.78125)/ 1.0,(512*0.78125)/ 1.0,(247*1 )/ 2.0)即(400, 400, 124)。

import pydicom
path = ""
dcm_data = pydicom.read_file(path)
print(dcm_data.PixelSpacing, dcm_data.SliceThickness) # 查看医学图像的体素大小和切片间距

重采样代码:

def img_resmaple(path, new_spacing=[1.0, 1.0, 1.0]):
    data = STK.ReadImage(path)
    image = STK.GetArrayFromImage(data) # 获取图像
    # print(image.shape)
    original_spacing = data.GetSpacing()
    # print(original_spacing)
    original_size = data.GetSize()
    # print(data.GetOrigin(), data.GetDirection())
    new_shape = [
        int(np.round(original_spacing[0] * original_size[0] / new_spacing[0])),
        int(np.round(original_spacing[1] * original_size[1] / new_spacing[1])),
        int(np.round(original_spacing[2] * original_size[2] / new_spacing[2])),
    ]
    resmaple = STK.ResampleImageFilter()
    resmaple.SetInterpolator(STK.sitkLinear)
    resmaple.SetDefaultPixelValue(0)
    resmaple.SetOutputSpacing(new_spacing)
    resmaple.SetOutputOrigin(data.GetOrigin())
    resmaple.SetOutputDirection(data.GetDirection())
    resmaple.SetSize(new_shape)
    data = resmaple.Execute(data)
    image = STK.GetArrayFromImage(data)
    # print(image.shape)
    return image

按照图像的中心裁剪:

def centerCrop(image, label, output_size):
    if image.shape[0] <= output_size[0] or image.shape[1] <= output_size[1] or image.shape[2] <= output_size[2]:
        pw = max((output_size[0] - image.shape[0]) // 2 + 3, 0)
        ph = max((output_size[1] - image.shape[1]) // 2 + 3, 0)
        pd = max((output_size[2] - image.shape[2]) // 2 + 3, 0)
        image = np.pad(image, [(pw, pw), (ph, ph), (pd, pd)], mode='constant', constant_values=0)
        label = np.pad(label, [(pw, pw), (ph, ph), (pd, pd)], mode='constant', constant_values=0)

    (w, h, d) = image.shape

    w1 = int(round((w - output_size[0]) / 2.))
    h1 = int(round((h - output_size[1]) / 2.))
    d1 = int(round((d - output_size[2]) / 2.))

    # print(image.shape, output_size, get_center(label), w1, h1, d1)
    image = image[w1:w1 + output_size[0], h1:h1 + output_size[1], d1:d1 + output_size[2]]
    label = label[w1:w1 + output_size[0], h1:h1 + output_size[1], d1:d1 + output_size[2]]

    return image, label

两种常用的归一化方法

1)min-max标准化

2)Z-score标准化方法

(1)min-max标准化(Min-Max Normalization)(线性函数归一化)
定义:也称为离差标准化,是对原始数据的线性变换,使得结果映射到0-1之间。
本质:把数变为【0,1】之间的小数。
转换函数:(X-Min)/(Max-Min)
如果想要将数据映射到-1,1,则将公式换成:(X-Mean)/(Max-Min)
其中:max为样本数据的最大值,min为样本数据的最小值,Mean表示数据的均值。

缺陷:当有新数据加入时,可导致max和min的变化,需要重新定义。

(2)0均值标准化(Z-score standardization)
定义:这种方法给与原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1.
本质:把有量纲表达式变成无量纲表达式。
转换函数:(X-Mean)/(Standard deviation)
其中,Mean为所有样本数据的均值。Standard deviation为所有样本数据的标准差。

两种归一化方法的使用场景:
(1)在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。

因为:第一种方法(线性变换后),其协方差产生了倍数值的缩放,因此这种方式无法消除量纲对方差、协方差的影响,对PCA分析影响巨大;同时,由于量纲的存在,使用不同的量纲、距离的计算结果会不同。

(2)在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在(0 ,255)的范围。

因为:第二种归一化方式中,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。

代码实现:

def MinMax(image):
    image = image - np.mean(image)  # 零均值
    if np.max(image) - np.min(image) != 0:
        image = (image - np.min(image)) / (np.max(image) - np.min(image))  # 归一化

    return image

def zsorce(image):
    image = (image - np.mean(image)) / np.std(image)
    return image

参考:

CT图像之Hu值变换与窗宽窗位调整_HuiYu-Li的博客-CSDN博客_ct图像调窗

CT医学影像的窗高窗位、CT值(Hu值)_土豆娃wkl的博客-CSDN博客_hu影像学单位

医学图像预处理之重采样_YYLin-AI的博客-CSDN博客_医学图像重采样

机器学习-数据归一化方法(Normalization Method)_Microstrong0305的博客-CSDN博客_数据归一化

### DeepSeek-R1大模型在Windows 7环境下的本地化部署 #### 创建配置文件 为了确保DeepSeek-R1能够在Windows 7环境中顺利运行,需先创建并配置`%USERPROFILE%\.ollama\config.json` 文件。该文件用于指定镜像仓库的代理服务器地址,从而加快下载速度以及提高稳定性。 ```json { "registry": { "mirrors": { "ghcr.io": "https://mirror.ghproxy.com", "docker.io": "https://dockerproxy.com" } } } ``` 此操作有助于解决因网络原因造成的拉取失败问题[^1]。 #### 安装依赖组件 考虑到Windows 7系统的特殊性和局限性,在执行具体命令之前还需要确认已安装必要的支持工具和服务: - Docker Desktop (适用于 Windows): 需要特别注意的是Docker官方对于操作系统的要求,建议选用兼容性强的老版本。 - NVIDIA CUDA Toolkit 和 cuDNN SDK: 如果计划利用GPU加速,则这两项不可或缺;不过鉴于目标平台为较旧版本的操作系统,请务必挑选相匹配的历史发行版。 - Python解释器及其配套库:部分脚本可能依赖于此环境来完成初始化设置或其他辅助功能。 #### 模型获取与准备 通过Ollama CLI工具可以方便地从远程仓库中提取所需的预训练权重文件。针对不同硬件条件提供了两种规格的选择方案: - **量化压缩版本(推荐)**: ```bash ollama pull deepseek-r1:7b-q4 ``` 这种变体占用空间较小(大约4.2GB),适合资源受限场景下使用,并且已经过优化处理以便于高效推理运算。 - **标准未裁剪版本**: ```bash ollama pull deepseek-r1:7b ``` 相比之下后者体积更大(接近32GB),但理论上能够提供更优性能表现。然而这同时也意味着更高的计算能力需求和存储容量消耗。 #### 启用图形处理器支援 如果计算机配备有NVIDIA显卡并且希望开启CUDA加速选项的话,则应按照如下方式调整参数设定: 编辑或新建位于用户目录下的`.profile` 或者 `.bashrc` 文档(取决于所使用的shell类型),追加下面一行指令至结尾处: ```bash export OLLAMA_CUDA_VISIBLE_DEVICES=0,1,... # 根据实际情况填写设备ID编号列表 ``` 随后重启终端会话使更改生效即可。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kunsir_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值