|
@@ -0,0 +1,64 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using Emgu.CV;
|
|
|
+using Emgu.CV.Structure;
|
|
|
+using System.Drawing;
|
|
|
+using WingServerCommon.Log;
|
|
|
+using WingAIDiagnosisService.Carotid.CarotidInterFacesData;
|
|
|
+using WingAIDiagnosisService.Carotid.MathTools;
|
|
|
+using WingAIDiagnosisService.Carotid.Utilities.DetectIntima;
|
|
|
+using Vinno.vCloud.Common.Vid2;
|
|
|
+using Vinno.vCloud.Common.Vid2.Visuals;
|
|
|
+using System.Linq;
|
|
|
+
|
|
|
+namespace WingAIDiagnosisService.Carotid.Utilities
|
|
|
+{
|
|
|
+ public class ImageCrop
|
|
|
+ {
|
|
|
+ //获取图像在物理坐标下的有效宽度(除去黑色背景区域)
|
|
|
+ public static float GetPhysicalWidth(VinnoImage vinnoImage)
|
|
|
+ {
|
|
|
+ if (vinnoImage.Visuals.First() is Vinno2DVisual visual)
|
|
|
+ {
|
|
|
+ if (visual.PhysicalCoordinates.ContainsKey(VinnoVisualAreaType.Tissue))
|
|
|
+ {
|
|
|
+ var physicalCoordinate = visual.PhysicalCoordinates[VinnoVisualAreaType.Tissue];
|
|
|
+ if (physicalCoordinate is VinnoTissuePhysicalCoordinate coordinate)
|
|
|
+ return (float)(coordinate.Width);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //通过VID文件的属性计算图像在像素坐标下的有效区域的坐标
|
|
|
+ public static ImageEdge CropImageByInfo(Mat mat, VinnoImage vinnoImage, float scanDepth)
|
|
|
+ {
|
|
|
+ //裁剪黑色背景之前图像的宽,像素单位
|
|
|
+ int imgWidth0 = mat.Width;
|
|
|
+ //图像的高,像素单位
|
|
|
+ int imgHeight = mat.Height;
|
|
|
+ ImageEdge edge = new ImageEdge(imgWidth0, imgHeight);
|
|
|
+ //图像的宽,物理单位,厘米
|
|
|
+ float physicalWidth = GetPhysicalWidth(vinnoImage);
|
|
|
+ //单位像素的物理距离
|
|
|
+ float cmPerPix = scanDepth / imgHeight;
|
|
|
+ //裁剪黑色背景后图像的有效宽度,像素单位
|
|
|
+ int imgWidth = (int) (physicalWidth / cmPerPix);
|
|
|
+ edge.Left = (imgWidth0 - imgWidth) / 2;
|
|
|
+ edge.Right = edge.Left + imgWidth;
|
|
|
+
|
|
|
+ ///把裁剪后的图像宽度调整为 4的倍数
|
|
|
+ ImageEdgeDetector.AdjustEdge(edge);
|
|
|
+ //reset if not valid
|
|
|
+ if (!edge.IsValid)
|
|
|
+ {
|
|
|
+ edge.Left = 0;
|
|
|
+ edge.Right = mat.Width - 1;
|
|
|
+ return edge;
|
|
|
+ }
|
|
|
+ return edge;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|