日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

發(fā)布時間:2023/12/10 C# 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:https://www.cnblogs.com/Uncle-Joker/p/13686618.html

?

1.定位線概念:某個方位的影像在另一個方向的影像上的投影相交線,例如橫斷面(從頭到腳的方向)在矢狀面(從左手到右手)上的影像投影面交線。

舉個例子:右邊的是MR(核磁共振)的某一幀切片,這是從頭開始掃描,掃描到眼睛這個位置,

而左邊圖像是從左手到右手的掃描切片,那么右邊圖像的位置就恰好在左邊圖像的眼睛的位置,用紅線標(biāo)出的位置則為定位線,一般用于醫(yī)生參考病灶在矢狀面、冠狀面和橫斷面的具體方位。

?

2.檢查設(shè)備示意圖

在笛卡爾空間直角坐標(biāo)系中,Y 右肩膀到左肩膀,X 后背到前胸,Z 足到頭

?

?

?

3.算法流程

?

?

?4.代碼實(shí)現(xiàn):

創(chuàng)建圖像結(jié)構(gòu)

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:圖片UIDImagePositionPatient:病人方向ImageOrientationPatient:圖片方向PixelSpacing:像素間距Columns:寬度Rows:高度}

判斷是否符合定位條件:

     /// <summary>/// 判斷是否可以畫定位線/// </summary>/// <param name="sourceFrame">源圖像結(jié)構(gòu)</param>/// <param name="destinationFrame">目標(biāo)圖像結(jié)構(gòu)</param>/// <returns></returns>public static bool CanDrawLocalizer(FrameGeometry sourceFrame, FrameGeometry destinationFrame){// 檢查圖像結(jié)構(gòu)if (sourceFrame == null) return false;if (destinationFrame == null) return false;// 如果兩個幀中的任何一個不是空間坐標(biāo)系,則無法定位if (sourceFrame.Orientation == FrameOrientation.None || destinationFrame.Orientation == FrameOrientation.None) return false;// 只有正交圖像才能繪制,方向相同則退出if (sourceFrame.Orientation == destinationFrame.Orientation) return false;// 檢查FrameOfReferenceUidif (string.IsNullOrEmpty(sourceFrame.FrameOfReferenceUid) || string.IsNullOrEmpty(destinationFrame.FrameOfReferenceUid)) return false;if (sourceFrame.FrameOfReferenceUid != destinationFrame.FrameOfReferenceUid) return false;return true;}

計算交線點(diǎn):

    /// <summary>///回兩個圖像相交處公共像素線/// </summary>/// <param name="sourceFrame">源圖像結(jié)構(gòu)</param>/// <param name="destinationFrame">目標(biāo)圖像結(jié)構(gòu)</param>/// <param name="startPoint">起點(diǎn)輸出</param>/// <param name="endPoint">重點(diǎn)輸出</param>/// <returns></returns>public static bool CalcualteIntersectionLocalizer(FrameGeometry sourceFrame, FrameGeometry destinationFrame, out Point2 startPoint, out Point2 endPoint){double t; // 平面方程系數(shù)double nA, nB, nC, nD, nP;var lstProj = new List<Point3D>();// 初始化startPoint = Point2.Origin;endPoint = Point2.Origin;// 驗(yàn)證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;// ABif (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));}// BCif (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));}// CDif (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));}// DAif (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;// 從空間坐標(biāo)系返回平面坐標(biāo)系startPoint = destinationFrame.TransformPatientPointToImage(lstProj[0]);endPoint = destinationFrame.TransformPatientPointToImage(lstProj[1]);return true;}

得到坐標(biāo)之后就可以利用繪圖操作類(參考本系列教程之圖形標(biāo)記)來自己繪制定位線。

看效果:

?

?

對于較復(fù)雜的身體部位,也可以同時繪制定位線范圍,來確定當(dāng)前序列的定位范圍,思路是先計算第一幀和最后一幀,用黃色虛線標(biāo)出,再計算當(dāng)前幀。

看效果:

?

C#開發(fā)PACS、RIS、3D醫(yī)學(xué)影像處理系統(tǒng)系列教程 目錄整理:

菜鳥入門篇

PACS客戶端:

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(一):開發(fā)背景和功能預(yù)覽

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(二):界面布局之菜單欄

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(三):界面布局之工具欄

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(四):界面布局之狀態(tài)欄

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(五):查詢病人信息列表

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(六):加載Dicom影像

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(七):讀取影像Dicom信息

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(八):單元格變換

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(九):序列控件與拖拽

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十):Dicom影像下載策略與算法

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十一):Dicom影像掛片協(xié)議

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十二):繪圖處理之圖形標(biāo)記

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十三):繪圖處理之病灶測量

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十四):處理Dicom影像窗寬窗位

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十五):Dicom影像交叉定位線算法

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十六):2D處理之影像平移和縮放

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十七):2D處理之影像旋轉(zhuǎn)和翻轉(zhuǎn)

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十八):Dicom使用LUT色彩增強(qiáng)和反色

C#開發(fā)PACS醫(yī)學(xué)影像處理系統(tǒng)(十九):Dicom影像放大鏡

?

總結(jié)

以上是生活随笔為你收集整理的【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。