You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在医学图像上叠加无填充边缘轮廓且保持原图像对比度?

解决SimpleITK LabelOverlay改变原图像对比度的问题

核心原因

LabelOverlay函数默认开启autoWindowLevel=True,会自动将原始医学图像的像素值映射到0-255范围以适配显示,导致原图像的强度信息被改变。要保留原图像强度,有两种直接的解决方法:


方法一:修改LabelOverlay的内置参数(推荐)

直接在LabelOverlay中关闭自动窗宽窗高调整,设置autoWindowLevel=False即可,代码如下:

import SimpleITK as sitk

# 提取无填充轮廓
contour_img = sitk.LabelContour(imgOriginal2)
# 叠加轮廓并保持原图像强度
sitk_show(sitk.LabelOverlay(imgOriginal1, contour_img, autoWindowLevel=False))

注意事项

如果原始医学图像的像素值范围不在0-255(比如CT图像的HU值),关闭自动调整后可能显示偏暗/偏亮,此时可以先手动对原始图像做窗宽窗高调整,再叠加轮廓:

# 手动设置窗宽窗高(示例值,需根据你的图像调整)
window_min = -1000
window_max = 600
# 调整原始图像的显示范围,同时保留强度映射逻辑
adjusted_original = sitk.Cast(sitk.IntensityWindowing(imgOriginal1, windowMinimum=window_min, windowMaximum=window_max), sitk.sitkUInt8)
# 叠加轮廓
overlay_img = sitk.LabelOverlay(adjusted_original, contour_img, autoWindowLevel=False)
sitk_show(overlay_img)

方法二:手动实现轮廓叠加(灵活可控)

如果需要更自定义的轮廓样式,可将图像转为numpy数组手动处理,完全保留原始图像强度:

import SimpleITK as sitk
import numpy as np

# 提取轮廓
contour_img = sitk.LabelContour(imgOriginal2)
# 转为numpy数组
original_np = sitk.GetArrayFromImage(imgOriginal1)
contour_np = sitk.GetArrayFromImage(contour_img)

# 将单通道灰度图转为RGB三通道(方便叠加彩色轮廓)
if len(original_np.shape) == 2:
    original_rgb = np.stack([original_np] * 3, axis=-1)
else:
    original_rgb = original_np

# 标记轮廓位置(这里用红色,可按需修改颜色值)
contour_mask = contour_np > 0
original_rgb[contour_mask] = [255, 0, 0]

# 转回SimpleITK图像并保留原图像的空间信息
overlay_img = sitk.GetImageFromArray(original_rgb)
overlay_img.CopyInformation(imgOriginal1)

# 显示结果
sitk_show(overlay_img)

内容的提问来源于stack exchange,提问作者Mrmr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:36:23