Dicom图像窗口和级别问题(有时)

本文关键字:问题 有时 别问 图像 窗口 Dicom | 更新日期: 2023-09-27 18:12:09

我正在使用c# ClearCanvas库制作一个图像查看器,我正在尝试显示图像,并将其存储的窗口中心和窗口宽度值应用于图像。为此,我从Dicom文件中读取窗口中心、窗口宽度和原始像素数据,并将其转换为字节数组,然后使用以下代码应用窗口设置:

 int lower_bound = window_center - window_width / 2;
 int upper_bound = window_center + window_width / 2;

            //copy matrix and do window caluclations
            float[] wlpixels = new float[pixels.Length];
            for (int i = 0; i < w * h; i++)
            {
                if (pixels[i] <= lower_bound)
                    wlpixels[i] = 0;
                else if (pixels[i] > upper_bound)
                    wlpixels[i] = 255;
                else
                {
                    wlpixels[i] = ((pixels[i] - lower_bound) / window_width) * 255;

                }
            }

对于一些图像,特别是具有低窗口中心值或负窗口中心值的图像,这就像一个魅力一样,显示不正确。它们显示了大量本不应该是白色的白色像素。

我做我的窗口/电平计算正确吗?如果不是,我如何正确地做它们?如果是这样,我还需要做些什么才能使它适用于所有场景?

Dicom图像窗口和级别问题(有时)

所以我最终使用Clear Canvas的drawToBitmap()函数来显示图像(我之前使用过,但因为没有应用窗口设置而划痕)。事实证明,为了使它考虑到窗口设置,您需要包括

using ClearCanvas.ImageViewer.Tools.Standard;

然后使用drawToBitmap()来显示图像,您可以使用类似于以下的代码:

DicomFile dcm = new DicomFile();
dcm.Load("filename");
LocalSopDataSource lsds = new LocalSopDataSource(dcm);
ImageSop sop = new ImageSop(lsds);
Frame frame = sop.Frames[1];
IPresentationImage pres = PresentationImageFactory.Create(frame);
bitmap = pres.DrawToBitmap(frame.Columns, frame.Rows);

我已经用没有原始像素数据的Dicom图像测试了这一点,它也可以工作(不知道为什么)…如果你用的是Clear Canvas这就是方法。

我最终还是将像素从这个位图复制到另一个矩阵中,通过滑块和其他东西来改变窗口的中心/宽度,但是为了获得图像,这是你应该使用的。