【问题标题】:Fellow Oak DICOM - changing image window levelFellow Oak DICOM - 更改图像窗口级别
【发布时间】:2012-10-27 23:49:02
【问题描述】:

我不是一个有经验的程序员,只需要在我的 VS2010 项目中添加一个 DICOM 查看器。我可以在 Windows 窗体中显示图像,但不知道如何更改窗口中心和宽度。这是我的脚本:

DicomImage image = new DicomImage(_filename);
            int maxV = image.NumberOfFrames;
            sbSlice.Maximum = maxV - 1;
            image.WindowCenter = 7.0;
            double wc = image.WindowCenter;
            double ww = image.WindowWidth;

            Image result = image.RenderImage(0);
            DisplayImage(result);

它没有工作。我不知道这是否是正确的方法。

【问题讨论】:

  • 您能更清楚地了解您使用的是什么 DICOM 库吗?
  • 我正在使用 Fellow Oak DICOM for .NET,谢谢。
  • 注意到您在 fo-dicom 论坛上发布了相同的问题,并得到了您正在运行的软件版本中存在窗口级错误的响应。为了保持 Stackoverflow 的一致性,最好根据论坛回复在此处提供您自己的答案,并在问题中指出您正在运行 fo-dicom 版本 1.0.26。
  • 好点,一旦我得到它的工作,我会发布答案,该错误已在最新的 Git 中修复;然而 image.WindowCenter = 7.0;没用,正如我提到的,我不是经验丰富的程序员,希望找到有关如何更改窗口级别的示例或文档。

标签: c# asp.net dicom fo-dicom


【解决方案1】:

创建 DicomImage 类并不是为了将其用于实现图像查看器。创建它是为了在 DICOM Dump 实用程序中渲染预览图像并测试图像压缩/解压缩编解码器。也许将它包含在库中是一个错误?

当代码被用于超出其预期功能的事情时,我很难在代码中发现错误。

也就是说,我花了一些时间来修改代码,以便将 WindowCenter/WindowWidth 属性应用于渲染图像。您可以在 Git 存储库中找到这些修改。

var img = new DicomImage(fileName);
img.WindowCenter = 2048.0;
img.WindowWidth = 4096.0;
DisplayImage(img.RenderImage(0));

【讨论】:

  • 谢谢科尔比,非常感谢。你是对的,我试图将库用于扩展功能;毫无疑问,这是由于我对 DICOM 的经验有限。再次感谢您的努力。
【解决方案2】:

我查看了代码,它看起来非常错误。 https://github.com/rcd/fo-dicom/blob/master/DICOM/Imaging/DicomImage.cs

在当前的错误实现中,设置WindowCenterWindowWidth 属性无效,除非Dataset.Get(DicomTag.PhotometricInterpretation) 在Load() 期间为Monochrome1Monochrome2。这已经很荒谬了,但它仍然不能使用,因为_renderOptions 变量只设置在一个地方,并立即用于_pipeline 创建(没有机会使用WindowCenter 属性更改它)。你唯一的机会是灰度_renderOptions初始化:_renderOptions = GrayscaleRenderOptions.FromDataset(Dataset);

当前的解决方案:你的数据集应该有

  • DicomTag.WindowCenter 设置得当
  • DicomTag.WindowWidth != 0.0
  • DicomTag.PhotometricInterpretation == Monochrome1Monochrome2

以下代码实现了这一点:

DicomDataset dataset = DicomFile.Open(fileName).Dataset;
//dataset.Set(DicomTag.WindowWidth, 200.0); //the WindowWidth must be non-zero
dataset.Add(DicomTag.WindowCenter, "100.0");
//dataset.Add(DicomTag.PhotometricInterpretation, "MONOCHROME1"); //ValueRepresentations tag is broken
dataset.Add(new DicomCodeString(DicomTag.PhotometricInterpretation, "MONOCHROME1"));
DicomImage image = new DicomImage(dataset);
image.RenderImage();

最好的解决方案:等待这个有缺陷的库被修复。

【讨论】:

  • 感谢您抽出宝贵时间,我们在以下代码中缩小了 DicomDataset 类中的问题: if (typeof(T) == typeof(decimal)) return Add(new DicomDecimalString(tag, values. Cast().ToArray()));错误是“无法使用 System.Int32 类型的值创建 DS 类型的 DICOM 元素”,我将其发布在 google 组上。总的来说,我发现 fo-​​Dicom 是更好的库之一,我已经厌倦了其他工具包而没有太多成功。
  • 为什么你认为这是问题的根源?你有小数的地方吗?如果问题中发布的代码有效,我想我可以编写代码以使 WindowsCenter 工作。附:你的图像是灰度的吗?
  • 图像是灰度的。这是我解决此问题的解决方法的链接:groups.google.com/forum/?fromgroups=#!topic/fo-dicom/…。谢谢
  • 1) 这在当前的库实现中不起作用。 2) WindowCenter 的类型应该是double,而不是ushort double。 3)我会更新我的答案并尽快发布代码草案。
  • 谢谢,我收到了这个错误:Dicom.DicomDataset' does not contain a definition for 'Set'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
相关资源
最近更新 更多