Window width window level 窗宽窗位

来源:互联网 发布:开淘宝店需要什么 编辑:程序博客网 时间:2024/06/13 21:59

网上的资料整理的:

 

CT(computed tomographyt:电脑断层扫描)

观察的CT 值范围,人们称之为窗宽 ;观察的中心CT值即为窗位或窗中心

原则上说窗位应该等于或接近需要观察的CT 值;窗宽应能反映该组织或病变的CT 值变化范围。

 

MRI:磁共振成像

非线性转换  : 常用算法有 log 和 gamma 两种。gamma 比较好调 gamma 值,因此用得比较多

 

procedure WinWL(iWinWidth:integer;    iWinLevel:integer; 

               imgwidth  :integer;    imgheight:integer; 

               lpSrImage: pointer;

               lpDsImage: pointer);

var

    iRange, i, lSz  :integer;

    iWidth      :integer;

    iScaleShl10 :integer;

    min16,   max16    :integer;

 

begin

    if lpSrImage=nil then

    begin

        exit;

    end;

 

    iWidth := abs(trunc(iWinWidth/2));

 

    min16 := iWinLevel - iWidth;   //  以窗位为中心,

    max16 := iWinLevel + iWidth;   //  上下各一半窗宽

 

    lSz := (imgwidth*imgheight);

    lSz := lSz - 1;

 

    iRange := (max16-min16);    //  iRange 即 iWinWidth窗宽

 

    if (iRange = 0) or (trunc((1024/iRange) * 255) = 0) then 

    begin

        if iWinWidth > 1024 then

        begin

            for i := 0 to lSz do

                pbyte(integer(lpDsImage)+i)^ := 128;

 

        end

        else

        begin

            for i := 0 to lSz do

                if pword(integer(lpSrImage)+i*2)^ < iWinLevel then

                    pbyte(integer(lpDsImage)+i)^ := 0

                else

                    pbyte(integer(lpDsImage)+i)^ := 255;

         end;

    end

    else

    begin

        iScaleShl10 := trunc((1024/iRange) * 255);      //value = range,Scale = 255/range

        begin                                           //if lSz -> use look up table for large images

        for i := 0 to lSz do

        begin

            if pword(integer(lpSrImage)+i*2)^ < min16 then

                pbyte(integer(lpDsImage)+i)^ := 0

            else if pword(integer(lpSrImage)+i*2)^ > max16 then

                     pbyte(integer(lpDsImage)+i)^ := 255

                 else

                     pbyte(integer(lpDsImage)+i)^ := (((pword(integer(lpSrImage)+i*2)^)-min16) * iScaleShl10)  shr 10;

        end;

        end;

   end;

 

end;

 

 

--------

--------  窗宽窗位 介绍  ----------

--------

 

医学影像“调窗”(window-leveling)的算法 

图像显示和打印面临的一个问题是:图像的亮度和对比度能否充分突出关键部分。这里所指的“关键部分”在 CT 里的例子有软组织、骨头、脑组织、肺、腹部等等。

 

技术问题: 

    显示器往往只有 8-bit, 而数据有 12- 至 16-bits。

    如果将数据的 min 和 max 间 (dynamic range) 的之间转换到 8-bit 0-255 去,过程是个有损转换, 而且出来的图像往往突出的是些噪音。

 

针对这些问题,研究人员先提出一些要求 (requirements),然后根据这些要求提出了一些算法。这些算法现在都很成熟。

 

要求一:充分利用 0-255 间的显示有效值域

要求二:尽量减少值域压缩带来的损失

要求三:不能损失应该突出的组织部分

 

算法分析:

A.  16-bit 到 8-bit 直接转换: 

 

  computeMinMax(pixel_val, min, max); // 先算图像的最大和最小值

  for (i = 0; i < nNumPixels; i++)

    disp_pixel_val = (pixel_val - min)*255.0/(double)(max - min);

 

这个算法必须有,对不少种类的图像是很有效的:如 8-bit 图像,MRI, ECT, CR 等等。

 

B. Window-leveling 算法: W/L 是专门为 CT 设计的。原理很简单:CT 图像里不同组织的密度 (用 Hounsfield 单位) 是在固定的值域, 与具体设备和成像软件没有关系。因此,要看头颅时, 我们只需将头颅的值域转换到 0-255 就行了。

 

CT W/L 不讲头颅值域的 min 和 max, 而说 max - min (即 window_width) 和 (max+min)/2 (即 window_center)。

 

我们还可以用原来的公式,只是 min 和 max 的算法不一样。

 

  // 先算图像的最大和最小值

  min = (2*window_center - window_width)/2.0 + 0.5;

  max = (2*window_center + window_width)/2.0 + 0.5;

  for (i = 0; i < nNumPixels; i++)

    disp_pixel_val = (pixel_val - min)*255.0/(double)(max - min);

 

请注意,CT 图像必须先转换成 Hounsfield 值再做 window-level。 这个转换包括将多余高位 bits 变成 0 (clipping), 和用 recale slope 和 rescale intercept 来做单位转换。

 

HU = pixel_val*rescale_slope + rescale_intercept

 

C.非线性转换

 

我刚刚说的是将 min 和 max 间的数值线性转换到 0-255 之间。 如果 max - min 出来是个很大的数值,比如说 25500, 那就说每 100 原始密度会压缩成一个显示灰度。 这样的损失可能会很大。

 

因为人眼对灰度地反应式是非线性的,非线性转换可以解决一些问题。 常用算法有 log 和 gamma 两种。gamma 比较好调 gamma 值,因此用得比较多。

 

for (i = 0; i < nNumPixels; i++)

    disp_pixel_val = 255.0 * pow(pixel_value/(max-min), 1.0/gamma);

 

D. 有效值域:CT 的 Window-level 有标准的定义,请参看 “Practical CT Techniques", by Wladyslaw Gedroyc and Sheila Rankin, Springer-Verlag。最常用到的有 WW = 400, WL = 40 (实用许多部位); WW = 100, WL = 36 (头);WW = 3200, WL = 200 (骨头),等等。

 

补充几点:

 

o  在做任何转换时要注意有效灰度域外的数值的处理。 

  最好先用 int 而非 unsigned char 来算,再转入矩阵,以避免 overflow 和 underflow。

 

  double dFactor = 255.0/(double)(max - min);

  int nPixelVal;

 

  for (i = 0; i < nNumPixels; i++)

  {

 

    nPixelVal = (int) ((pixel_val - min)*dFactor);

 

    if (nPixelVal < 0)    

      disp_pixel_val = 0;

    else if (nPixelVal > 255)

      disp_pixel_val = 255;

    else

      disp_pixel_val = nPixelVal;

 

  } 

 

 

o  做 window-level 时要注意 min 和 max 之外原始数据的处理

 

  double dFactor, min, max;

  int nPixelVal;

 

  min = (2*window_center - window_width)/2.0 + 0.5;

  max = (2*window_center + window_width)/2.0 + 0.5;

  dFactor = 255.0/(double)(max - min);

 

  for (i = 0; i < nNumPixels; i++)

  {

    if (pixel_val < min)

    {

      disp_pixel_val = 0;

      continue;

    }

 

    if (pixel_val > max)

    {

      disp_pixel_val = 255;

      continue;

    }

 

    nPixelVal = (int)((pixel_val - min)*dFactor);

 

    if (nPixelVal < 0)    

      disp_pixel_val = 0;

    else if (nPixelVal > 255)

      disp_pixel_val = 255;

    else

      disp_pixel_val = nPixelVal;

 

  }

 

以下内容转自“CT诊断学”一书,希望能帮助大家更清楚地认识窗宽窗位。

 

窗宽与窗位

        CT能识别人体内2000个不同灰阶的密度差别。而人的眼睛却只能分辨16 个灰阶度。因此,人眼在CT图像上能分辨的CT值应为125 Hu ( 2000 / 16 )。换句话说,人体内不同组织CT 值只有相差125Hu 以上,才能为人眼所识别。人体软组织CT值多变化在20 - 50 Hu之间,人眼就无法识别。为此,必须进行分段观察,才能使CT 的优点反映出来。观察的CT 值范围,人们称之为窗宽 ;观察的中心CT值即为窗位或窗中心。

      (一)窗宽指CT图像所显示的CT 值范围。在此CT值范围内的组织结构按其密度高低从白到黑分为16 个灰阶以供观察对比。例如,窗宽选定为100 Hu ,则人眼可分辨的CT值为100 / 16 =6 . 25 Hu ,即2 种组织CT值相差在6 . 25Hu以上者即可为人眼所识别。因此,窗宽的宽窄直接影响图像的清晰度与对比度。如果使用窄的窗宽,则显示的CT 值范围小,每一灰阶代表的CT 值幅度小,对比度强,适于观察密度接近的组织结构(如脑组织)。反之,如果使用宽的窗宽,则显示的CT值范围大,每一灰阶代表的CT 值幅度大,则图像对比度差,但密度均匀,适于观察密度差别大的结构(如骨与软组织)。

      (二)窗位(窗中心)指窗宽范围内均值或中心值。比如一幅CT图像,窗宽为100Hu,窗位选在0Hu;则以窗位为中心(0Hu),向上包括+50Hu,向下包括-50Hu,凡是在这个100Hu 范围内的组织均可显示出来并为人眼所识别。凡是大于+50Hu 的组织均为白色;凡是小子-50Hu 的组织均为黑色,其密度差异无法显示。人眼只能识别土50Hu 范围内的CT 值,每一个灰阶的CT 值范围是100 / 16=6 . 25 Hu 。

        原则上说窗位应该等于或接近需要观察的CT 值;窗宽应能反映该组织或病变的CT 值变化范围。

网上的资料整理的:

 

CT(computed tomographyt:电脑断层扫描)

观察的CT 值范围,人们称之为窗宽 ;观察的中心CT值即为窗位或窗中心

原则上说窗位应该等于或接近需要观察的CT 值;窗宽应能反映该组织或病变的CT 值变化范围。

 

MRI:磁共振成像

非线性转换  : 常用算法有 log 和 gamma 两种。gamma 比较好调 gamma 值,因此用得比较多

 

procedure WinWL(iWinWidth:integer;    iWinLevel:integer; 

               imgwidth  :integer;    imgheight:integer; 

               lpSrImage: pointer;

               lpDsImage: pointer);

var

    iRange, i, lSz  :integer;

    iWidth      :integer;

    iScaleShl10 :integer;

    min16,   max16    :integer;

 

begin

    if lpSrImage=nil then

    begin

        exit;

    end;

 

    iWidth := abs(trunc(iWinWidth/2));

 

    min16 := iWinLevel - iWidth;   //  以窗位为中心,

    max16 := iWinLevel + iWidth;   //  上下各一半窗宽

 

    lSz := (imgwidth*imgheight);

    lSz := lSz - 1;

 

    iRange := (max16-min16);    //  iRange 即 iWinWidth窗宽

 

    if (iRange = 0) or (trunc((1024/iRange) * 255) = 0) then 

    begin

        if iWinWidth > 1024 then

        begin

            for i := 0 to lSz do

                pbyte(integer(lpDsImage)+i)^ := 128;

 

        end

        else

        begin

            for i := 0 to lSz do

                if pword(integer(lpSrImage)+i*2)^ < iWinLevel then

                    pbyte(integer(lpDsImage)+i)^ := 0

                else

                    pbyte(integer(lpDsImage)+i)^ := 255;

         end;

    end

    else

    begin

        iScaleShl10 := trunc((1024/iRange) * 255);      //value = range,Scale = 255/range

        begin                                           //if lSz -> use look up table for large images

        for i := 0 to lSz do

        begin

            if pword(integer(lpSrImage)+i*2)^ < min16 then

                pbyte(integer(lpDsImage)+i)^ := 0

            else if pword(integer(lpSrImage)+i*2)^ > max16 then

                     pbyte(integer(lpDsImage)+i)^ := 255

                 else

                     pbyte(integer(lpDsImage)+i)^ := (((pword(integer(lpSrImage)+i*2)^)-min16) * iScaleShl10)  shr 10;

        end;

        end;

   end;

 

end;

 

 

--------

--------  窗宽窗位 介绍  ----------

--------

 

医学影像“调窗”(window-leveling)的算法 

图像显示和打印面临的一个问题是:图像的亮度和对比度能否充分突出关键部分。这里所指的“关键部分”在 CT 里的例子有软组织、骨头、脑组织、肺、腹部等等。

 

技术问题: 

    显示器往往只有 8-bit, 而数据有 12- 至 16-bits。

    如果将数据的 min 和 max 间 (dynamic range) 的之间转换到 8-bit 0-255 去,过程是个有损转换, 而且出来的图像往往突出的是些噪音。

 

针对这些问题,研究人员先提出一些要求 (requirements),然后根据这些要求提出了一些算法。这些算法现在都很成熟。

 

要求一:充分利用 0-255 间的显示有效值域

要求二:尽量减少值域压缩带来的损失

要求三:不能损失应该突出的组织部分

 

算法分析:

A.  16-bit 到 8-bit 直接转换: 

 

  computeMinMax(pixel_val, min, max); // 先算图像的最大和最小值

  for (i = 0; i < nNumPixels; i++)

    disp_pixel_val = (pixel_val - min)*255.0/(double)(max - min);

 

这个算法必须有,对不少种类的图像是很有效的:如 8-bit 图像,MRI, ECT, CR 等等。

 

B. Window-leveling 算法: W/L 是专门为 CT 设计的。原理很简单:CT 图像里不同组织的密度 (用 Hounsfield 单位) 是在固定的值域, 与具体设备和成像软件没有关系。因此,要看头颅时, 我们只需将头颅的值域转换到 0-255 就行了。

 

CT W/L 不讲头颅值域的 min 和 max, 而说 max - min (即 window_width) 和 (max+min)/2 (即 window_center)。

 

我们还可以用原来的公式,只是 min 和 max 的算法不一样。

 

  // 先算图像的最大和最小值

  min = (2*window_center - window_width)/2.0 + 0.5;

  max = (2*window_center + window_width)/2.0 + 0.5;

  for (i = 0; i < nNumPixels; i++)

    disp_pixel_val = (pixel_val - min)*255.0/(double)(max - min);

 

请注意,CT 图像必须先转换成 Hounsfield 值再做 window-level。 这个转换包括将多余高位 bits 变成 0 (clipping), 和用 recale slope 和 rescale intercept 来做单位转换。

 

HU = pixel_val*rescale_slope + rescale_intercept

 

C.非线性转换

 

我刚刚说的是将 min 和 max 间的数值线性转换到 0-255 之间。 如果 max - min 出来是个很大的数值,比如说 25500, 那就说每 100 原始密度会压缩成一个显示灰度。 这样的损失可能会很大。

 

因为人眼对灰度地反应式是非线性的,非线性转换可以解决一些问题。 常用算法有 log 和 gamma 两种。gamma 比较好调 gamma 值,因此用得比较多。

 

for (i = 0; i < nNumPixels; i++)

    disp_pixel_val = 255.0 * pow(pixel_value/(max-min), 1.0/gamma);

 

D. 有效值域:CT 的 Window-level 有标准的定义,请参看 “Practical CT Techniques", by Wladyslaw Gedroyc and Sheila Rankin, Springer-Verlag。最常用到的有 WW = 400, WL = 40 (实用许多部位); WW = 100, WL = 36 (头);WW = 3200, WL = 200 (骨头),等等。

 

补充几点:

 

o  在做任何转换时要注意有效灰度域外的数值的处理。 

  最好先用 int 而非 unsigned char 来算,再转入矩阵,以避免 overflow 和 underflow。

 

  double dFactor = 255.0/(double)(max - min);

  int nPixelVal;

 

  for (i = 0; i < nNumPixels; i++)

  {

 

    nPixelVal = (int) ((pixel_val - min)*dFactor);

 

    if (nPixelVal < 0)    

      disp_pixel_val = 0;

    else if (nPixelVal > 255)

      disp_pixel_val = 255;

    else

      disp_pixel_val = nPixelVal;

 

  } 

 

 

o  做 window-level 时要注意 min 和 max 之外原始数据的处理

 

  double dFactor, min, max;

  int nPixelVal;

 

  min = (2*window_center - window_width)/2.0 + 0.5;

  max = (2*window_center + window_width)/2.0 + 0.5;

  dFactor = 255.0/(double)(max - min);

 

  for (i = 0; i < nNumPixels; i++)

  {

    if (pixel_val < min)

    {

      disp_pixel_val = 0;

      continue;

    }

 

    if (pixel_val > max)

    {

      disp_pixel_val = 255;

      continue;

    }

 

    nPixelVal = (int)((pixel_val - min)*dFactor);

 

    if (nPixelVal < 0)    

      disp_pixel_val = 0;

    else if (nPixelVal > 255)

      disp_pixel_val = 255;

    else

      disp_pixel_val = nPixelVal;

 

  }

 

以下内容转自“CT诊断学”一书,希望能帮助大家更清楚地认识窗宽窗位。

 

窗宽与窗位

        CT能识别人体内2000个不同灰阶的密度差别。而人的眼睛却只能分辨16 个灰阶度。因此,人眼在CT图像上能分辨的CT值应为125 Hu ( 2000 / 16 )。换句话说,人体内不同组织CT 值只有相差125Hu 以上,才能为人眼所识别。人体软组织CT值多变化在20 - 50 Hu之间,人眼就无法识别。为此,必须进行分段观察,才能使CT 的优点反映出来。观察的CT 值范围,人们称之为窗宽 ;观察的中心CT值即为窗位或窗中心。

      (一)窗宽指CT图像所显示的CT 值范围。在此CT值范围内的组织结构按其密度高低从白到黑分为16 个灰阶以供观察对比。例如,窗宽选定为100 Hu ,则人眼可分辨的CT值为100 / 16 =6 . 25 Hu ,即2 种组织CT值相差在6 . 25Hu以上者即可为人眼所识别。因此,窗宽的宽窄直接影响图像的清晰度与对比度。如果使用窄的窗宽,则显示的CT 值范围小,每一灰阶代表的CT 值幅度小,对比度强,适于观察密度接近的组织结构(如脑组织)。反之,如果使用宽的窗宽,则显示的CT值范围大,每一灰阶代表的CT 值幅度大,则图像对比度差,但密度均匀,适于观察密度差别大的结构(如骨与软组织)。

      (二)窗位(窗中心)指窗宽范围内均值或中心值。比如一幅CT图像,窗宽为100Hu,窗位选在0Hu;则以窗位为中心(0Hu),向上包括+50Hu,向下包括-50Hu,凡是在这个100Hu 范围内的组织均可显示出来并为人眼所识别。凡是大于+50Hu 的组织均为白色;凡是小子-50Hu 的组织均为黑色,其密度差异无法显示。人眼只能识别土50Hu 范围内的CT 值,每一个灰阶的CT 值范围是100 / 16=6 . 25 Hu 。

        原则上说窗位应该等于或接近需要观察的CT 值;窗宽应能反映该组织或病变的CT 值变化范围。

原创粉丝点击