1.定位線概念:某個方位的影像在另外一個方向的影像上的投影相交線,例如橫斷面(從頭到腳的方向)在矢狀面(從左手到右手)上的影像投影面交線。html
舉個例子:右邊的是MR(核磁共振)的某一幀切片,這是從頭開始掃描,掃描到眼睛這個位置,算法
而左邊圖像是從左手到右手的掃描切片,那麼右邊圖像的位置就剛好在左邊圖像的眼睛的位置,用紅線標出的位置則爲定位線,通常用於醫生參考病竈在矢狀面、冠狀面和橫斷面的具體方位。微信
2.檢查設備示意圖架構
在笛卡爾空間直角座標系中,Y 右肩膀到左肩膀,X 後背到前胸,Z 足到頭併發
3.算法流程機器學習
4.代碼實現:高併發
建立圖像結構工具
public FrameGeometry(DicomDataset image) : this(image.GetString(DicomTag.FrameOfReferenceUID), image.GetValues<double>(DicomTag.ImagePositionPatient), image.GetValues<double>(DicomTag.ImageOrientationPatient), image.GetValues<double>(DicomTag.PixelSpacing), image.GetSingleValue<int>(DicomTag.Columns), image.GetSingleValue<int>(DicomTag.Rows)) { // TODO:
FrameOfReferenceUID:圖片UID
ImagePositionPatient:病人方向
ImageOrientationPatient:圖片方向
PixelSpacing:像素間距
Columns:寬度
Rows:高度
}
判斷是否符合定位條件:佈局
/// <summary>/// 判斷是否能夠畫定位線 /// </summary> /// <param name="sourceFrame">源圖像結構</param> /// <param name="destinationFrame">目標圖像結構</param> /// <returns></returns> public static bool CanDrawLocalizer(FrameGeometry sourceFrame, FrameGeometry destinationFrame) { // 檢查圖像結構 if (sourceFrame == null) return false; if (destinationFrame == null) return false; // 若是兩個幀中的任何一個不是空間座標系,則沒法定位 if (sourceFrame.Orientation == FrameOrientation.None || destinationFrame.Orientation == FrameOrientation.None) return false; // 只有正交圖像才能繪製,方向相同則退出 if (sourceFrame.Orientation == destinationFrame.Orientation) return false; // 檢查FrameOfReferenceUid if (string.IsNullOrEmpty(sourceFrame.FrameOfReferenceUid) || string.IsNullOrEmpty(destinationFrame.FrameOfReferenceUid)) return false; if (sourceFrame.FrameOfReferenceUid != destinationFrame.FrameOfReferenceUid) return false; return true; }
計算交線點:學習
/// <summary> ///回兩個圖像相交處公共像素線 /// </summary> /// <param name="sourceFrame">源圖像結構</param>
/// <param name="destinationFrame">目標圖像結構</param>
/// <param name="startPoint">起點輸出</param> /// <param name="endPoint">重點輸出</param> /// <returns></returns> public static bool CalcualteIntersectionLocalizer(FrameGeometry sourceFrame, FrameGeometry destinationFrame, out Point2 startPoint, out Point2 endPoint) { double t; // 平面方程係數 double nA, nB, nC, nD, nP; var lstProj = new List<Point3D>(); // 初始化 startPoint = Point2.Origin; endPoint = Point2.Origin; // 驗證 if (destinationFrame.DirectionNormal.IsZero) return false; nP = destinationFrame.DirectionNormal * destinationFrame.PointTopLeft; nA = destinationFrame.DirectionNormal * sourceFrame.PointTopLeft; nB = destinationFrame.DirectionNormal * sourceFrame.PointTopRight; nC = destinationFrame.DirectionNormal * sourceFrame.PointBottomRight; nD = destinationFrame.DirectionNormal * sourceFrame.PointBottomLeft; // AB if (Math.Abs(nB - nA) > Constants.Epsilon) { t = (nP - nA) / (nB - nA); if (t > 0 && t <= 1) lstProj.Add(sourceFrame.PointTopLeft + t * (sourceFrame.PointTopRight - sourceFrame.PointTopLeft)); } // BC if (Math.Abs(nC - nB) > Constants.Epsilon) { t = (nP - nB) / (nC - nB); if (t > 0 && t <= 1) lstProj.Add(sourceFrame.PointTopRight + t * (sourceFrame.PointBottomRight - sourceFrame.PointTopRight)); } // CD if (Math.Abs(nD - nC) > Constants.Epsilon) { t = (nP - nC) / (nD - nC); if (t > 0 && t <= 1) lstProj.Add(sourceFrame.PointBottomRight + t * (sourceFrame.PointBottomLeft - sourceFrame.PointBottomRight)); } // DA if (Math.Abs(nA - nD) > Constants.Epsilon) { t = (nP - nD) / (nA - nD); if (t > 0 && t <= 1) lstProj.Add(sourceFrame.PointBottomLeft + t * (sourceFrame.PointTopLeft - sourceFrame.PointBottomLeft)); } if (lstProj.Count != 2) return false; // 從空間座標系返回平面座標系 startPoint = destinationFrame.TransformPatientPointToImage(lstProj[0]); endPoint = destinationFrame.TransformPatientPointToImage(lstProj[1]); return true; }
獲得座標以後就能夠利用繪圖操做類(參考本系列教程之圖形標記)來本身繪製定位線。
看效果:
對於較複雜的身體部位,也能夠同時繪製定位線範圍,來肯定當前序列的定位範圍,思路是先計算第一幀和最後一幀,用黃色虛線標出,再計算當前幀。
看效果:
C#開發PACS、RIS、3D醫學影像處理系統系列教程目錄整理:
菜鳥入門篇:
PACS客戶端:
C#開發PACS醫學影像處理系統(七):讀取影像Dicom信息
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交流。 |