Dicom Window ширина и уровень формулы не дают серых значений - PullRequest
4 голосов
/ 04 ноября 2010

Я пытаюсь реализовать формулу ширины и уровня окна из спецификации de 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;

Howevery, последняя часть формулы

oColor = (int)((pixelData[i] - (wLevel - 0.5)) / (wWidth - 1) + 0.5) * (255 - 0) + 0;

Только кажется, что возвращает 0

Example

Кто-нибудь видит, как это возможно?

1 Ответ

6 голосов
/ 04 ноября 2010

Значение VOI LUT состоит в том, чтобы сопоставить заданный диапазон пикселей с отображаемыми значениями (обычно 0..0xFF), используя ограничение для значений пикселей вне диапазона.

Это означает, что для данного окна / уровня мы можем вычислить отображаемый диапазон:

level-window/2 , level + window/2.

Для значений пикселей в этом диапазоне используется линейное преобразование:

((pixel - lower_window_limit) / window) * displayable_range

, где lower_window_limit равно level - window/2

Это -window/2 отсутствует в вашей формуле.

...