C#開發PACS醫學影像處理系統(十四):處理Dicom影像窗寬窗位

概念解釋(網絡資料)html

窗寬:算法

窗寬指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 。
 
1.調窗
在PACS影像中,經常使用的功能通常是調窗、做用範圍和自定義調窗
根據本系列文章中,在讀取dicom影像時,能夠得到dcm文件的窗寬窗位值:
//實例化文件處理對象並打開文件
DicomFile dicomFile = DicomFile.Open(@"C:\101\1.dcm");
//獲取dicom圖像對象
DicomImage dicomImage = new DicomImage(dicomFile.Dataset);
//獲取窗寬
Console.WriteLine(dicomImage.WindowWidth);
//獲取窗位
Console.WriteLine(dicomImage.WindowCenter);

在鼠標操做上,按住鼠標左右移動是調整窗寬,上下移動是調整窗位,記錄鼠標按下時的位置和拖動座標差,並從新設置影像的窗寬窗位:網絡

     //監聽鼠標按下事件
        private void GridLine_MouseDown(object sender, MouseButtonEventArgs e)
        {try
            {
                SelectedBox(true);
                if (shapeManager.drawAction != DrawAction.None)
                {
                    return;
                }
                //記錄鼠標位置
                isMouseDown = true;
                StartPoint.X = e.GetPosition(GridLine).X;
                StartPoint.Y = e.GetPosition(GridLine).Y;

                if (DicomFile != null)
                {
                    double? tagVal;
                    DicomFile.Dataset.TryGetValue(DicomTag.WindowCenter, 0, out tagVal);

                    if (tagVal != null)
                    {
                        //獲取原始調窗
                        datasetWinC = DicomFile.Dataset.GetValue<double>(DicomTag.WindowCenter, 0);
                        datasetWinW = DicomFile.Dataset.GetValue<double>(DicomTag.WindowWidth, 0);

                        //設置最後一次調窗
                        lastWindowCenter = DicomImage.WindowCenter - datasetWinC;
                        lastWindowWidth = DicomImage.WindowWidth - datasetWinW;
                    }
                    else
                    {
                        lastWindowCenter = DicomImage.WindowCenter;
                        lastWindowWidth = DicomImage.WindowWidth;
                    }
                    mouseDownScaleX = st.ScaleX;
                    mouseDownScaleY = st.ScaleY;

                }
            }
            catch (Exception ex)
            {
                LogApi.WriteErrLog(ex);
            }
        }

看效果:架構

 

2.自定義調窗併發

能夠使用鍵值對或其餘數據格式來保存和加載自定義窗寬窗位,經常使用參考值以下:iview

一、胸部CT檢查時,肺窗縱膈窗窗寬、窗位分別是:機器學習

(1)肺窗WW1500—2000HU 、WL-450—-600HU高併發

(2)縱膈窗WW250—350HU、WL30—50HU工具

二、骨窗、軟組織窗窗寬、窗位

(1)骨窗WW1000—1500HU、WL250—350HU

(2)軟組織窗WW300—500HU、WL40—60HU

三、窗寬和窗位設定

不一樣部位使用不一樣窗寬窗位,能較充分反映解剖內容和病竈影像表現,

頭顱:腦組織窗寬設定爲80 Hu~100 Hu,窗位爲30 Hu~40 Hu,

垂體及蝶鞍區病變窗寬宜設在200 Hu~250 Hu,窗位45 Hu~50 Hu,

腦出血患者可改變窗寬位80 Hu~140 Hu,窗位30 Hu~50 Hu,

腦梗死患者經常使用窄窗60 Hu,能提升病竈的檢出率,清楚顯示梗死及軟化竈,

頜面部眼眶窗寬定爲150 Hu~250 Hu,窗位30 Hu~40 Hu,

觀察骨骼時窗寬150 Hu~2 000 Hu,窗位400 Hu~450 Hu,

喉頸部、鼻咽、咽喉部的窗寬和窗位常設在300 Hu~350 Hu和30 Hu~50 Hu,能知足該部位的解剖和病竈顯示,

胸部:常規胸部CT檢查分別用縱隔窗及肺窗觀察,縱隔窗可觀察心臟、大血管的位置,

縱隔內淋巴結的大小,縱隔內腫塊及這些結構的比鄰關係,設定縱隔窗可用窗寬300 Hu~500 Hu,窗位30 Hu~50 Hu

根據此參考,咱們能夠設定一些默認的自定義調窗:

 

 

3.調窗的用做範圍

根據以前的文章:C#開發PACS醫學影像處理系統(八):單元格變換

看成用範圍是所有時,遍歷全部單元格和容器:

 for (int i = 0; i < Main.Mdiview.Cells.Count; i++)
      for (int j = 0; j < Main.Mdiview.Cells[i].BoxList.Count; j++)

看成用範圍是序列時,只需遍歷當前單元格容器:

 for (int i = 0; i < Cell.BoxList.Count; i++)

看成用範圍是圖像時,直接設置圖像:

//調整窗位
dicomImage.WindowCenter = 100;
//調整窗寬
dicomImage.WindowWidth = 100;

部分代碼:

      /// <summary>
        /// 變換窗寬窗位
        /// </summary>
        /// <param name="X"></param>
        /// <param name="startX"></param>
        /// <param name="Y"></param>
        /// <param name="startY"></param>
        public void WinImage(double X, double startX, double Y, double startY, double myWidth = -999, double myCenter = -999)
        {
            double cVal = Y - startY;
            double wVal = X - startX;

            if (myWidth != -999 && myCenter != -999)
            {
                DicomImage.WindowCenter = myCenter;
                DicomImage.WindowWidth = myWidth;
            }
            else
            {
                DicomImage.WindowCenter = datasetWinC + lastWindowCenter + cVal;
                DicomImage.WindowWidth = datasetWinW + lastWindowWidth + wVal;
            }

            ImageHandler.SetImageScale(DicomImage, PalImgInfo);
            UpDateTag();

            if (Main.WinRange == WindowRange.Series)
            {
                #region -----做用範圍:序列-----

                for (int i = 0; i < Cell.BoxList.Count; i++)
                {
                    if (Cell.BoxList[i] != this)
                    {
                        Cell.BoxList[i].WinImage(DicomImage.WindowWidth, DicomImage.WindowCenter);
                    }
                }

                #endregion
            }
            else if (Main.WinRange == WindowRange.All)
            {
                #region -----做用範圍:全部-----

                for (int i = 0; i < Main.Mdiview.Cells.Count; i++)
                {
                    for (int j = 0; j < Main.Mdiview.Cells[i].BoxList.Count; j++)
                    {
                        if (Main.Mdiview.Cells[i].BoxList[j] != this)
                        {
                            Main.Mdiview.Cells[i].BoxList[j].WinImage(DicomImage.WindowWidth, DicomImage.WindowCenter);
                            Main.Mdiview.Cells[i].MouseWindowCenter = DicomImage.WindowCenter;
                            Main.Mdiview.Cells[i].MouseWindowWidth = DicomImage.WindowWidth;
                        }
                    }
                }
                #endregion
            }
            else
            {
                string key = Cell.studyInfo.CommonSeriesId + "|" + CurrentFrame;
                string value = DicomImage.WindowWidth + "|" + DicomImage.WindowCenter;
                if (PubVal.WinImageList.Keys.Contains(key))
                {
                    PubVal.WinImageList[key] = value;
                }
                else
                {
                    PubVal.WinImageList.Add(key, value);
                }
            }

            Cell.MouseWindowCenter = DicomImage.WindowCenter;
            Cell.MouseWindowWidth = DicomImage.WindowWidth;

        }

 

效果:

 

 

C#開發PACS、RIS、3D醫學影像處理系統系列教程目錄整理:

菜鳥入門篇:

PACS客戶端:

C#開發PACS醫學影像處理系統(一):開發背景和功能預覽

C#開發PACS醫學影像處理系統(二):界面佈局之菜單欄

C#開發PACS醫學影像處理系統(三):界面佈局之工具欄

C#開發PACS醫學影像處理系統(四):界面佈局之狀態欄

C#開發PACS醫學影像處理系統(五):查詢病人信息列表

C#開發PACS醫學影像處理系統(六):加載Dicom影像

C#開發PACS醫學影像處理系統(七):讀取影像Dicom信息

C#開發PACS醫學影像處理系統(八):單元格變換

C#開發PACS醫學影像處理系統(九):序列控件與拖拽

C#開發PACS醫學影像處理系統(十):Dicom影像下載策略與算法

C#開發PACS醫學影像處理系統(十一):Dicom影像掛片協議

C#開發PACS醫學影像處理系統(十二):繪圖處理之圖形標記

C#開發PACS醫學影像處理系統(十三):繪圖處理之病竈測量

C#開發PACS醫學影像處理系統(十四):處理Dicom影像窗寬窗位

C#開發PACS醫學影像處理系統(十五):Dicom影像交叉定位線算法

C#開發PACS醫學影像處理系統(十六):2D處理之影像平移和縮放

C#開發PACS醫學影像處理系統(十七):2D處理之影像旋轉和翻轉

C#開發PACS醫學影像處理系統(十八):Dicom使用LUT色彩加強和反色

C#開發PACS醫學影像處理系統(十九):Dicom影像放大鏡

 

PACS三維處理醫學圖像:

C#開發PACS醫學影像三維重建(一):使用VTK重建3D影像

C#開發PACS醫學影像三維重建(二):使用VTK進行體繪製

C#開發PACS醫學影像三維重建(三):紋理映射與顏色傳輸

C#開發PACS醫學影像三維重建(四):3D網格平滑效果

C#開發PACS醫學影像三維重建(五):基於梯度透明的組織漫遊

C#開發PACS醫學影像三維重建(六):三維光源與陰影效果

C#開發PACS醫學影像三維重建(七):空間測量與標註

C#開發PACS醫學影像三維重建(八):VR體繪製

C#開發PACS醫學影像三維重建(九):MPR三視圖切面重建

C#開發PACS醫學影像三維重建(十):MIP最小密度投影

C#開發PACS醫學影像三維重建(十一):CPR曲面重建

C#開發PACS醫學影像三維重建(十二):VE虛擬內鏡技術

 

熟手進階篇:

醫學圖像算法:

C#處理醫學圖像(一):基於Hessian矩陣的血管肺紋理骨骼加強對比

C#處理醫學圖像(二):圖像銳化加強對比

 

PACS網頁端 開發Web版本的PACS:

C#開發Web端PACS(一):基於PACS客戶端思想重寫Web端

C#開發Web端PACS(二):使用 .Net MVC 開發手機端PACS服務端

C#開發Web端PACS(三):使用HTML5和CSS3開發PACS手機端頁面

C#開發Web端PACS(四):Web端與服務端的DICOM傳輸

C#開發Web端PACS(五):Web端的平移縮放旋轉2D操做

C#開發Web端PACS(六):Web端的窗寬窗位調整

C#開發Web端PACS(七):將移動端接入微信公衆號實現醫院雲膠片

 

登峯造極篇:

C#開發基於Python人工智能的肺結節自動檢測

C#開發基於Python人工智能的脊柱側彎曲率算法

C#開發基於Python機器學習的醫學影像骨骼仿真動畫

C#開發基於Python機器學習的術後恢復模擬

C#開發基於U3D的VR眼鏡設備虛擬人體三維重建

C#開發基於全息投影的裸眼3D醫學影像顯示技術

 

周邊附加篇:

膠片打印:

C#開發醫學影像膠片打印系統(一):功能與膠片排版

C#開發醫學影像膠片打印系統(二):膠片打印機通信

C#開發醫學影像膠片打印系統(三):不規則排版打印

 

PACS服務端:

C#開發PACS醫學影像處理系統服務端(一):醫療設備的鏈接與收圖

C#開發PACS醫學影像處理系統服務端(二):高併發架構

 

PACS與RIS系統的通訊與集成

在RIS系統中調起PACS並打開Dicom影像

 

雲PACS與遠程會診

C#開發PACS醫學影像處理系統之雲PACS(區域PACS)(一):架構概述

C#開發PACS醫學影像處理系統之雲PACS(區域PACS)(二):遠程會診與雙向轉診

 

科幻級視頻特效:

使用Adobe After Effects 製做PACS影像處理系統宣傳視頻

 

QQ:1850969244

近10年開發經驗,主攻C#、ASP MVC,HTML5,

B/S C/S 皆可,目前研究醫療領域醫學影像相關技術,

任何技術問題歡迎加QQ交流。

相關文章
相關標籤/搜索