ImageCrop.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System;
  2. using System.Collections.Generic;
  3. using Emgu.CV;
  4. using Emgu.CV.Structure;
  5. using System.Drawing;
  6. using WingServerCommon.Log;
  7. using WingAIDiagnosisService.Carotid.CarotidInterFacesData;
  8. using WingAIDiagnosisService.Carotid.MathTools;
  9. using WingAIDiagnosisService.Carotid.Utilities.DetectIntima;
  10. using Vinno.vCloud.Common.Vid2;
  11. using Vinno.vCloud.Common.Vid2.Visuals;
  12. using System.Linq;
  13. namespace WingAIDiagnosisService.Carotid.Utilities
  14. {
  15. public class ImageCrop
  16. {
  17. //获取图像在物理坐标下的有效宽度(除去黑色背景区域)
  18. public static float GetPhysicalWidth(VinnoImage vinnoImage)
  19. {
  20. if (vinnoImage.Visuals.First() is Vinno2DVisual visual)
  21. {
  22. if (visual.PhysicalCoordinates.ContainsKey(VinnoVisualAreaType.Tissue))
  23. {
  24. var physicalCoordinate = visual.PhysicalCoordinates[VinnoVisualAreaType.Tissue];
  25. if (physicalCoordinate is VinnoTissuePhysicalCoordinate coordinate)
  26. return (float)(coordinate.Width);
  27. }
  28. }
  29. return 0;
  30. }
  31. //通过VID文件的属性计算图像在像素坐标下的有效区域的坐标
  32. public static ImageEdge CropImageByInfo(Mat mat, VinnoImage vinnoImage, float scanDepth)
  33. {
  34. //裁剪黑色背景之前图像的宽,像素单位
  35. int imgWidth0 = mat.Width;
  36. //图像的高,像素单位
  37. int imgHeight = mat.Height;
  38. ImageEdge edge = new ImageEdge(imgWidth0, imgHeight);
  39. //图像的宽,物理单位,厘米
  40. float physicalWidth = GetPhysicalWidth(vinnoImage);
  41. //单位像素的物理距离
  42. float cmPerPix = scanDepth / imgHeight;
  43. //裁剪黑色背景后图像的有效宽度,像素单位
  44. int imgWidth = (int) (physicalWidth / cmPerPix);
  45. edge.Left = (imgWidth0 - imgWidth) / 2;
  46. edge.Right = edge.Left + imgWidth;
  47. ///把裁剪后的图像宽度调整为 4的倍数
  48. ImageEdgeDetector.AdjustEdge(edge);
  49. //reset if not valid
  50. if (!edge.IsValid)
  51. {
  52. edge.Left = 0;
  53. edge.Right = mat.Width - 1;
  54. return edge;
  55. }
  56. return edge;
  57. }
  58. }
  59. }