12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 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;
- }
- }
- }
|