https://zhuanlan.zhihu.com/p/335970913

图像裁剪 Crop

图像裁剪就是将三维的医学图像裁剪到它的非零区域,具体方法就是在图像中寻找一个最小的三维 bounding box,该 bounding box 区域以外的值为 0,使用这个 bounding box 对图像进行裁剪。相比裁剪前,裁剪后的图像对于最后的分割结果没有影响,但是却可以减小图像尺寸,避免无用的计算,提高计算效率。有效解决外围全黑背景相对较多的问题,

<img src="preprocess-nunet.assets/003-23.png" alt="003-23" style="zoom:25%;" />

裁剪可以分为以下 3 步:

第一步根据三维图像数据 data (C,X,Y) 生成三维的非零模板 nonzero_mask,标示图像中哪些区域是非零的 。调用 scipy 库的 binary_fill_holes 函数对生成的 nonzero_mask 进行填充。

第二步根据生成的非零模板,确定用于裁剪的 bounding_box 大小和位置,在代码中就是要找到 nonzero_mask 在 x,y,z 三个坐标轴上值为 1 的最小坐标值以及最大坐标值。

第三步就根据 bounding_box 对图像依次进行裁剪,然后重新组合在一起。

注:在对原始数据裁剪完毕之后,使用同样的 bounding box 对分割标注 seg 进行裁剪,

#按照 spacing 进行 标准正态话
def get_do_separate_z(spacing, anisotropy_threshold=RESAMPLING_SEPARATE_Z_ANISO_THRESHOLD):
    do_separate_z = (np.max(spacing) / np.min(spacing)) > anisotropy_threshold
    return do_separate_z

重采样目的是解决在一些三维医学图像数据集中,不同的图像中单个体素 voxel 所代表的实际空间大小 spacing 不一致的问题。因为卷积神经网络只在体素空间中进行操作,会忽视掉实际物理空间中大小信息。为了避免这种差异性,需要对不同图像数据在体素空间进行 resize,保证不同的图像数据中,每个体素所代表的实际物理空间一致。

具体需要将整个数据集 resample 到多大的 spacing,即目标空间大小 target_spacing 应该多大呢?nnUNet 给出的建议是在大多数时候使用数据集各个图像不同 spacing 的中值,但是在各向异性(最大坐标上的 spacing÷ 最小坐标上的 spacing>3)的数据集中,取数据集 10% 分位点的 spacing 值作为 spacing 最大坐标的目标空间大小会是更好的选择。重采样的步骤可以简单分成 3 步。

第一步是确定重采样的目标空间大小。在之前数据格式转换的时候,每个数据的 spacing 信息存储在对应的 pickle 文件中,需要依次进行读取,然后一起存放在一个列表 spacings 当中。之后调用 numpy 中函数统计每个维度 spacing 的中值即可。

#重采样 Resample

CT 图像的 normalization

第一步是收集整个 CT 影像训练集前景的统计信息。data 代表 CT 图像的三维数据。seg 是存放分割标注信息的三维数组,根据 crop 步骤中的处理,标注值为 - 1 代表 0 值背景,标注值为 0 代表非 0 值的背景,而大于 0 代表不同的前景标签。nnUNet 为了简便计算,对每张图像仅采样 1/10 的前景体素用于统计,存储在 voxels 列表中。通过对训练集中每张训练数据的遍历,将采样到的前景体素列表 voxels 拼接在一块,即 voxels_all。

第二步调用 numpy 中的函数统计整个训练集前景的均值,标准差,0.5% 分位 HU 值,99.5% 分位 HU 值,并利用这些统计信息对每张图像进行 clip 以及 z-scoring。代码中用 use_nonzero_mask 指示是否只在 nonzero 区域进行 normalization.

(40 条消息) pycharm 中 matplotlib 显示图像的颜色不对_哈哈哈的博客 - CSDN 博客

更新于

请我喝[茶]~( ̄▽ ̄)~*

牛奶草莓小饼干 微信支付

微信支付

牛奶草莓小饼干 支付宝

支付宝

牛奶草莓小饼干 贝宝

贝宝