URMMeasureAlg.cs 20 KB

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