如何在医学图像上叠加无填充边缘轮廓且保持原图像对比度?
解决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
相关产品推荐
相关产品推荐

