Python int16、uint8等图像背后的逻辑

Python int16、uint8等图像背后的逻辑,python,image,numpy,dicom,Python,Image,Numpy,Dicom,关于图像中的数据类型,我可能有一些误解。假设我们有一个uint8图像。由于uint8介于0和255之间,因此0是最暗的,255是最亮的强度值 对于int16图像,相同的逻辑将使-32768成为最暗的强度值,32767成为最亮的强度值。然而,我有一个int16图像(它最初是一个dicom),其中最暗的像素是-1024,最亮的是4095。我之所以说int16是因为像素保存在int16类型的numpy数组中 另外,当我连接两个int16 numpy数组时,其中一个是a=np.ones((100100)

关于图像中的数据类型,我可能有一些误解。假设我们有一个uint8图像。由于uint8介于0和255之间,因此0是最暗的,255是最亮的强度值

对于int16图像,相同的逻辑将使-32768成为最暗的强度值,32767成为最亮的强度值。然而,我有一个int16图像(它最初是一个dicom),其中最暗的像素是-1024,最亮的是4095。我之所以说int16是因为像素保存在int16类型的numpy数组中

另外,当我连接两个int16 numpy数组时,其中一个是
a=np.ones((100100),dtype=np.int16)*32767
,另一个是
b=np.ones((100100),dtype=np.int16)*32766
,它会产生一个二进制图像,其中32767s是白色的,32766s是黑色的


有人能帮我解释一下我做错了什么吗?

简短回答

没有问题,这就是DICOM的工作原理

长答案

在DICOM标准中,像素值与其颜色(灰度)没有直接关系。这些值应与所采集项目的物理属性相对应(例如,在计算机断层扫描中,像素值在*中测量(除非线性重新缩放,见下文))

根据用户设定的任意最小值和最大值动态显示像素图像的灰度。每个小于或等于最小值的像素为黑色,大于或等于最大值的像素为白色,其他像素为线性插值灰度

所以,在二值图像中,黑色最小值等于32766,白色最大值等于32767,这是非常好的

如果您使用DICOM查看器,则可以动态更改这些最小值和最大值,从而更改图像的总对比度和亮度。放射科医生有必要对不同范围的肺和骨骼进行诊断。如果您将DICOM导出为其他文件格式,您应该选择,什么是颜色映射。通常为全量程(最低值为黑色,最亮值为白色)

还有另外两个值,通常用来代替最小值和最大值:“窗口宽度”(ww)和“窗口级别”(wl)<代码>ww=max-min,
wl=(max+min)/2

你应该看看这些问题和答案:

*你还应该考虑标签“ReSCALE截距”(00281052)和“ReSCALE斜率”(00281053),即像素阵列的线性RESCALE值到最终值,但通常是在DICOM工具包中实现的。 FinalPixelValue=(RawPixelValue*重缩放坡度)+重缩放截距


图像有各种格式,例如JPEG、PNG等。您似乎在谈论某种16位单色位图。但它的格式是什么?也许是Windows位图?我肯定在某个地方有一个格式规范,其中包含您正在寻找的答案。@zvone我认为它没有JPEG或PNG格式,因为我只是创建了一个numpy数组,并使用matplotlib.pyplot将其可视化。顺便说一下,我在第二段提到的图像格式是dicom。在python中,可以通过获取图像的pixel_数组属性(int16 numpy.ndarray)来获得实际像素值。我只是想澄清一下。DICOM是一种复杂的格式。像素数据可以有多种不同的格式,所有DICOM文件都不相同。有DICOM标签,用每像素位数、压缩等来描述像素数据。也许这一页会对你有所帮助: