了解 DICOM 图像中的 BPP
Understanding the BPP inside DICOM images
几天以来我一直在使用 FO-DICOM 处理 DICOM 文件。
我正在使用一组 dicom 文件进行测试,并且我一直在打印 "Photometric Interpretation" 和 "Sample Per Pixel" 值,以便更好地了解我的图像类型正在与.
光度解释的结果是 "MONOCHROME2",每像素样本的结果是“1”。
通过阅读标准的第 3 部分,我了解到 MONOCHROME2 代表灰度,从黑色开始为其最小值。
但是每像素样本到底是多少?我认为这是代表每个像素的 字节 (而不是位)的数量(对于一个比例,每个像素有 8 位 是合乎逻辑的灰色对吗?)
但我的问题是,实际上,我的图像似乎有 32 bpp。
我正在处理 512*512 像素的图像,并将它们转换为字节数组。所以我期待 512*512=262144 字节的数组。
但是我得到了 1048630 字节的数组(比 4*262144 多一点)
有人解释一下吗?
编辑:
这是我的一些数据:
PhotometricInterpretation=MONOCHROME2
SamplePerPixel=1
BitsAllocated=16
BitsStored=12
HighBit=11
PixelRepresentation=0
NumberOfFrames=0
属性 (0028,0002) SamplesPerPixel
仅指彩色图像并告诉您图像中存在的平面数(例如 RGB 为 3),因此您有
PhotometricInterpretation=RGB
SamplesPerPixel=3
每像素 8 位(我将在下面重新讨论 BPP)。只要您有 PhotometricInterpretation
= MONOCHROME1 或 MONOCHROME2,您就可以期望 SamplesPerPixel
为 1 而不是其他任何东西。
您需要考虑的是每个像素的位数:
BitsAllocated (0028,0100)
BitsStored (0028,0101)
HighBit (0028,0102)
这些告诉您有多少位用于编码像素值 (BitsAllocated
) 以及这些位中哪些真正包含灰度信息 (BitsStored
, HighBit
)。 HighBit
是 zero-based 通常但不一定 = BitsStored-1
举个例子来说明这一点:对于CT图像,用亨斯菲尔德单位表示灰度值是很常见的,范围从-1000到+3000。这些由 12 位表示,用 2-byte-alignment 存储,因此
BitsAllocated (0028,0100) = 16
BitsStored (0028,0101) = 12
HighBit (0028,0102) = 11
另一个自由度是 PixelRepresentation
,它告诉您像素数据是编码为无符号 (0) 还是 2s 补码 (1)。对于 CT 图像我都见过,但是带符号的像素数据对于 CT 以外的图像类型是相当不寻常的。
在您的示例中,我假设分配的位数 == 32 或(不太可能)您有一个包含多个图像的数据集 ('frames'),因此 NumberOfFrames (0028,0008)
> 1。如果缺少帧数,您可以安全地假设只有一帧。
我这里有点 over-simplified,尤其是关于彩色图像,但我认为这已经够复杂了 ;-)。基本上,DICOM 提供任何可以想象的自由度来编码像素数据并在 header.
中描述编码
我想我在最近 post 推荐你看一下 DCMTK。 DicomImage class 具有一个漂亮的界面 (getInterData()
),它关心所有这些东西并提供从 DICOM 文件中读取的标准化格式的像素数据。
[编辑]: 随意 post 此处的数据集的 DICOM 转储,我会看一下并告诉您如何解释像素数据。
几天以来我一直在使用 FO-DICOM 处理 DICOM 文件。
我正在使用一组 dicom 文件进行测试,并且我一直在打印 "Photometric Interpretation" 和 "Sample Per Pixel" 值,以便更好地了解我的图像类型正在与.
光度解释的结果是 "MONOCHROME2",每像素样本的结果是“1”。
通过阅读标准的第 3 部分,我了解到 MONOCHROME2 代表灰度,从黑色开始为其最小值。
但是每像素样本到底是多少?我认为这是代表每个像素的 字节 (而不是位)的数量(对于一个比例,每个像素有 8 位 是合乎逻辑的灰色对吗?)
但我的问题是,实际上,我的图像似乎有 32 bpp。 我正在处理 512*512 像素的图像,并将它们转换为字节数组。所以我期待 512*512=262144 字节的数组。 但是我得到了 1048630 字节的数组(比 4*262144 多一点)
有人解释一下吗?
编辑:
这是我的一些数据:
PhotometricInterpretation=MONOCHROME2
SamplePerPixel=1
BitsAllocated=16
BitsStored=12
HighBit=11
PixelRepresentation=0
NumberOfFrames=0
属性 (0028,0002) SamplesPerPixel
仅指彩色图像并告诉您图像中存在的平面数(例如 RGB 为 3),因此您有
PhotometricInterpretation=RGB
SamplesPerPixel=3
每像素 8 位(我将在下面重新讨论 BPP)。只要您有 PhotometricInterpretation
= MONOCHROME1 或 MONOCHROME2,您就可以期望 SamplesPerPixel
为 1 而不是其他任何东西。
您需要考虑的是每个像素的位数:
BitsAllocated (0028,0100)
BitsStored (0028,0101)
HighBit (0028,0102)
这些告诉您有多少位用于编码像素值 (BitsAllocated
) 以及这些位中哪些真正包含灰度信息 (BitsStored
, HighBit
)。 HighBit
是 zero-based 通常但不一定 = BitsStored-1
举个例子来说明这一点:对于CT图像,用亨斯菲尔德单位表示灰度值是很常见的,范围从-1000到+3000。这些由 12 位表示,用 2-byte-alignment 存储,因此
BitsAllocated (0028,0100) = 16
BitsStored (0028,0101) = 12
HighBit (0028,0102) = 11
另一个自由度是 PixelRepresentation
,它告诉您像素数据是编码为无符号 (0) 还是 2s 补码 (1)。对于 CT 图像我都见过,但是带符号的像素数据对于 CT 以外的图像类型是相当不寻常的。
在您的示例中,我假设分配的位数 == 32 或(不太可能)您有一个包含多个图像的数据集 ('frames'),因此 NumberOfFrames (0028,0008)
> 1。如果缺少帧数,您可以安全地假设只有一帧。
我这里有点 over-simplified,尤其是关于彩色图像,但我认为这已经够复杂了 ;-)。基本上,DICOM 提供任何可以想象的自由度来编码像素数据并在 header.
中描述编码我想我在最近 post 推荐你看一下 DCMTK。 DicomImage class 具有一个漂亮的界面 (getInterData()
),它关心所有这些东西并提供从 DICOM 文件中读取的标准化格式的像素数据。
[编辑]: 随意 post 此处的数据集的 DICOM 转储,我会看一下并告诉您如何解释像素数据。