2015-10-09 3 views
3


Я пытаюсь реализовать средство просмотра dicom. Для файла dicom я могу установить ширину окна и центр окна через fo-dicom framework. Но иногда мне нужно установить параметры для растрового изображения. Я нашел, как can do it, но это не работает.Вычислить ширину окна и центр окна для растрового изображения

private Bitmap setWinWidthAndCenter(Bitmap bmp) 
{ 
    int center = (int)vsWindowCenter.Value; 
    int width = (int)vsWindowWidth.Value; 
    var wyMin = center - 0.5 - (width - 1)/2; 
    var wMax = center - 0.5 + (width - 1)/2; 
    System.Drawing.Color color; 
    for (int i = 0; i < bmp.Width; i++) 
    { 
     for (int j = 0; j < bmp.Height; j++) 
     { 
      color = bmp.GetPixel(i, j); 
      if (color.R <= wyMin) 
       color = System.Drawing.Color.FromArgb(0, 0, 0); 
      else if (color.R > wMax) 
       color = System.Drawing.Color.FromArgb(255, 255, 255); 
      else 
      { 
       var val = (int)(((color.R - (center - 0.5))/(width - 1) + 0.5) * 255); 
       color = System.Drawing.Color.FromArgb(val, val, val); 
      } 
      bmp.SetPixel(i, j, color); 
     } 
    } 
    return bmp; 
} 

Может быть, кто-нибудь знает, что не так.

РЕДАКТИРОВАТЬ 1:
Левое изображение ожидаемый результат, который был получен с помощью Fo-DICOM библиотеки. Правильное изображение - результат после обработки через мою функцию.
enter image description here enter image description here

+0

Можете ли вы быть более конкретным о том, что происходит не так? –

+0

@WilfRosenbaum, результат ярче, чем ожидалось. Перед проектом я никогда не работал с обработкой изображений и не понимал некоторых вещей. – dremerDT

+0

Я думаю, что ваша линия –

ответ

0

Я нашел решение проблемы.
Алгоритм был прав, но с одной вещью: Растровое изображение имеет начальные значения ширины окна и центра, есть Центр окон: 127 и ширина окна 255.
Все, что нам нужно сделать, это рассчитать разницу между начальными значениями в файле dicom и значениях, которые мы хотим установить. Затем мы можем просто добавить полученное значение к исходному значению битмапа.
Правый код, показанный ниже.

public Bitmap setWinWidthAndCenterForBitmap(Bitmap bmp, double defaultCenter, double defaultWidth, double currentCenter, double currentWidth) 
{ 
    double difCenter = currentCenter - defaultCenter; 
    double difWidth = currentWidth - defaultWidth; 
    int WinCenter = 127 + (int)difCenter; 
    int WinWidth = 255 + (int)difWidth; 
    var wMin = WinCenter - 0.5 - (WinWidth - 1)/2; 
    var wMax = WinCenter - 0.5 + (WinWidth - 1)/2; 
    System.Drawing.Color color; 
    for (int i = 0; i < bmp.Width; i++) 
    { 
     for (int j = 0; j < bmp.Height; j++) 
     { 
      color = bmp.GetPixel(i, j); 
      color = System.Drawing.Color.FromArgb(
       calculateColor(color.R, wMin, wMax, WinCenter, WinWidth), 
       calculateColor(color.G, wMin, wMax, WinCenter, WinWidth), 
       calculateColor(color.B, wMin, wMax, WinCenter, WinWidth)); 
      bmp.SetPixel(i, j, color); 
     } 
    } 
    return bmp; 
} 
private byte calculateColor(byte c, double wMin, double wMax, double WinCenter, double WinWidth) 
{ 
    if (c <= wMin) 
     return 0; 
    else if (c > wMax) 
     return 255; 
    else 
     return (byte)(((c - (WinCenter - 0.5))/(WinWidth - 1) + 0.5) * 255); 
} 
4

Посмотрите на свои значения по центру и ширине. Они могут быть специфичными для 12 или 16-битных монохромных изображений. Это сделало бы их значительно отличными от ограничивающих растровых изображений 0-255 RGB, которые вы используете.

Вы должны либо должным образом масштабировать значения центра и ширины, либо использовать необработанные монохромные данные.

+0

Спасибо за ваш ответ. Если я правильно понял, для растрового изображения и необработанных данных нужны разные значения параметров для получения того же результата. И проще манипулировать необработанными данными, чем с растровыми изображениями. – dremerDT

+0

Справа. Данные в заголовке DICOM будут относиться к значениям необработанных данных, а не к восстановленному растровому изображению. – cneller

+0

Немного грустно ... Потому что я делал изображение из раздела множества изображений dicom, таких как режим MPR в программе «Onis». И есть одна проблема, когда пользователь меняет ширину окна или центр. Мне нужно перерисовать все заданные изображения с новыми параметрами. Я решил вместо этого воспроизвести только изображение раздела напрямую. – dremerDT

2

Я думаю, что ваша линия

вар вал = (INT) (((color.R - (центр - 0,5))/(ширина - 1) + 0,5) * 255);

не совсем корректно. Я думаю, вы хотите

var val = (int) (((цвет.R - wyMin)/(ширина - 1) + 0,5) * 255);

Вы tryng создать кусочно-линейное преобразование, которая отображает х значения меньше, чем wyMin до 0, значения больше, что Wmax до 255 и промежуточных значений х до промежуточных значений между 0 и 255.

+0

При использовании вашей формулы иногда результирующее значение больше 255. И если это значение заменить на 255, к сожалению, это не ожидаемый результат. Я думаю @cneller права. Растровое изображение требует разных значений, чтобы результат был подобен исходным данным. – dremerDT

+0

К сожалению, у вашей формулы была еще одна ошибка.Должно быть var val = (int) (((color.R - wyMin)/(ширина - 1)) * 255); –

+0

Но да, если диапазон значений пикселей изменился с исходного файла DICOM на ваш растровый формат ввода, тогда центр окна и ширина будут также изменены, прежде чем их можно будет применить к растровому изображению. –