1

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


                }
            }

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

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

4

1 回答 1

2

所以我最终使用了 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,这就是要走的路。

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

于 2014-07-11T16:07:37.173 回答