URMMeasureAlg.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. using System.Runtime.InteropServices;
  2. using Vinno.Infrastructure;
  3. using System;
  4. using Vinno.DataTypes;
  5. using Vinno.DataManager.Utilities;
  6. using System.Collections.Generic;
  7. using Vinno.Enums;
  8. using System.Linq;
  9. using Vinno.Infrastructure.DataTypes;
  10. using WingServerCommon.Log;
  11. using Logger = WingServerCommon.Log.Logger;
  12. namespace WingAIDiagnosisService.URMManage
  13. {
  14. public class URMMeasureAlg
  15. {
  16. [DllImport("ImageProcessAlgWrapLib.dll")]
  17. private static extern IntPtr PIA_CreateURMMeasure();
  18. [DllImport("ImageProcessAlgWrapLib.dll")]
  19. private static extern unsafe DPoint* PIA_CalURMCurvature(IntPtr _handPtr, IntPtr SrcImg, int width, int height, DPoint* Points, int Pointnum, ref double curvature, ref int outPointsNum);
  20. [DllImport("ImageProcessAlgWrapLib.dll")]
  21. private static extern unsafe double PIA_CalURMDen(IntPtr _handPtr, IntPtr SrcImg, int width, int height, URMRoiMeasureParam roiparam);
  22. [DllImport("ImageProcessAlgWrapLib.dll")]
  23. private static extern unsafe double PIA_CalURMFractalDim(IntPtr _handPtr, IntPtr SrcImg, int width, int height, URMRoiMeasureParam roiparam);
  24. [DllImport("ImageProcessAlgWrapLib.dll")]
  25. private static extern unsafe double PIA_CalURMVel(IntPtr _handPtr, IntPtr SrcImg, int width, int height, URMRoiMeasureParam roiparam);
  26. [DllImport("ImageProcessAlgWrapLib.dll")]
  27. private static extern unsafe void PIA_ReleaseURMCurvaturePoints(DPoint* pointsptr);
  28. [DllImport("ImageProcessAlgWrapLib.dll")]
  29. private static extern unsafe bool PIA_CalDenMeasureResults(IntPtr _handPtr, IntPtr SrcImg, int width,
  30. int height, URMRoiMeasureParam roiparam, double piexlScaler, ref URMDenMeasureResult result);
  31. [DllImport("ImageProcessAlgWrapLib.dll")]
  32. private static extern unsafe bool PIA_CalVelMeasureResults(IntPtr _handPtr, IntPtr SrcImg, int width,
  33. int height, URMRoiMeasureParam roiparam, double piexlScaler, ref URMVelMeasureResult result);
  34. [DllImport("ImageProcessAlgWrapLib.dll")]
  35. private static extern unsafe DPoint* PIA_CalVessMeasureResults(IntPtr _handPtr, IntPtr SrcImg, int width,
  36. int height, DPoint* Points, int Pointnum, double piexlScaler, ref URMVessMeasureResult result,
  37. DPoint* OutPoints, int SamplingPoints);
  38. [DllImport("ImageProcessAlgWrapLib.dll")]
  39. private static extern double PIA_CalPerfusion(IntPtr handle, IntPtr DenImg, IntPtr VelImg, int width,
  40. int height, URMRoiMeasureParam roiparam, ref int rectx, ref int recty, ref int rectwidth, ref int rectheight);
  41. [DllImport("ImageProcessAlgWrapLib.dll")]
  42. private static extern unsafe double PIA_GetPerfusionColorImg(IntPtr handle, IntPtr PerfusionImgPtr, IntPtr colormapptr);
  43. [DllImport("ImageProcessAlgWrapLib.dll")]
  44. private static extern unsafe bool PIA_CalHistogarm(IntPtr handle, IntPtr SrcImg, int width, int height,
  45. URMRoiMeasureParam roiparam, DPoint* OutPointsList, int OutPointscount);
  46. [DllImport("ImageProcessAlgWrapLib.dll")]
  47. private static extern unsafe DPoint* PIA_GetShellOuterPoints(IntPtr _handPtr, int width, int height, DPoint* PointsList, int Pointscount, ref int outerPointCount, double shellwidth, double piexlScaler);
  48. [DllImport("ImageProcessAlgWrapLib.dll")]
  49. private static extern void PIA_URMMeasure_Release(IntPtr handPtr);
  50. private IntPtr _handle;
  51. public NativeArray _URMDenMeasureImg;
  52. public NativeArray _URMVelMeasureImg;
  53. public double _denMax, _denMin;
  54. public double _velMax, _velMin;
  55. private URMProcess owner;
  56. public URMMeasureAlg(URMProcess tf)
  57. {
  58. _handle = PIA_CreateURMMeasure();
  59. _URMDenMeasureImg = new NativeArray(0);
  60. _URMVelMeasureImg = new NativeArray(0);
  61. owner = tf;
  62. }
  63. private unsafe void ReleaseSRCurvaturePoints(DPoint* pointsptr)
  64. {
  65. PIA_ReleaseURMCurvaturePoints(pointsptr);
  66. }
  67. public void Relase()
  68. {
  69. try
  70. {
  71. PIA_URMMeasure_Release(_handle);
  72. }
  73. catch (Exception ex)
  74. {
  75. Logger.WriteLineWarn(ex.ToString());
  76. }
  77. try
  78. {
  79. _URMDenMeasureImg.Dispose();
  80. }
  81. catch (Exception ex)
  82. {
  83. Logger.WriteLineWarn(ex.ToString());
  84. }
  85. try
  86. {
  87. _URMVelMeasureImg.Dispose();
  88. }
  89. catch (Exception ex)
  90. {
  91. Logger.WriteLineWarn(ex.ToString());
  92. }
  93. }
  94. public URMMeasureDataOutput CalURMMeasureData(URMMeasureDataInput inputparam, int width, int height, double colorMapMax, double colorMapMin)
  95. {
  96. var result = new URMMeasureDataOutput();
  97. var srcPoint = inputparam.SrcDPoints;
  98. if (srcPoint.Count < 1)
  99. return result;
  100. List<DPoint> piexlPoints = new List<DPoint>();
  101. for (int i = 0; i < srcPoint.Count; i++)
  102. {
  103. piexlPoints.Add(new DPoint(srcPoint[i].X * width, srcPoint[i].Y * height));
  104. }
  105. DPoint[] Points = piexlPoints.ToArray();
  106. owner.CreateURMMeasuerImg(URMType.Den, _URMDenMeasureImg.Start, ref _denMax, ref _denMin);
  107. owner.CreateURMMeasuerImg(URMType.Vel, _URMVelMeasureImg.Start, ref _velMax, ref _velMin);
  108. double resultData = 0;
  109. double velScaler = (_velMax - _velMin) / 255;
  110. double denScaler = _denMax / 255.0;
  111. double piexlScaler = inputparam.phywidth / width;
  112. URMRoiMeasureParam roiparam = new URMRoiMeasureParam();
  113. unsafe
  114. {
  115. fixed (DPoint* pointsptr = Points)
  116. {
  117. roiparam.PointsList = pointsptr;
  118. roiparam.Pointscount = Points.Length;
  119. roiparam.RoiType = inputparam.RoiType;
  120. if (roiparam.RoiType == URMROIType.URMShell)
  121. {
  122. int outershellpointcount = 0;
  123. var outpointptr = PIA_GetShellOuterPoints(_handle, width, height, roiparam.PointsList,
  124. roiparam.Pointscount, ref outershellpointcount, inputparam.ShellWidth, piexlScaler);
  125. for (int i = 0; i < outershellpointcount; i++)
  126. {
  127. result.OuterExterPoints.Add(new DPoint(outpointptr[i].X, outpointptr[i].Y));//归一化的值
  128. }
  129. }
  130. switch (inputparam.urmMeasureType)
  131. {
  132. case URMMeasureType.URMFracetalDim:
  133. resultData = PIA_CalURMFractalDim(_handle, _URMDenMeasureImg.Start, width, height, roiparam);
  134. result.ResultData = resultData;
  135. break;
  136. case URMMeasureType.URMVel:
  137. resultData = PIA_CalURMVel(_handle, _URMVelMeasureImg.Start, width, height, roiparam);
  138. result.ResultData = resultData * velScaler + _velMin;
  139. break;
  140. case URMMeasureType.URMDen:
  141. resultData = PIA_CalURMDen(_handle, _URMDenMeasureImg.Start, width, height, roiparam);
  142. result.ResultData = resultData;
  143. break;
  144. case URMMeasureType.URMCurvature:
  145. double curvature = 0;
  146. int outpointcount = 0;
  147. var outpointptr = PIA_CalURMCurvature(_handle, _URMDenMeasureImg.Start, width, height, pointsptr, Points.Length,
  148. ref curvature, ref outpointcount);
  149. for (int i = 0; i < outpointcount; i++)
  150. {
  151. result.ResultDPoints.Add(new DPoint(outpointptr[i].X / width, outpointptr[i].Y / height));
  152. }
  153. ReleaseSRCurvaturePoints(outpointptr);
  154. result.ResultData = curvature;
  155. break;
  156. case URMMeasureType.URMTraceCurvature:
  157. //弯曲度等于直线距离÷曲线距离
  158. //直线距离就是起点跟终点的距离
  159. //曲线距离就是每两个的距离和 比如有4个点 直线距离就是1点跟4点的距离 弯曲距离就是1和2的距离+2和3的距离 + 3和4的距离
  160. double traceCurvature = 0;
  161. double Skelength = 0; //所有点的距离和
  162. for (int i = 0; i < Points.Length; i++)
  163. {
  164. if (i > 0)
  165. {
  166. Skelength += Math.Sqrt(Math.Pow((Points[i].X - Points[i - 1].X), 2) +
  167. Math.Pow(Points[i].Y - Points[i - 1].Y, 2));
  168. }
  169. }
  170. double linelength = Math.Sqrt(Math.Pow((Points[0].X - Points.Last().X), 2) +
  171. Math.Pow(Points[0].Y - Points.Last().Y, 2)); //起点和终点的距离
  172. Logger.WriteLineInfo("URMCurvature Start Trace" + Points[0].X + " " + Points[0].Y);
  173. Logger.WriteLineInfo("URMCurvature End Trace" + Points.Last().X + " " + Points.Last().Y);
  174. Logger.WriteLineInfo("URMCurvature linelength Trace" + linelength);
  175. Logger.WriteLineInfo("URMCurvature Skelength Trace" + Skelength);
  176. traceCurvature = Math.Abs(Skelength / linelength);
  177. if (traceCurvature < 1.0)
  178. traceCurvature = 1.0;
  179. result.ResultData = traceCurvature;
  180. break;
  181. case URMMeasureType.URMDenMeasure:
  182. var denmesureresult = new URMDenMeasureResult();
  183. PIA_CalDenMeasureResults(_handle, _URMDenMeasureImg.Start, width, height, roiparam, piexlScaler, ref denmesureresult);
  184. denmesureresult.MaxDensity *= denScaler;
  185. denmesureresult.MinDensity *= denScaler;
  186. denmesureresult.MeanDensity *= denScaler;
  187. denmesureresult.VarianceDensity *= (denScaler * denScaler);
  188. if (roiparam.RoiType == URMROIType.URMShell)
  189. {
  190. denmesureresult.InMaxDensity *= denScaler;
  191. denmesureresult.InMinDensity *= denScaler;
  192. denmesureresult.InMeanDensity *= denScaler;
  193. denmesureresult.InVarianceDensity *= (denScaler * denScaler);
  194. denmesureresult.OutMaxDensity *= denScaler;
  195. denmesureresult.OutMinDensity *= denScaler;
  196. denmesureresult.OutMeanDensity *= denScaler;
  197. denmesureresult.OutVarianceDensity *= (denScaler * denScaler);
  198. }
  199. result.DenMeasureResult = denmesureresult;
  200. break;
  201. case URMMeasureType.URMVelMeasure:
  202. var velmesureresult = new URMVelMeasureResult();
  203. PIA_CalVelMeasureResults(_handle, _URMVelMeasureImg.Start, width, height, roiparam, piexlScaler, ref velmesureresult);
  204. velmesureresult.MaxVel = (velmesureresult.MaxVel * velScaler + _velMin);
  205. velmesureresult.MinVel = (velmesureresult.MinVel * velScaler + _velMin); ;
  206. velmesureresult.MeanVel = (velmesureresult.MeanVel * velScaler + _velMin);
  207. velmesureresult.VarianceVel *= (velScaler * velScaler);
  208. if (roiparam.RoiType == URMROIType.URMShell)
  209. {
  210. velmesureresult.InMaxVel = (velmesureresult.InMaxVel * velScaler + _velMin);
  211. velmesureresult.InMinVel = (velmesureresult.InMinVel * velScaler + _velMin);
  212. velmesureresult.InMeanVel = (velmesureresult.InMeanVel * velScaler + _velMin);
  213. velmesureresult.InVarianceVel *= (velScaler * velScaler);
  214. velmesureresult.OutMaxVel = (velmesureresult.OutMaxVel * velScaler + _velMin);
  215. velmesureresult.OutMinVel = (velmesureresult.OutMinVel * velScaler + _velMin);
  216. velmesureresult.OutMeanVel = (velmesureresult.OutMeanVel * velScaler + _velMin);
  217. velmesureresult.OutVarianceVel *= (velScaler * velScaler);
  218. }
  219. result.VelMeasureResult = velmesureresult;
  220. break;
  221. case URMMeasureType.URMVesselMeasure:
  222. var vessmesureresult = new URMVessMeasureResult();
  223. DPoint[] outPoints = new DPoint[inputparam.SamplingPoints];
  224. fixed (DPoint* vessPointptr = outPoints)
  225. {
  226. var outlocpointptr = PIA_CalVessMeasureResults(_handle, _URMDenMeasureImg.Start, width, height, pointsptr, Points.Length,
  227. piexlScaler, ref vessmesureresult, vessPointptr, inputparam.SamplingPoints);
  228. for (int i = 0; i < vessmesureresult.vesselCount; i++)
  229. {
  230. result.OuterExterPoints.Add(new DPoint(outlocpointptr[i].X, outlocpointptr[i].Y));//归一化的值
  231. }
  232. ReleaseSRCurvaturePoints(outlocpointptr);
  233. }
  234. var vessoutdpoints = new List<DPoint>(outPoints);
  235. result.ResultDPoints = vessoutdpoints;
  236. result.VessMeasureResult = vessmesureresult;
  237. break;
  238. case URMMeasureType.URMLocationVel:
  239. var curpoint = inputparam.SrcDPoints[0];
  240. var col = (int)curpoint.X;
  241. var row = (int)curpoint.Y;
  242. if (col >= 0 && col < width && row >= 0 && row < height)
  243. {
  244. var curptr = _URMVelMeasureImg.Start + (row * width + col);
  245. byte[] curvel = new byte[1];
  246. Marshal.Copy(curptr, curvel, 0, 1);
  247. if (curvel[0] == 0)
  248. result.ResultData = 0;
  249. else
  250. {
  251. result.ResultData = (double)curvel[0] * velScaler + _velMin;
  252. }
  253. }
  254. break;
  255. case URMMeasureType.URMPerfusion:
  256. var perfusioncolormap = owner.GetURMColorMap("SRColorMap:PerfusionMap");
  257. int rectx = 0, recty = 0, rectwidth = 0, rectheight = 0;
  258. var perfusion = PIA_CalPerfusion(_handle, _URMDenMeasureImg.Start, _URMVelMeasureImg.Start,
  259. width, height, roiparam, ref rectx, ref recty, ref rectwidth, ref rectheight);
  260. if (rectwidth == 0 || rectheight == 0)
  261. {
  262. result.ResultFlag = false;
  263. return result;
  264. }
  265. result.PerfusionPiexlRect = new IntRect(rectx, recty, rectwidth, rectheight);
  266. result.PerfusionScaleDRect = new DRect((double)rectx / width, (double)recty / height, (double)rectwidth / width, (double)rectheight / height);
  267. result.PerfusionImgData.Resize(rectwidth * rectheight * 4);
  268. PIA_GetPerfusionColorImg(_handle, result.PerfusionImgData.Start, perfusioncolormap.Address);
  269. result.ResultData = perfusion * _velMax;
  270. break;
  271. case URMMeasureType.URMHist:
  272. DPoint[] outHistPoints = new DPoint[inputparam.SamplingPoints];
  273. var MeasureArray = owner._urmType == URMType.Den ? _URMDenMeasureImg : _URMVelMeasureImg;
  274. fixed (DPoint* outHistPointsptr = outHistPoints)
  275. {
  276. PIA_CalHistogarm(_handle, MeasureArray.Start, width, height, roiparam,
  277. outHistPointsptr, inputparam.SamplingPoints);
  278. }
  279. for (int i = 0; i < outHistPoints.Length; i++)
  280. {
  281. outHistPoints[i].X = outHistPoints[i].X / 256 * (Math.Abs(colorMapMax - colorMapMin));
  282. }
  283. var histoutdpoints = new List<DPoint>(outHistPoints);
  284. result.ResultDPoints = histoutdpoints;
  285. break;
  286. case URMMeasureType.URMDenVelMeasure:
  287. var denresult = new URMDenMeasureResult();
  288. PIA_CalDenMeasureResults(_handle, _URMDenMeasureImg.Start, width, height, roiparam, piexlScaler, ref denresult);
  289. denresult.MaxDensity *= denScaler;
  290. denresult.MinDensity *= denScaler;
  291. denresult.MeanDensity *= denScaler;
  292. denresult.VarianceDensity *= (denScaler * denScaler);
  293. if (roiparam.RoiType == URMROIType.URMShell)
  294. {
  295. denresult.InMaxDensity *= denScaler;
  296. denresult.InMinDensity *= denScaler;
  297. denresult.InMeanDensity *= denScaler;
  298. denresult.InVarianceDensity *= (denScaler * denScaler);
  299. denresult.OutMaxDensity *= denScaler;
  300. denresult.OutMinDensity *= denScaler;
  301. denresult.OutMeanDensity *= denScaler;
  302. denresult.OutVarianceDensity *= (denScaler * denScaler);
  303. }
  304. result.DenMeasureResult = denresult;
  305. var velresult = new URMVelMeasureResult();
  306. PIA_CalVelMeasureResults(_handle, _URMVelMeasureImg.Start, width, height, roiparam, piexlScaler, ref velresult);
  307. velresult.MaxVel = (velresult.MaxVel * velScaler + _velMin);
  308. velresult.MinVel = (velresult.MinVel * velScaler + _velMin);
  309. velresult.MeanVel = (velresult.MeanVel * velScaler + _velMin);
  310. velresult.VarianceVel *= (velScaler * velScaler);
  311. if (roiparam.RoiType == URMROIType.URMShell)
  312. {
  313. velresult.InMaxVel = (velresult.InMaxVel * velScaler + _velMin);
  314. velresult.InMinVel = (velresult.InMinVel * velScaler + _velMin);
  315. velresult.InMeanVel = (velresult.InMeanVel * velScaler + _velMin);
  316. velresult.InVarianceVel *= (velScaler * velScaler);
  317. velresult.OutMaxVel = (velresult.OutMaxVel * velScaler + _velMin);
  318. velresult.OutMinVel = (velresult.OutMinVel * velScaler + _velMin);
  319. velresult.OutMeanVel = (velresult.OutMeanVel * velScaler + _velMin);
  320. velresult.OutVarianceVel *= (velScaler * velScaler);
  321. }
  322. result.VelMeasureResult = velresult;
  323. break;
  324. }
  325. }
  326. return result;
  327. }
  328. }
  329. }
  330. }