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

时间:2014-07-09 21:51:52

标签: c# pixels dicom clearcanvas

我正在使用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;


                }
            }

这对于某些图像来说就像一个魅力,而其他图像,特别是低或负窗口中心值,显示不正确。它们显示的是大量不应该是白色的白色像素。

我正在进行正确的窗口/水平计算吗?如果没有,我该如何正确地完成它们?如果是这样,我还需要做些什么才能使其适用于所有场景?

1 个答案:

答案 0 :(得分:1)

所以我最终使用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这就是这种方式去吧。

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