int16、uint8 等图像背后的逻辑
Logic behind int16, uint8 etc. images
我可能对图像中的数据类型有一些误解。假设我们有一个 uint8 图像。由于 uint8 介于 0 和 255 之间,因此 0 是最暗的,255 是最亮的强度值。
对于 int16 图像,相同的逻辑会使 -32768 成为最暗的强度值,而 32767 成为最亮的强度值。但是,我有一个 int16 图像(它最初是一个 dicom),其中最暗的像素是 -1024,最亮的是 4095。我说 int16 是因为像素保存在一个 int16 类型的 numpy 数组中。
此外,当我连接两个 int16 numpy 数组,其中一个是 a = np.ones((100,100), dtype=np.int16) * 32767
另一个是 b = np.ones((100,100), dtype=np.int16) * 32766
时,它会生成一个二进制图像,其中 32767s 是白色的,32766s 是黑色的。
有人可以帮我解决我的错误吗?
简答
没问题,这就是 DICOM 的工作原理。
长答案
在DICOM标准中,像素值与其颜色(灰度)没有直接关系。这些值应对应于所获取项目的物理属性(例如,在计算机断层扫描中,像素值在 Hounsfield Units 中测量。*(除非它们被线性重新缩放,见下文))。
像素图像的灰度级根据用户设置的任意选择的最小值和最大值动态显示。每个小于或等于最小值的像素值是黑色,每个大于或等于最大值的像素值是白色,其他是线性插值的灰度级。
所以在二进制图像中黑色最小值等于 32766 白色最大值等于 32767 是完全没问题的。
如果您使用 DICOM 查看器,您将有可能动态更改这些最小值和最大值,因此您将更改图像的总对比度和亮度。放射科医师有必要进行诊断,例如不同范围的肺和骨骼。如果您将 DICOM 导出为其他文件格式,您应该选择颜色映射是什么。通常它是全范围(最低值变黑,最亮变白)。
还有两个其他值经常用来代替最小值和最大值:"window width" (ww) 和 "window level" (wl)。 ww = max-min
、wl=(max+min)/2
。
你应该看看这些问题和答案:
*你还应该考虑标签"rescale intercept"(0028,1052)和"rescale slope"(0028,1053),像素数组的线性重缩放值到最终值,但通常它是在 dicom 工具包中实现。
FinalPixelValue = (RawPixelValue * RescaleSlope) + RescaleIntercept
我可能对图像中的数据类型有一些误解。假设我们有一个 uint8 图像。由于 uint8 介于 0 和 255 之间,因此 0 是最暗的,255 是最亮的强度值。
对于 int16 图像,相同的逻辑会使 -32768 成为最暗的强度值,而 32767 成为最亮的强度值。但是,我有一个 int16 图像(它最初是一个 dicom),其中最暗的像素是 -1024,最亮的是 4095。我说 int16 是因为像素保存在一个 int16 类型的 numpy 数组中。
此外,当我连接两个 int16 numpy 数组,其中一个是 a = np.ones((100,100), dtype=np.int16) * 32767
另一个是 b = np.ones((100,100), dtype=np.int16) * 32766
时,它会生成一个二进制图像,其中 32767s 是白色的,32766s 是黑色的。
有人可以帮我解决我的错误吗?
简答
没问题,这就是 DICOM 的工作原理。
长答案
在DICOM标准中,像素值与其颜色(灰度)没有直接关系。这些值应对应于所获取项目的物理属性(例如,在计算机断层扫描中,像素值在 Hounsfield Units 中测量。*(除非它们被线性重新缩放,见下文))。
像素图像的灰度级根据用户设置的任意选择的最小值和最大值动态显示。每个小于或等于最小值的像素值是黑色,每个大于或等于最大值的像素值是白色,其他是线性插值的灰度级。
所以在二进制图像中黑色最小值等于 32766 白色最大值等于 32767 是完全没问题的。
如果您使用 DICOM 查看器,您将有可能动态更改这些最小值和最大值,因此您将更改图像的总对比度和亮度。放射科医师有必要进行诊断,例如不同范围的肺和骨骼。如果您将 DICOM 导出为其他文件格式,您应该选择颜色映射是什么。通常它是全范围(最低值变黑,最亮变白)。
还有两个其他值经常用来代替最小值和最大值:"window width" (ww) 和 "window level" (wl)。 ww = max-min
、wl=(max+min)/2
。
你应该看看这些问题和答案:
*你还应该考虑标签"rescale intercept"(0028,1052)和"rescale slope"(0028,1053),像素数组的线性重缩放值到最终值,但通常它是在 dicom 工具包中实现。
FinalPixelValue = (RawPixelValue * RescaleSlope) + RescaleIntercept