如何将16位深度灰度降级为8位深度图像(rgb 24)

时间:2018-03-22 10:35:13

标签: c# image dicom clearcanvas

所以我在WPF项目中工作。

我有两个DICOM图像(X射线(16位灰度)图像和光学(24位RGB)图像)。

我想要什么

我想通过改变不透明度将两个图像混合在一起。它喜欢增加或减少两个图像之间的不透明度。

如果我想混合这两个图像,我想要做的是将X射线图像降级为8位灰度。因此它在混合时将匹配24位光学图像。

我的问题

如何将16位灰度DICOM图像降级为8位深度(24位RGB)。

我尝试了什么

我尝试使用PixelFormats降级图像。

stride = width * 4;
size = height * stride;
bitmapSource = BitmapImage.Create(width, height, 96, 96, System.Windows.Media.PixelFormats.Gray8, null, bitmapBuffer, stride);

但是,如果我尝试使用上面的代码,结果图像看起来有颗粒感并且有一些损失。我该怎么做才能保持图像的质量并同时降级它。

请帮帮我。我是图像处理和DICOM域的新手。

1 个答案:

答案 0 :(得分:2)

我认为没有很好的机会使用任何Microsoft API。您应该考虑在DICOM标题中有许多属性:

  • (0028,0101)Bits Stored告诉您像素数据使用的位数。确保屏蔽掉未使用的位 - 它们可能包含随机位
  • (0028,0004)光度学解释告诉您是否需要在缩小之前反转图像(MONOCHROME1 - > Identity,MONOCHROME2 - > Invert)
  • (0028,3000)模态LUT序列可能指定应考虑的像素数据的非线性变换
  • (0028,0103)Pixel Representation指示像素的二进制值是解释为无符号整数还是2s补码有符号整数

接下来的问题是:降尺度的目标是什么

  • 原始像素数据原样 - 然后您可以将像素(可能由模态LUT映射)重新缩放到新范围。
  • 医生应该感知的图像 - 然后需要考虑进一步的属性

在后一种情况下,以下转换适用

  • Rescale Slope / Intercept(0028,1053)/(0028,1052)定义像素数据的liniear变换到设备测量的值范围。转换后像素值超过16位是不常见但不禁止的。
  • 窗口中心/宽度(0028,1050)/(0028,1051)定义要映射到8位的像素数据的范围。可能存在多个窗口/水平集,因此难以选择合适的窗口/水平集。

编辑:在澄清此功能将被合并到交互式UI中之后,我建议: 通过组合定义像素数据如何被解释的属性,将像素数据读取为“本机”格式(参见上文)。您可以从此步骤获得中间表示,其中像素数据以32/64位无符号整数格式表示为来自器件的测量值。 然后从DICOM标头中选择第一个Window / Center设置,将缩减定义为8位(参见here)。但允许用户从标题中选择其他窗口/中心设置(如果存在),并允许她手动调整它。