Python实现nii转PNG时图像对比度不足的解决方法咨询
NII转PNG对比度低的解决方法
你当前导出的CT切片对比度差,核心原因是全局min-max归一化的逻辑不符合CT数据的特性:CT值的覆盖范围从空气的-1000HU到骨骼的1000+HU,这些极端值会把血管、软组织对应的有效灰度区间压缩到极窄的范围,最终输出的图像自然整体发灰、细节看不清。
最优方案:使用CT窗宽窗位截断
针对动脉分割场景,直接套用临床读片用的窗宽窗位参数截断HU值,再做归一化即可,这是效果最稳定、最符合医疗影像使用习惯的方案:
- 动脉期CT常用参数参考:窗位300400HU,窗宽8001000HU,可根据你的实际数据微调,窗宽越小对比度越强
- 截断所有超出窗范围的极值后,再映射到0-255灰度区间,有效组织的对比度会直接拉开
可选优化项
- 放弃整个3D体全局归一化,改为单切片做分位数截断:去掉每个切片前后0.5%~1%的极端像素值,避免单个层面的异常值拉低所有切片的显示效果
- 保存前将数组转为
np.uint8类型,避免imageio处理浮点数组时出现灰度映射错误 - 若需要更强的局部对比度,可在归一化后对单切片做直方图均衡化,注意该操作仅用于CT图像,不要处理mask标签
修改后的可直接运行代码
import numpy as np import os import nibabel as nib import imageio def nii_to_image(file, pos, mode): patient_name = file.split('/')[-1].split('.')[0] if mode == 'mask': save_to = 'dataset/Сегментация артерии/МАСКА/png/' + patient_name if mode == 'ct': save_to = 'dataset/Сегментация артерии/КТ/png/' + patient_name if not os.path.exists(save_to): os.makedirs(save_to, exist_ok=True) img = nib.load(file) img_fdata = img.get_fdata() (x,y,z) = img.shape if mode == 'ct': # 动脉CT窗宽窗位,可按需调整 window_center = 350 window_width = 900 min_hu = window_center - window_width / 2 max_hu = window_center + window_width / 2 # 全局窗截断 img_fdata = np.clip(img_fdata, min_hu, max_hu) img_fdata = (img_fdata - min_hu) / (max_hu - min_hu) * 255 for i in range(z): if pos == 'ax': slice_data = img_fdata[:, :, i] if mode == 'ct': # 单切片分位数截断,进一步优化对比度,不需要可注释 slice_min = np.percentile(slice_data, 0.5) slice_max = np.percentile(slice_data, 99.5) slice_data = np.clip(slice_data, slice_min, slice_max) slice_data = (slice_data - slice_min) / (slice_max - slice_min) * 255 slice_data = slice_data.astype(np.uint8) imageio.imwrite(os.path.join(save_to, f'{i}.png'), slice_data)
当前低对比度效果参考

内容的提问来源于stack exchange,提问作者kndahl
相关产品推荐
相关产品推荐

