C#開發PACS醫學影像處理系統(十四):處理Dicom影像窗寬窗位
概念解釋(網路資料):
窗寬:
窗寬指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.自定義調窗
可以使用鍵值對或其他資料格式來儲存和載入自定義窗寬窗位,常用參考值如下:
1、胸部CT檢查時,肺窗縱膈窗窗寬、窗位分別是:
(1)肺窗WW1500—2000HU 、WL-450—-600HU
(2)縱膈窗WW250—350HU、WL30—50HU
2、骨窗、軟組織窗窗寬、窗位
(1)骨窗WW1000—1500HU、WL250—350HU
(2)軟組織窗WW300—500HU、WL40—60HU
3、窗寬和窗位設定
不同部位使用不同窗寬窗位,能較充分反映解剖內容和病灶影像表現,
頭顱:腦組織窗寬設定為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醫學影像處理系統
目錄整理:
(一)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醫學影像處理系統(十五):基於體點陣圖交叉定位線演算法
C#開發PACS醫學影像處理系統(十六):2D處理之平移和縮放
C#開發PACS醫學影像處理系統(十七):2D處理之任意角度旋轉與映象翻轉
C#開發PACS醫學影像處理系統(十八):Dicom影像色彩增強(偽彩)
C#開發PACS醫學影像處理系統(十九):Dicom影像反色處理(負片)
C#開發PACS醫學影像處理系統(二十):Dicom影像放大鏡功能
(二)PACS三維:MRP、MIP、VR
C#開發PACS醫學影像三維重建(一):使用VTK三維重建Dicom影像
(三)PACS網頁端:開發Web版本的PACS
C#開發Web端PACS(一):基於PACS客戶端思想重寫Web端
(四)PACS移動端:開發基於HTML5移動端版本的PACS
C#開發移動端PACS(一):使用HTML5和CSS3開發PACS手機端頁面
C#開發移動端PACS(二):使用 .Net MVC 開發手機端PACS服務端
(五)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交流。 |