如何实现DICOM图像去噪且保留原始像素值取值范围
问题回答
一、谷歌检索关键词推荐
直接用以下组合检索即可精准定位符合要求的方法,可根据使用场景叠加限定词:
- 通用核心检索词:
image denoising preserve original pixel value range - 医学影像场景加限定:
DICOM denoising without intensity normalization retain HU value scale(DICOM CT影像的像素值为HU值,加该限定可直接搜到大量同场景医学影像处理方案) - Python技术栈(skimage/OpenCV环境)加限定:
python denoising algorithm no pixel rescale preserve_range - 筛除自带归一化逻辑的方法:
denoising linear operation no automatic value scaling
二、符合要求的去噪方法推荐
核心判断标准:方法本身为纯邻域运算逻辑、无内置像素值归一化/截断到固定区间的步骤,即可保留原始像素尺度,以下为实测可用的方案:
1. scikit-image 生态内方法
首先建议将scikit-image升级到0.19及以上最新稳定版,该版本后几乎所有内置去噪方法都新增了preserve_range参数,和已验证可用的denoise_nl_means逻辑一致,将参数设为True即可保留原始像素范围:
skimage.restoration.denoise_tv_chambolle(全变分去噪,适合需要保留边缘的去噪场景)skimage.restoration.denoise_bilateral(双边滤波,保边去噪效果稳定)skimage.restoration.wiener(维纳滤波,适合高斯噪声占比高的场景)
另外经典滤波类方法本身无内置缩放逻辑,直接传入原始DICOM像素数组即可保留尺度,不需要额外设置参数:
skimage.filters.gaussian(高斯滤波)skimage.filters.median(中值滤波,适合去除脉冲噪声、椒盐噪声)skimage.filters.uniform_filter(均值滤波)
注意:使用上述滤波方法时,不要提前用
img_as_float等工具函数把原始像素值归一化到0-1区间,直接传入读取到的int16/int32类型原始像素数组即可,否则会丢失原始尺度。
2. OpenCV 生态内方法
OpenCV下所有滤波、去噪类方法默认完全保留输入像素的尺度范围,无任何自动归一化逻辑,且对大尺寸DICOM影像的运算速度远快于skimage,常用方法包括:
cv2.GaussianBlur高斯滤波cv2.medianBlur中值滤波cv2.bilateralFilter双边滤波cv2.fastNlMeansDenoising非局部均值去噪(灰度图版本)
使用时直接传入原始像素数组即可,不需要做任何尺度转换。
3. 通用校验规则
不管用什么去噪方法,处理前后都可以加两行校验代码确认尺度没有偏移:
print(f"输入范围: {img.min()}, {img.max()}") res = denoise_func(img) print(f"输出范围: {res.min()}, {res.max()}")
确认输出范围和输入范围处于同一尺度、无整体缩放/截断,再开展后续STD、均值等统计计算即可。
内容的提问来源于stack exchange,提问作者NeX'T'iME
相关产品推荐
相关产品推荐

