我正在尝试在我的应用程序中实现 de Dicom 规范中的窗口宽度和级别公式。只是它目前没有返回任何灰度。 dicom 指定的公式如下:

根据以下伪代码应用这些属性,其中 x 是输入值,y
是范围从 ymin 到 ymax 的输出值,c 是窗口中心 (0028,1050),w 是
窗口宽度(0028,1051):

if (x <= c - 0.5 - (w-1)/2), then y = ymin
else if (x > c - 0.5 + (w-1)/2), then y = ymax,
else y = ((x - (c - 0.5)) / (w-1) + 0.5) * (ymax - ymin)+ ymin

所以我将其翻译成以下 c# 语法:
if (pixelData[i] <= wLevel - 0.5 - (wWidth - 1) / 2)
    oColor = 0;
else if (pixelData[i] > wLevel - 0.5 + (wWidth - 1) / 2)
    oColor = 255;
else
    oColor = (int)((pixelData[i] - (wLevel - 0.5)) / (wWidth - 1) + 0.5) * (255 - 0) + 0;

然而,公式的最后一部分
oColor = (int)((pixelData[i] - (wLevel - 0.5)) / (wWidth - 1) + 0.5) * (255 - 0) + 0;

似乎只返回 0

任何人都知道这怎么可能?

最佳答案

VOI LUT 的含义是将给定的像素范围映射到可显示值(通常为 0..0xFF),对超出范围的像素值使用钳位。

这意味着对于给定的窗口/级别,我们可以计算可显示范围:
level-window/2 , level + window/2

对于该范围内的像素值,使用线性变换:
((pixel - lower_window_limit) / window) * displayable_range
其中 lower_window_limitlevel - window/2
您的公式中缺少此 -window/2

关于c# - Dicom 窗口宽度和级别公式不提供灰度值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4096702/

10-13 04:33
查看更多