我正在使用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;
}
}
这对于某些图像来说就像一个魅力,而其他图像,特别是低或负窗口中心值,显示不正确。它们显示的是大量不应该是白色的白色像素。
我正在进行正确的窗口/水平计算吗?如果没有,我该如何正确地完成它们?如果是这样,我还需要做些什么才能使其适用于所有场景?
答案 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这就是这种方式去吧。
我仍然最终将像素从这个位图复制到另一个矩阵,通过滑块和东西来改变窗口中心/宽度,但要获得图像,这就是你应该使用的。