使用SimpleITK分区域计算dice系数

直接调库还是YYDS

import SimpleITK as sitk
import numpy as np

image1_path = './data/100408_seg/mask_100408_arssr.nii.gz'
image2_path = './data/origin_seg/mask_100408.nii.gz'

image1_itk = sitk.ReadImage(image1_path, sitk.sitkUInt8)
image2_itk = sitk.ReadImage(image2_path, sitk.sitkUInt8)

image1 = sitk.GetArrayFromImage(image1_itk)
image2 = sitk.GetArrayFromImage(image2_itk)

# 二值化区域,原值为2的设为1,其它为0
image1 = np.where(image1 == 2, 1, 0)
image2 = np.where(image2 == 2, 1, 0)

image1 = sitk.GetImageFromArray(image1)
image2 = sitk.GetImageFromArray(image2)

overlap_measures_filter = sitk.LabelOverlapMeasuresImageFilter()
overlap_measures_filter.Execute(image1, image2)
# Dice
dice_similarity = overlap_measures_filter.GetDiceCoefficient()

print(dice_similarity)

再给一种方案

import numpy as np
import nibabel as nib

def cal_subject_level_dice(prediction, target, class_num=7):# class_num是你分割的目标的类别个数
    '''
 
嗯,用户希望简化现有的颌骨段提取改进方案。我需要先回顾之前提到的复杂方案,然后找出可以简化的步骤,同时保持核心功能的有效性。用户可能是在实际应用中遇到了计算资源不足或者时间效率的问题,需要一个更快捷的方法。 首先,方向包围盒(OBB)的部,原本用了PCA和协方差矩阵计算,这可能计算量较大。或许可以改用更简单的轴向包围盒(AABB),但如何减少冗余呢?可能需要调整扩展的规则,比如基于解剖结构的平均尺寸来设定扩展范围,而不是动态计算主方向。例如,直接根据邻牙的位置,在颊舌、近远中和垂直方向使用固定值扩展,这样虽然可能不如OBB精确,但能节省时间。 然后是区域生长算法,原来的种子点选择需要计算CEJ和根尖位置,这可能需要复杂的检测步骤。简化的话,或许可以手动指定种子点区域,或者使用邻牙质心附近的位置作为种子,避免自动检测CEJ带来的误差和计算量。另外,梯度约束可能需要较多的计算,如果时间优先,可能可以省略梯度检查,仅依赖HU值范围,这样虽然可能增加过生长的风险,但结合后续的连通性析或许可以弥补。 拓扑连通性析中,原来的流程包括网格生成、平滑、曲率计算等步骤,可能较为耗时。简化的话,可以直接使用体素级的连通组件析,比如三维区域增长后的二值掩码进行形态学操作,去除小区域,而不必生成网格。这样可以直接在体素数据上处理,省去网格处理的步骤,提高速度。 特殊情形的处理部,原来的多OBB和Minkowski和可能过于复杂。对于邻牙倾斜的情况,或许可以仅根据邻牙的质心连线方向来调整包围盒的方向,而不做完整的PCA。对于缺牙的情况,可以基于相邻存在牙齿的位置进行线性插值,估计缺牙区域,而不需要拟合整个牙弓曲线,这样计算更快。 验证指标方面,原方案提到了Dice系数和临床有效性检查,但简化方案可能需要更快速的验证方法,比如基于重叠率的快速计算,或者采样检查关键点,而不是全数据对比。 同时,可能需要考虑利用现有的开源工具库,比如使用SimpleITK进行区域生长和形态学操作,而不是自己实现所有算法,这样可以减少开发时间并提高可靠性。 最后,需要确保简化后的方案仍然能够解决原始问题,即减少冗余区域和误截断,同时提高处理速度。可能需要权衡准确性和效率,找到合适的折中点,比如在关键步骤使用轻量级算法,而在不影响速度的地方保留必要的处理步骤。 ### 颌骨段提取简化方案 #### 一、核心改进思路 1. **轻量化方向估计**: - 用质心连线代替PCA计算: $$ \vec{v}_{dir} = \frac{p_{远中} - p_{近中}}{\|p_{远中} - p_{近中}\|} $$ 其中$p$为邻牙质心坐标 - 包围盒扩展规则: ```python # 轴向扩展参数(单位:mm) expansions = { 'buccal_lingual': 4, 'mesial_distal': 1.2 * inter_tooth_distance, 'apical': 6 } ``` 2. **快速区域生长**: - 种子点简化定位: ```python seed_z = tooth_centroid.z - 0.3*root_length # 根长预估为牙冠长度×1.5 ``` - 条件简化为: - HU值范围:[-100, 800] - 26-邻域连通(加速处理) #### 二、关键算法流程 ```mermaid graph TD A[输入CT数据] --> B{邻牙存在?} B -- 是 --> C[质心连线定向包围盒] B -- 否 --> D[默认安全立方体] C --> E[快速区域生长] D --> E E --> F[三维形态学操作] F --> G[最大连通组件提取] G --> H[输出骨段] ``` #### 三、具体实现步骤 1. **定向包围盒构建** - **输入**:邻牙割掩码 - **处理**: ```python def get_simple_obb(mask1, mask2): c1 = compute_centroid(mask1) # 近中邻牙质心 c2 = compute_centroid(mask2) # 远中邻牙质心 main_axis = normalize(c2 - c1) # 主方向向量 box_center = (c1 + c2) / 2 # 构造轴向对齐包围盒 return create_rotated_box(box_center, main_axis, expansions) ``` 2. **快速区域生长优化** - **种子选择**: ```python def auto_seed(ct_volume, obb_region): sub_volume = crop_volume(ct_volume, obb_region) seed = np.argwhere(sub_volume > 300) # 直接选择高HU值点 return seed[::len(seed)//10] # 等距采样 ``` - **生长实现**: ```python def fast_growing(ct, seeds): mask = np.zeros_like(ct) for seed in seeds: flood_fill(ct, seed, mask, tolerance=200, connectivity=26) # 使用现成算法 return mask ``` 3. **后处理简化** - **形态学操作**: ```python cleaned_mask = binary_closing(mask, ball(3)) # 闭孔处理 final_mask = remove_small_objects(cleaned_mask, min_size=500) ``` #### 四、异常处理策略 1. **邻牙缺失处理**: - 使用历史案例均值位置: ```python default_position = get_average_position(patient_gender, arch_type) ``` 2. **严重倾斜处理**: - 增加安全边界: ```python expanded_obb = obb.expand(ratio=1.3) # 各向同性扩展30% ``` 这是你的改进方案 但是我没有理解,我的方案是编写程序判断出种植位点的邻牙是哪两颗(如13的邻牙是12和14),采用轴对齐包围盒即立方体边界框(其坐标轴与ct坐标轴平行),计算这些点在xyz轴的最大最小值共6个生成bbox,根据总结的不同牙位的扩展规则向不同方向扩展bbox,去除bbox内所有像素点及掩膜,保证能够截断颌骨;对种植位点的两颗邻牙均采取此行为,采用类似geomagic中点击后“去除与之不详解部”的功能仅保留种植位点骨块(我这种做法不知道是否可行,因为geomagic中有手动点击保留部的作,然后去除与之不相邻的所有片,但是这个没有手动点击作,是否能通过其他简单方式达到此功能)我想这个程序是全自动的,而对于极端情况如邻牙倾斜的适应性目前不必考虑太多,请思考后给我你的最终答案
03-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值