欢迎光临
我们一直在努力

【深度解析+代码框架】2026 年河北省研究生数学建模 C/D 题:冠脉造影狭窄识别与零碳园区微电网优化

2026 年河北省研究生数学建模竞赛 C、D 两题都属于典型的研究生高阶建模题。C 题偏医学影像、计算几何、三维重建和多目标观察策略优化;D 题偏电力系统、物理信息建模、黑启动过程仿真、移动储能经济性和零碳园区产业路径分析。两题都不能简单套一个模型解决,而必须建立完整问题链条。

C 题的关键是把三维冠状动脉二值 mask 转化成具有临床意义的血管结构模型,再基于中心线和局部直径识别狭窄,最后设计最佳观察角度。它的本质不是“分割”,因为 mask 已经给出,而是“从几何结构中提取诊断信息”。

D 题的关键是构建零碳园区源网荷储的信息物理耦合系统,模拟 10kV 配网黑启动过程,优化移动储能车配置与调度,并从经济和产业角度分析零碳园区落地路径。它的本质不是单纯调度,而是“安全恢复 + 低碳运行 + 经济可行 + 工程落地”的系统优化。


第一部分:C 题——冠状动脉造影狭窄识别与最佳观察策略

一、C 题完整问题理解

题目给出若干病例的三维冠状动脉二值 mask 数据。mask 中的 1 表示血管管腔区域,0 表示背景。参赛者需要围绕三维血管结构,完成三类任务:

第一,建立三维冠状动脉结构模型。也就是从离散 mask 中重建血管表面、提取中心线、建立血管树拓扑结构,并获得血管半径、长度、分叉点、曲率等几何特征。

第二,识别和量化冠脉狭窄。狭窄不是简单找最细的位置,而是要判断某一段血管相对于其正常参考直径是否出现异常变窄。因此需要建立沿中心线的半径序列、参考直径估计方法和狭窄率计算方法。

第三,设计最佳观察策略。冠状动脉造影是三维血管在二维平面的投影。不同观察角度下,血管重叠、狭窄显示、分支展开度和辐射代价不同,因此需要建立投影模型和多目标观察角度优化模型。

高分论文主线应为:

三维 mask 预处理 → 表面重建 → 中心线提取 → 血管树拓扑建模 → 半径/直径场计算 → 狭窄候选检测 → 狭窄率与分级 → 投影成像模拟 → 观察角度评价 → 全局/局部最佳观察策略优化。


二、C 题建模方案一:三维血管结构重建

1. 数据预处理

三维 mask 可能存在体素各向异性、局部孔洞、小噪声连通域和边界锯齿。如果直接计算中心线和半径,会导致狭窄识别误差。因此第一步需要进行几何可靠性预处理。

建议处理流程如下:

  • 读取 NIfTI、mhd、npy 或 mat 格式的三维 mask。

  • 根据体素间距进行各向同性重采样。

  • 对 mask 进行三维形态学闭运算,修补局部孔洞。

  • 删除小连通域,保留主要血管结构。

  • 对边界进行轻度平滑,但不能过度平滑,否则会抹掉真实狭窄。

  • C 题代码 1:读取与预处理三维 mask

    import numpy as np
    import scipy.ndimage as ndi
    from skimage import morphology, measure
    import matplotlib.pyplot as plt

    try:
    import nibabel as nib
    except ImportError:
    nib = None

    def load_mask(path):
    \”\”\”
    支持 .nii/.nii.gz/.npy 三维 mask。
    返回 mask 和 spacing。
    \”\”\”
    if path.endswith(\”.npy\”):
    mask = np.load(path)
    spacing = np.array([1.0, 1.0, 1.0])
    return mask.astype(bool), spacing

    if path.endswith(\”.nii\”) or path.endswith(\”.nii.gz\”):
    if nib is None:
    raise ImportError(\”请先安装 nibabel: pip install nibabel\”)
    img = nib.load(path)
    data = img.get_fdata()
    spacing = np.array(img.header.get_zooms()[:3])
    return data > 0.5, spacing

    raise ValueError(\”暂不支持该文件格式\”)

    def resample_to_isotropic(mask, spacing):
    \”\”\”
    将三维 mask 重采样到各向同性体素。
    最近邻插值用于保持二值标签。
    \”\”\”
    spacing = np.array(spacing, dtype=float)
    target_spacing = spacing.min()
    zoom = spacing / target_spacing
    resampled = ndi.zoom(mask.astype(np.uint8), zoom=zoom, order=0)
    return resampled.astype(bool), np.array([target_spacing] * 3)

    def keep_largest_components(mask, min_size=100):
    \”\”\”
    去除小连通域,保留大于 min_size 的血管连通结构。
    \”\”\”
    labeled, num = ndi.label(mask)
    if num == 0:
    return mask

    sizes = ndi.sum(mask, labeled, index=np.arange(1, num + 1))
    keep_labels = np.where(sizes >= min_size)[0] + 1

    cleaned = np.isin(labeled, keep_labels)
    return cleaned

    def preprocess_mask(mask, spacing, closing_radius=1, min_size=80):
    mask_iso, spacing_iso = resample_to_isotropic(mask, spacing)

    # 三维闭运算,填补局部孔洞
    selem = morphology.ball(closing_radius)
    mask_closed = morphology.binary_closing(mask_iso, selem)

    # 填补内部空洞
    mask_filled = ndi.binary_fill_holes(mask_closed)

    # 删除小连通域
    mask_clean = keep_largest_components(mask_filled, min_size=min_size)

    return mask_clean.astype(bool), spacing_iso

    # 示例
    # mask, spacing = load_mask(\”case001_mask.nii.gz\”)
    # mask_clean, spacing_iso = preprocess_mask(mask, spacing)
    # print(mask.shape, spacing, mask_clean.shape, spacing_iso)

    这部分在论文中可以写成“为了保证几何测量的可靠性,对原始三维 mask 进行各向同性重采样、形态学闭运算、孔洞填补和小连通域去除,为后续中心线提取和半径估计提供稳定输入”。


    2. 三维表面重建

    三维 mask 是体素集合,不能直接用于连续几何分析。需要通过 Marching Cubes 算法提取等值面,生成三角网格。

    表面重建的作用包括:

    可视化冠脉整体结构; 辅助检查 mask 质量; 展示狭窄区域三维形态; 用于投影模拟和表面距离分析。

    C 题代码 2:Marching Cubes 表面重建与可视化

    from mpl_toolkits.mplot3d.art3d import Poly3DCollection

    def reconstruct_surface(mask, spacing=(1, 1, 1), level=0.5):
    \”\”\”
    使用 Marching Cubes 从三维 mask 提取表面网格。
    返回顶点 verts 和面片 faces。
    \”\”\”
    verts, faces, normals, values = measure.marching_cubes(
    mask.astype(np.float32),
    level=level,
    spacing=spacing
    )
    return verts, faces

    def plot_mesh(verts, faces, title=\”Coronary artery surface\”):
    fig = plt.figure(figsize=(8, 8))
    ax = fig.add_subplot(111, projection=\”3d\”)

    mesh = Poly3DCollection(verts[faces], alpha=0.25)
    mesh.set_edgecolor(\”none\”)
    ax.add_collection3d(mesh)

    ax.set_xlim(verts[:, 0].min(), verts[:, 0].max())
    ax.set_ylim(verts[:, 1].min(), verts[:, 1].max())
    ax.set_zlim(verts[:, 2].min(), verts[:, 2].max())
    ax.set_title(title)
    plt.tight_layout()
    plt.show()

    # 示例
    # verts, faces = reconstruct_surface(mask_clean, spacing_iso)
    # plot_mesh(verts, faces)

    论文中可以说明:Marching Cubes 的本质是在三维体数据中寻找血管边界等值面,将离散体素血管转化为连续三角网格,为医生直观观察和后续几何分析提供基础。


    三、C 题建模方案二:中心线与血管树拓扑建模

    1. 为什么必须提取中心线?

    冠状动脉是树状管腔结构。狭窄发生在某一条血管分支的某一段上。直接在三维体素空间中找狭窄很困难,因为血管有弯曲、分叉和自然变细。中心线可以把三维管腔结构压缩成一维路径,使血管狭窄识别变成沿弧长方向的半径变化分析。

    中心线上的每个点应包括:

    三维坐标; 局部半径; 所属血管分支; 到入口点的弧长; 附近曲率; 是否位于分叉附近。


    2. 中心线提取方法

    可以采用三维骨架化方法获得中心线候选,再将骨架转化为图结构。图中节点为骨架点,边为相邻点连接。再通过节点度数识别端点和分叉点。

    C 题代码 3:骨架提取与图结构构建

    import networkx as nx

    try:
    from skimage.morphology import skeletonize_3d
    except ImportError:
    skeletonize_3d = None

    def extract_skeleton(mask):
    \”\”\”
    三维骨架提取。
    \”\”\”
    if skeletonize_3d is None:
    raise ImportError(\”当前 skimage 版本不含 skeletonize_3d,请安装兼容版本或使用替代中心线算法\”)
    skel = skeletonize_3d(mask.astype(np.uint8)) > 0
    return skel

    def skeleton_to_graph(skel, spacing=(1, 1, 1)):
    \”\”\”
    将三维骨架转成 graph。

    赞(0)
    未经允许不得转载:171主机测评 » 【深度解析+代码框架】2026 年河北省研究生数学建模 C/D 题:冠脉造影狭窄识别与零碳园区微电网优化
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址