我有一个 DICOM 图像,我正在使用 C# 读取并将其转换为 16 位位图。位图已创建,但图像具有 DICOM 覆盖。我想在创建最终的 dicom 位图时将叠加层刻录到位图中。我无法做到这一点。有什么帮助吗?
一种方法是创建叠加数据的位图并合并 2 个位图,但我也无法将叠加数据作为位图获取。我已经捕获了二进制叠加数据,但是如何刻录成位图?
谢谢
有两种类型的覆盖:
1) Burned-In:是原版。它使用单色像素数据的更高位(超出像素范围,例如,当 BitsAllocated 为 16 且 BitsStored 为 12 时,每个像素有 4 个未使用的位(位 12..15),可用于覆盖。我不确定它是如何处理签名图像的。
请注意,没有标签指定图像是否具有这样的覆盖。(有一个名为 Burned In Annotation (0028,0301) 的标签,但它意味着别的东西) .
2)覆盖模块:为覆盖保留一系列标签(组0x600xx)。每个这样的组都包含几个标签以及一个每像素 1 位的位图,这1
意味着存在覆盖。
请注意,它不是标准的 GDI 位图,线条未在 DWORD 边界上对齐!(而且我不确定它是否使用相同的位字节序。)
一个 DICOM 图像可以有多个(最多 16 个?)这样的叠加层。请参阅标准的第 3 部分以了解确切的规格。
覆盖平面始终为每像素 1 位,其中Overlay Bits Allocated
1 和Overlay Bits Position (60XX, 0102)
始终为 0。一位覆盖数据与元素分开编码,Pixel Data
元素Overlay Data (60XX, 3000)
用于存储数据。覆盖数据元素的值表示为 OW。但是,OB 可用于显式 VR 编码。
根据DICOM 标准第 8.1.2 节的 PS 3.5,“覆盖数据被编码为单个覆盖平面的位的直接串联,其中覆盖平面的第一个比特被编码为最低有效位,紧随其后的是下一个最高有效位中的覆盖平面的下一位。当覆盖数据跨越 OW 情况下的字边界或 OB 情况下的字节边界时,它应继续被编码,分别在下一个字或字节中的最低有效位到最高有效位”。
2 字节字的字节顺序(OW 的 VR)由编码中使用的字节序决定。所以在行边界没有使用填充,它是从左到右和从上到下编码的,一次一行,其中覆盖位 1 是覆盖平面的第一位(左上像素)。
形式上,叠加数据被允许嵌入到未使用的位中Pixel Data (7FE0, 0010)
,并Overlay Bit Position (60XX, 0102)
用于指示存储叠加数据的像素数据中的未使用位。在这种类型的编码中,应该与Image Pixel module的属性Overlay Bits Allocated (60XX, 0100)
具有相同的值。大于 1 的值表示覆盖数据嵌入在像素数据中 。Bits Allocated (0028, 0100)
Overlay Bits Allocated
偶数组(6000-601F,eeee)用于覆盖平面编码,数据集每个图像最多可以有 16 个覆盖。
DICOM 覆盖只是一个位图掩码。在渲染图像时,我建议只遍历像素,并且在将像素设置为白色的情况下。
对于灰度图像,您必须检查光度解释以查看它是 MONOCHROME1 还是 MONOCHROME2。然后,您必须检查分配的位以查看最大像素值是多少,并在 MONOCHROME1 图像的情况下强制将覆盖设置为该值的像素值。对于 MONOCHROME2 图像,您必须将启用覆盖的像素设置为最小像素值。
在彩色图像的情况下,您可以将像素更改为特定颜色,或在必要时更改为白色以显示叠加层。